当前位置: 首页 > news >正文

【算法分析与设计】算法概述

目录

  • 一、学习要点
  • 二、算法的定义
  • 三、算法的性质
  • 四、程序(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等其他语言


七、算法分析的目的

  对算法所需要的两种计算机资源——时间和空间进行估算
  设计算法——设计出复杂性尽可能低的算法
  选择算法——在多种算法中选择其中复杂性最低者


八、算法复杂性分析

  算法复杂性是算法运行所需要的计算机资源的量,
  需要时间资源的量称为时间复杂性,需要的空间资源的量称为空间复杂性
  这个量应该只依赖于算法要解的问题的规模算法的输入算法本身的函数
  如果分别用NIA表示算法要解问题的规模算法的输入算法本身,而且用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)六、算法的描述七、算法分析的目的八、算法复杂性分析&#xff08;一&#xff09;算法时间复杂性分析&#xff08;二&#xff09;算法渐近复杂性1、渐进上界记号-大O符号2、渐进下…...

如何进一步全面提高项目估算精准度?

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

Git学习笔记4

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

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

成都睿趣科技:抖音开通橱窗带货需要钱吗

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

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…...

golang的实用工具

golang的实用工具 Go 语言提供了许多实用的工具&#xff0c;以下是其中一些常用的工具&#xff1a; 1. go run&#xff1a;用于直接运行 Go 源代码文件&#xff0c;无需显式编译。 2. go build&#xff1a;用于将 Go 代码编译成可执行文件或库。 3. go test&#xff1a;用于…...

图层混合模式(三)

差值模式 差值模式&#xff1a;查看每个通道的数值&#xff0c;用基色减去混合色或用混合色减去基色。具体取决于混合色与基色那个通道的数值更大。白色与任何颜色混合得到反相色&#xff0c;黑色与任何颜色混合颜色不变。 计算公式&#xff1a;结果色 绝对值&#xff08;混合…...

蓝牙核心规范(V5.4)10.6-BLE 入门笔记之L2CAP

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

【计算机网络】DNS原理介绍

文章目录 DNS提供的服务DNS的工作机理DNS查询过程DNS缓存 DNS记录和报文DNS记录DNS报文针对DNS服务的攻击 DNS提供的服务 DNS&#xff0c;即域名系统(Domain Name System) 提供的服务 一种实现从主机名到IP地址转换的目录服务&#xff0c;为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-高保真还原设计图

前端开发中还原设计图的重要性毋庸置疑&#xff0c;目前来说应用最多的应该也还是使用rem。然而很多人依然还是处于刀耕火种的时代&#xff0c;要么自己去计算rem值&#xff0c;要么依靠编辑器安装插件转换。 而本文的目标就是通过一系列的配置后&#xff0c;在开发中可以直接使…...

rman备份到远程服务器

rman备份到远程服务器磁盘 原因 业务数据量较大&#xff0c;数据库服务器上无足够地空间存放rman备份&#xff0c;磁盘扩容申请不批。无奈采取nfs远程备份 环境信息 ip操作系统备份目录远程备份服务器192.168.3.130Centos7.9rmanbak数据库服务器192.168.3.132:1521Centos7.…...

数据结构与算法

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

【Web3】DAO相关的基础知识

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

一文教你学会ArcGIS Pro地图设计与制图系列全流程(3)

ArcGIS Pro做的成果图及系列文章目录&#xff1a; 系列文章全集&#xff1a; 《一文教你学会ArcGIS Pro地图设计与制图系列全流程&#xff08;1&#xff09;》《一文教你学会ArcGIS Pro地图设计与制图系列全流程&#xff08;2&#xff09;》《一文教你学会ArcGIS Pro地图设计与…...

用于大规模 MIMO 检测的近似消息传递 (AMP)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

复杂SQL解析

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

js中哪些地方会用到window?

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

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...