【算法分析与设计】算法概述
目录
- 一、学习要点
- 二、算法的定义
- 三、算法的性质
- 四、程序(Program)
- 五、问题求解(Problem Solving)
- 六、算法的描述
- 七、算法分析的目的
- 八、算法复杂性分析
- (一)算法时间复杂性分析
- (二)算法渐近复杂性
- 1、渐进上界记号-大O符号
- 2、渐进下界记号-大Ω符号
- 3、紧渐进界记号-Θ符号
- 4、非紧上界记号o
- 5、非紧下界记号ω
- 6、渐近分析记号在等式和不等式中的意义
- 7、渐近分析中函数比较
- 8、渐近分析记号的若干性质
- (1)传递性
- (2)反身性
- (3)对称性
- (4)互对称性
- (5)算术运算
- 9、算法渐近复杂性分析中常用函数
- (1)单调函数
- (2)取整函数
- 取整函数的若干性质
- (3)多项式函数
- (4)指数函数
- (5)对数函数
- (6)阶乘函数
- 10、算法分析中常见的复杂性函数
- (1)小规模数据
- (2)中等规模数据
- (3)算法分析方法
- 九、算法分析的基本法则
- 1、非递归算法:
- (1)for / while 循环
- (2)嵌套循环
- (3)顺序语句
- (4)if-else语句
- 2、最优算法
数据结构+算法(+设计模式)=程序
一、学习要点
理解算法的概念。
掌握算法的计算复杂性概念。
掌握算法复杂性的渐近性态的数学表述。
了解NP类问题的基本概念。
二、算法的定义
顾名思义,计算(求解)的方法
算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。
算法是指解决问题的一种方法或一个过程。
程序设计=数据结构+算法(+设计模式)
三、算法的性质
算法是若干指令的有穷序列,满足性质:
(1)输入:有外部提供的量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令是清晰,无歧义的。
(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
四、程序(Program)
程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质。
例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。
五、问题求解(Problem Solving)
六、算法的描述
自然语言或表格
伪码方式
C++语言
Java语言
C语言
Python等其他语言
七、算法分析的目的
对算法所需要的两种计算机资源——时间和空间进行估算
设计算法——设计出复杂性尽可能低的算法
选择算法——在多种算法中选择其中复杂性最低者
八、算法复杂性分析
算法复杂性是算法运行所需要的计算机资源的量,
需要时间资源的量称为时间复杂性,需要的空间资源的量称为空间复杂性。
这个量应该只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。
如果分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身,而且用C表示复杂性,那么,应该有C=F(N,I,A)。
一般把时间复杂性和空间复杂性分开,并分别用T和S来表示,则有: T=T(N,I)和S=S(N,I)(通常,让A隐含在复杂性函数名当中)
(一)算法时间复杂性分析
最坏情况下的时间复杂性:
最好情况下的时间复杂性:
平均情况下的时间复杂性:
其中DN是规模为N的合法输入的集合;I* 是DN中使T(N, I*)达到Tmax(N)的合法输入; 是中使T(N, I*)达到Tmin(N)的合法输入;而P(I)是在算法的应用中出现输入I的概率。
(二)算法渐近复杂性
T(n) →∞ , 当 n→∞ ;
(T(n) - t(n) )/ T(n) →0 ,当 n→∞;
t(n)是T(n)的渐近性态,为算法的渐近复杂性。
在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低阶项留下的主项。它比T(n) 简单。
1、渐进上界记号-大O符号
若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≤c×f(n),则称T(n)=O(f(n))
2、渐进下界记号-大Ω符号
若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≥c×g(n),则称T(n)=Ω(g(n))
3、紧渐进界记号-Θ符号
若存在三个正的常数c1、c2和n0,对于任意n≥n0都有c1×f(n)≥T(n)≥c2×f(n),则称T(n)=Θ(f(n))
例: T(n)=5n2+8n+1
当n≥1时,5n2+8n+1≤5n2+8n+n=5n2+9n≤5n2+9n2≤14n2=O(n2)
当n≥1时,5n2+8n+1≥5n2=Ω(n2)
∴ 当n≥1时,14n2≥5n2+8n+1≥5n2
则:5n2+8n+1=Θ(n2)
定理:若T(n)=amnm +am-1nm-1 + … +a1n+a0(am>0),则有T(n)=O(nm)且T(n)=Ω(n m),因此,有T(n)=Θ(n m)。
4、非紧上界记号o
o(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有:0<f(n)<cg(n) }
等价于 f(n) / g(n) →0 ,当 n→∞。
5、非紧下界记号ω
ω(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n> n0有:0 ≤ cg(n) < f(n) }
等价于 f(n) / g(n) →∞ ,当 n→∞。
6、渐近分析记号在等式和不等式中的意义
f(n)= Θ(g(n))的确切意义是:f(n) ∈ Θ(g(n))。
一般情况下,等式和不等式中的渐近记号Θ(g(n))表示Θ(g(n))中的某个函数。
例如:2n2 + 3n + 1 = 2n2 + Θ(n) 表示
2n2 +3n +1=2n2 + f(n),其中f(n) 是Θ(n)中某个函数。
等式和不等式中渐近记号O,o, Ω和ω的意义是类似的。
7、渐近分析中函数比较
f(n)= O(g(n)) ≈ a ≤ b;
f(n)= Ω(g(n)) ≈ a ≥ b;
f(n)= Θ(g(n)) ≈ a = b;
f(n)= o(g(n)) ≈ a < b;
f(n)= ω(g(n)) ≈ a > b.
8、渐近分析记号的若干性质
(1)传递性
f(n)= Θ(g(n)), g(n)= Θ(h(n)) → f(n)= Θ(h(n));
f(n)= O(g(n)), g(n)= O (h(n)) → f(n)= O (h(n));
f(n)= Ω(g(n)), g(n)= Ω (h(n)) → f(n)= Ω(h(n));
f(n)= o(g(n)), g(n)= o(h(n)) → f(n)= o(h(n));
f(n)= ω(g(n)), g(n)= ω(h(n)) → f(n)= ω(h(n));
(2)反身性
f(n)= Θ(f(n));
f(n)= O(f(n));
f(n)= ω(f(n)).
(3)对称性
f(n)= Θ(g(n)) ⇔ g(n)= Θ (f(n)) .
(4)互对称性
f(n)= O(g(n)) ⇔ g(n)= Ω (f(n)) ;
f(n)= o(g(n)) ⇔ g(n)= ω (f(n)) ;
(5)算术运算
O(f(n))+O(g(n)) = O(max{f(n),g(n)}) ;
O(f(n))+O(g(n)) = O(f(n)+g(n)) ;
O(f(n))*O(g(n)) = O(f(n)*g(n)) ;
O(cf(n)) = O(f(n)) ;
g(n)= O(f(n)) → O(f(n))+O(g(n)) = O(f(n)) 。
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明:
对于任意f1(n) ∈ O(f(n)) ,存在正常数c1和自然数n1,使得对所有n≥ n1,有f1(n) ≤ c1f(n) 。
类似地,对于任意g1(n) ∈ O(g(n)) ,存在正常数c2和自然数n2,使得对所有n≥ n2,有g1(n) ≤ c2g(n) 。
令c3=max{c1, c2}, n3 =max{n1, n2},h(n)= max{f(n),g(n)} 。
则对所有的 n ≥ n3,有
f1(n) +g1(n) ≤ c1f(n) + c2g(n)
≤ c3f(n) + c3g(n)= c3(f(n) + g(n))
≤ c32 max{f(n),g(n)}
= 2c3h(n) = O(max{f(n),g(n)}) .
9、算法渐近复杂性分析中常用函数
(1)单调函数
单调递增:m ≤ n → f(m) ≤ f(n) ;
单调递减:m ≥ n → f(m) ≥ f(n);
严格单调递增:m < n → f(m) < f(n);
严格单调递减:m > n → f(m) > f(n).
(2)取整函数
⌊ x ⌋ :不大于x的最大整数;
⌈ x ⌉ :不小于x的最小整数。
取整函数的若干性质
x-1 < ⌊ x ⌋ ≤ x ≤ ⌈ x ⌉ < x+1;
⌊ n/2 ⌋ + ⌈ n/2 ⌉ = 整数n;
对于n ≥ 0,a,b>0,有:
⌈ ⌈ n/a ⌉ /b ⌉ = ⌈ n/ab ⌉ ;
⌊ ⌊ n/a ⌋ /b ⌋ = ⌊ n/ab ⌋ ;
⌈ a/b ⌉ ≤ (a+(b-1))/b;
⌊ a/b ⌋ ≥ (a-(b-1))/b;
f(x)= ⌊ x ⌋ , g(x)= ⌈ x ⌉ 为单调递增函数。
(3)多项式函数
p(n)= a0+a1n+a2n2+…+adnd; ad>0;
p(n) = Θ(nd);
f(n) = O(nk) ⇔ f(n)多项式有界;
f(n) = O(1) ⇔ f(n) ≤ c;
k ≥ d → p(n) = O(nk) ;
k ≤ d → p(n) = Ω(nk) ;
k > d → p(n) = o(nk) ;
k < d → p(n) = ω(nk) .
(4)指数函数
对于正整数m,n和实数a>0:
a0=1;
a1=a ;
a-1=1/a ;
(am)n = amn ;
(am)n = (an)m ;
aman = am+n ;
a>1 → an为单调递增函数;
a>1 →
→ nb = o(an)
(5)对数函数
log n = log2n;
lg n = log10n;
ln n = logen;
logkn = (log n)k;
log log n = log(log n);
for a>0,b>0,c>0
(6)阶乘函数
Stirling’s approximation
10、算法分析中常见的复杂性函数
(1)小规模数据
(2)中等规模数据
(3)算法分析方法
例:顺序搜索算法
template<class Type>
int seqSearch(Type *a, int n, Type k)
{for(int i=0;i<n;i++)if (a[i]==k) return i;return -1;
}
(1)Tmax(n) = max{ T(I) | size(I)=n }=O(n)
(2)Tmin(n) = min { T(I) | size(I)=n }=O(1)
(3)在平均情况下,假设:
(a) 搜索成功的概率为p ( 0 ≤ p ≤ 1 );
(b) 在数组的每个位置i ( 0 ≤ i < n )搜索成功的概率相同,均为 p/n。
九、算法分析的基本法则
1、非递归算法:
(1)for / while 循环
循环体内计算时间*循环次数;
(2)嵌套循环
循环体内计算时间*所有循环次数;
(3)顺序语句
各语句计算时间相加;
(4)if-else语句
if语句计算时间和else语句计算时间的较大者。
2、最优算法
问题的计算时间下界为Ω(f(n)),则计算时间复杂性为O(f(n))的算法是最优算法。
例如,排序问题的计算时间下界为Ω(nlogn),计算时间复杂性为O(nlogn)的排序算法是最优算法。
堆排序算法是最优算法。
相关文章:

【算法分析与设计】算法概述
目录 一、学习要点二、算法的定义三、算法的性质四、程序(Program)五、问题求解(Problem Solving)六、算法的描述七、算法分析的目的八、算法复杂性分析(一)算法时间复杂性分析(二)算法渐近复杂性1、渐进上界记号-大O符号2、渐进下…...

如何进一步全面提高项目估算精准度?
项目估算非常重要,这直接关系着项目的成本和收入,如果估算不准确,将为项目带来较大风险。一般软件规模可以用多种方式进行估算,但是用功能点估算方式更准确,而自动估算让估算更快速,我们以CoCode开发的估算…...

Git学习笔记4
GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私有仓库是需要付费的。 到Github上找类似的项目软件。 GitLab可以创建免费的私有仓库。 GitLab是利用 Ruby开发的一个开源的版本管理系统,实现一个…...

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

成都睿趣科技:抖音开通橱窗带货需要钱吗
随着社交媒体和电子商务的蓬勃发展,抖音作为一种流行的短视频平台,也推出了自己的“抖音橱窗”功能,让内容创作者能够通过视频展示和销售产品,从而实现商业化。那么,抖音橱窗带货是否需要费用呢? 首先,要开…...

中间件 - 分布式协调服务Zookeeper
目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…...
golang的实用工具
golang的实用工具 Go 语言提供了许多实用的工具,以下是其中一些常用的工具: 1. go run:用于直接运行 Go 源代码文件,无需显式编译。 2. go build:用于将 Go 代码编译成可执行文件或库。 3. go test:用于…...
图层混合模式(三)
差值模式 差值模式:查看每个通道的数值,用基色减去混合色或用混合色减去基色。具体取决于混合色与基色那个通道的数值更大。白色与任何颜色混合得到反相色,黑色与任何颜色混合颜色不变。 计算公式:结果色 绝对值(混合…...

蓝牙核心规范(V5.4)10.6-BLE 入门笔记之L2CAP
蓝牙篇之蓝牙核心规范(V5.4)深入详解汇总 1.概述 L2CAP负责协议复用、流量控制、服务数据单元(SDU)的分段和重组。它使用通道的概念来分隔在堆栈层之间传递的数据包序列。固定通道不需要设置,立即可用,并与特定的上层协议相关联。通道也可以通过指定的协议服务多路复用器…...

【计算机网络】DNS原理介绍
文章目录 DNS提供的服务DNS的工作机理DNS查询过程DNS缓存 DNS记录和报文DNS记录DNS报文针对DNS服务的攻击 DNS提供的服务 DNS,即域名系统(Domain Name System) 提供的服务 一种实现从主机名到IP地址转换的目录服务,为Internet上的用户应用程序以及其他…...

Docker的基础命令
目录 一、镜像操作 1、搜索镜像 2、下载镜像 3、查看镜像 3.1 查看下载到本地的所有镜像 3.2 查看单个镜像的详细信息 4、为镜像添加新的标签 5、镜像导出和导入到本地 5.1 镜像导出到本地 5.2 导入镜像 6、删除镜像 7、批量删除镜像 8、上传镜像 8.1 官网注册登录…...
提取项目依赖包的licenses
skywalking-eyes工具可以快速提取出licenses...
Vue项目自动转换px为rem-高保真还原设计图
前端开发中还原设计图的重要性毋庸置疑,目前来说应用最多的应该也还是使用rem。然而很多人依然还是处于刀耕火种的时代,要么自己去计算rem值,要么依靠编辑器安装插件转换。 而本文的目标就是通过一系列的配置后,在开发中可以直接使…...
rman备份到远程服务器
rman备份到远程服务器磁盘 原因 业务数据量较大,数据库服务器上无足够地空间存放rman备份,磁盘扩容申请不批。无奈采取nfs远程备份 环境信息 ip操作系统备份目录远程备份服务器192.168.3.130Centos7.9rmanbak数据库服务器192.168.3.132:1521Centos7.…...

数据结构与算法
目录 数据结构与算法 为什么要学习数据结构和算法? 常见的数据结构 常用算法 插入排序 一、概念及其介绍 二、适用说明 三、过程图示 希尔排序 一、概念及其介绍 二、适用说明 三、过程图示 归并排序 一、概念及其介绍 二、适用说明 三、过程图示 …...

【Web3】DAO相关的基础知识
这里写目录标题 DAO 的基础概念为什么需要 DAO?DAO 的种类 DAO 的运作方式知名 DAO 的介绍Bankless DAOSeeDAO DAO 的生态全景图分类治理框架DAO 的工具 DAO 众筹平台介绍 - JuiceBoxDAO 投票治理介绍 - SnapshotDAO 贡献 & 激励 - POAPDAO 信息管理 - NotionDA…...

一文教你学会ArcGIS Pro地图设计与制图系列全流程(3)
ArcGIS Pro做的成果图及系列文章目录: 系列文章全集: 《一文教你学会ArcGIS Pro地图设计与制图系列全流程(1)》《一文教你学会ArcGIS Pro地图设计与制图系列全流程(2)》《一文教你学会ArcGIS Pro地图设计与…...

用于大规模 MIMO 检测的近似消息传递 (AMP)(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

复杂SQL解析
文章目录 背景表SQL关键字分析具体Sql注意点补充:select的字段,也可以带有计算逻辑 背景表 1、sale_log as result: 主表,大部分字段都是取自这个表 2、sale_num as sale:需要从这个表获取真实销量sale_num字段 3、schedule as…...

js中哪些地方会用到window?
前言 Window 对象是JavaScript中的顶层对象,它代表了浏览器中打开的窗口或者标签页。浏览器中打开的每一个窗口/标签页都会有一个对应的 Window 对象。在浏览器中,全局作用域的 this 就是指向 Window 对象。 正文 在 JavaScript 中,window 对…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...