Final-v2

news2024/11/22 5:53:17

算法的定义和特征

什么是算法?
算法是求解某一特定问题的一组有穷规则的集合,它是由若干条指令组成的有穷符号串。

算法的五个重要特性:

  • 确定性:每一条指令都必须有确切的含义。不存在二义性,只有一个入口和出口。
  • 可实现性:算法可以通过已经实现的基本运行指令有限次来实现。
  • 输入:有另个或多个输入,取自于某个特定对象的集合。
  • 输出:有一个或多个输出,输出与输入有某些特定关系。
  • 有穷性:一个算法必须在执行有穷步后结束,且每一步都在有穷时间内完成。

算法设计的质量指标:

  • 正确性
  • 可读性
  • 健壮性
  • 效率与存储量

算法和程序的区别

程序:对一个算法使用某种程序设计语言的具体实现。
算法的有穷性意味着不是所有的计算机程序都是算法。

算法复杂性

=算法所需要的计算机资源=时间复杂性+空间复杂性
一般情况下只考虑三种情况的时间复杂性:最坏情况、最好情况和平均情况。

算法分类(计算时间)

多项式时间算法:可用多项式对其计算时间限界的算法。
O(1) < O(log n) < O(n) < O(nlog n) < O(n2)
指数时间算法:计算时间用指数函数限界的算法。
O(2n) < O(n!) < O(nn)

当n取值较大时,指数时间算法和多项式时间算法在计算时间上非常悬殊。

最优算法

问题的计算时间下界为Ω(f(n)),则计算时间复杂性为O(f(n))的算法是最优算法。
例如,排序问题的计算时间下界为Ω(nlogn),计算时间复杂性为O(nlogn)的排序算法是最优算法。

递归的分类

  • 基于归纳法的递归
  • 基于分治法的递归

Fibonacci数列

无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:
在这里插入图片描述

int fibonacci(int n){
	if(n <= 1){
		return 1;
	}
	return fibonacci(n-1)+fibonacci(n-2);
}

递归优缺点

  • 优点:结构清晰,可读性强,且容易用数学归纳法证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
  • 缺点:递归算法的运行效率低,无论是耗费的计算时间还是占用的存储空间都比非递归算法多。

分治法思想

将一个难以解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治法的适用条件

  • 该问题的规模缩小到一定的程序就可以容易地解决。
  • 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
  • 利用该问题分解出的子问题的解可以合并为该问题的解。
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

分治法的复杂性分析

分治法将规模为n的问题分成k个规模为n/k的子问题去解。设分解阈值为1,解规模为1的问题耗费1个单位时间。再设分解与合并的时间需要f(n)个单位时间,则:
在这里插入图片描述

Master定理(递归复杂度判定定理)

在这里插入图片描述

二分搜索技术

已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。

int binarySearch(int a[],int x,int l,int r){
	while(l <= r){
		int index = (l+r)/2;
		if(a[index] == x){
			return index;
		}else if(a[index] < x){
			l = index + 1;
		}else{
			r = index - 1;
		}
	}
	return -1;
}

算法复杂度分析:每执行一次算法的while循环,待搜索数组的大小减少一半。因此,在最坏情况下,while循环被执行了O(log n)次,循环体内运算需要O(1)时间,因此整个算法在最坏情况下的计算时间复杂性为O(log n)。

合并排序

将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

void mergeSort(int a[],int left,int right){
	//至少有2个元素才能进行合并
	if(left < right){
		int mid = (left + right)/2;
		mergeSort(a,left,mid);
		mergeSort(a,mid+1,right);
		merge(a,b,left,mid,right); //合并到数组B
		copy(a,b,left,right); //复制回数组A
	}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的考研资讯平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

2023智源大会议程公开丨视觉与多模态大模型论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请AI领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主Ge…

元组的学习笔记

列表 [] 单身什么是字典 {} 二人世界 python内置的数据结构之一&#xff0c;与列表一样是一个可变序列(可以增删改操作的) 以键值对的方式存储数据&#xff0c;字典是一个无序的序列 -> hash(key) 通过哈希函数来计算存储位置,key一定是不可变的字典的创建 使用花…

国内免费的ChatGPT镜像网址(ChatGPT国内镜像网站大盘点)

ChatGPT 以其强大的信息整合和对话能力惊艳了全球&#xff0c;在自然语言处理上面表现出了惊人的能力。这么强大的工具我们都想体验一下&#xff0c;那么今天就分享几个ChatGPT国内的镜像网址&#xff0c;大家可以直接使用&#xff01; 1.AiChat 网址入口 多角色多功能可玩性高…

IIC协议——OLED屏幕

1.IIC协议介绍 IIC全称Inter-Integrated Circuit (集成电路总线) 简称I2C 是由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。IIC属于半双工同步通信方式 特点 简单性和有效性 由于接口直接在组件之上&#xff0c;因此IIC总线占用的空…

超好用万能提示词框架,ChatGPT效率翻三倍!

前几天写了几篇自己的AI实践&#xff1a; 《程序员&#xff0c;如何借力ChatGPT&#xff1f;》 《普通人&#xff0c;如何借力ChatGPT&#xff1f;》 《我认为&#xff0c;最好用的AI工具是它》 《如何借力AI工具做PPT》 很多朋友在后台留言&#xff0c;问我应该如何写高质量的…

云原生Docker网络管理

Docker网络 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c; Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是每个容器的默认网关。 …

redis整合通过QQ邮箱发送验证码

目录 1.QQ开启服务 2.java中配置 2.1.导入依赖 2.2.yml配置 2.2.1 mail配置 2.2.2 redis配置&#xff08;与mail同级&#xff0c;在spring下一级&#xff09; 2.3.conroller层 2.3.1 在controller类上加上 2.3.2 生成验证码方法 2.3.3发送邮件接口 2.3.4 用户登录接口&…

【事件驱动微服务架构】专家组:事件驱动的大规模架构

赖斯&#xff1a;欢迎来到我们关于架构的专题小组&#xff0c;你们一直想知道轨道。该专题小组称为事件驱动的大规模架构。当您思考事件驱动架构时&#xff0c;您会想到什么&#xff1f;这是规模、性能和灵活性的好处吗&#xff1f;也许你想到了一个你可能经历过的特殊问题。也…

Web Audio API实现简单变声效果

前言 想在网页中实现实时音频变声效果该如何实现呢&#xff0c;之前遇到这种处理音视频的需求&#xff0c;可能会想到需要借助C代码实现。但是现在随着浏览器性能的提升、web API的丰富&#xff0c;通过浏览器原生的API也可以操作音频数据实现很多复杂的效果&#xff0c;为web音…

mitt用100行实现发布-订阅模式还收获了9k的Star

我们先了解什么是发布-订阅模式&#xff0c;发布-订阅模式它是一种对象间一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖它的对象都将得到状态的通知。 发布-订阅模式流程如下&#xff1a; 订阅者将自己想订阅的事件注册到调度中心&#xff1b;…

快手 Flink 的稳定性和功能性扩展

摘要&#xff1a;本文整理自快手技术专家刘建刚&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 快手 Flink 平台 2. 稳定性保障和智能运维 3. 复杂场景下的功能扩展 4. 批处理的定制优化 Tips&#xff1a;点击「阅读原文…

maven添加指定仓库和镜像

maven历史版本下载地址&#xff1a;https://archive.apache.org/dist/maven/maven-3/ maven版本和java版本的关系&#xff1a;https://maven.apache.org/docs/history.html 项目中添加仓库 有两种方式 1.在pom.xml中添加&#xff08;优先级高&#xff09; 2.在setting.xml中添…

【已解决】-Mac/Mac mini/Macbook上修改鼠标指针大小

问题&#xff1a; MacOS默认的鼠标指针太小了&#xff0c;平时很容易找不到在哪里。 解决办法&#xff1a; 在 Mac 上&#xff0c;点击苹果菜单 >“系统偏好设置”&#xff0c;然后点按“辅助功能” 。 点击“显示”&#xff0c;然后点击“指针”。 设定以下任一选项…

【SQL】Oracle实现远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

CDN和Web加速器之间的区别

在数字时代&#xff0c;网站、社交媒体、电子商务、内容流平台和超个性化网络体验激增。因此&#xff0c;需要实时可靠地为最终用户提供大量生成的内容&#xff0c;而不会出现延迟或崩溃&#xff0c;无论其位置、网络、设备或浏览器如何。为此&#xff0c;使用CDN和web加速器就…

【模电实验】运算放大器构成的温度闭环控制系统的研究

运算放大器构成的温度闭环控制系统的研究 —、实验目的 设计并连接运算放大器构成的温度闭环控制系统&#xff0c;测量并调试该闭环控制系统&#xff0c;初步形成闭环控制的概念。 二、温度闭环控制系统的工作原理 图1所示为温度闭环控制系统框图&#xff0c;各部分工作原理…

vue3中setup语法糖那些事儿

vue3中setup语法糖那些事儿 什么是语法糖&#xff1f;vue3相比于vue2有什么新的语法糖?refreactivewatch生命周期Teleport setup语法糖<script setup>与传统vue3有何不同传统vue3和setup语法糖&#xff0c;两者之间写法如何转换&#xff1f; 什么是语法糖&#xff1f; …

NodeJs性能分析工具

&#xff08;头等人&#xff0c;有本事&#xff0c;没脾气&#xff1b;二等人&#xff0c;有本事&#xff0c;有脾气&#xff1b;末等人&#xff0c;没本事&#xff0c;大脾气。——南怀瑾&#xff09; NodeJs内存分析的必要性 回顾过去&#xff0c;我们排查web应用问题的途径…

EasyRecovery16计算机电脑硬盘格式化数据恢复软件

EasyRecovery16是一款综合性的数据恢复工具&#xff0c;软件具备非常成熟的算法&#xff0c;适用于多种数据丢失情况&#xff0c;可以帮助用户快速恢复不同介质丢失的数据。easyrcovery软件共有三种版本&#xff0c;分别为个人版、专业版、企业版。这三种版本的软件都可以免费使…