【计算理论】计算复杂性 ( 小 O 记号 | 严格渐进上界 | 分析算法的时间复杂度 )

举报
韩曙亮 发表于 2022/01/10 23:53:04 2022/01/10
【摘要】 文章目录 一、小 O 记号 ( 严格渐进上界 )二、分析算法的时间复杂度 一、小 O 记号 ( 严格渐进上界 ) 如果 ...





一、小 O 记号 ( 严格渐进上界 )



如果 g ( n ) \rm g(n) g(n) f ( n ) \rm f(n) f(n) 渐进上界 , 符号化表示为 f ( n ) = O ( g ( n ) ) \rm f(n) = O(g(n)) f(n)=O(g(n)) ,

如果 f ( n ) \rm f(n) f(n) 除以 g ( n ) \rm g(n) g(n) , 求 n → ∞ n \to \infty n 极限为 0 0 0 时 , 符号化表示为 l i m n → ∞ f ( n ) g ( n ) = 0 \rm lim_{n \to \infty} \cfrac{f(n)}{g(n)} = 0 limng(n)f(n)=0 ,

那么称 g ( n ) \rm g(n) g(n) f ( n ) \rm f(n) f(n)严格渐进上界 ;


严格渐进上界使用 小 o \rm o o 记号 表示 :

n = o ( n ) \rm \sqrt{n} = o(n) n =o(n)

n = o ( n   l o g   l o g   n ) \rm n = o(n\ log\ log \ n) n=o(n log log n)

n   l o g   l o g   n = o ( n   l o g   n ) \rm n\ log\ log \ n = o(n\ log \ n) n log log n=o(n log n)

n   l o g   n = o ( n 2 ) \rm n\ log \ n = o(n ^2) n log n=o(n2)

n 2 = o ( n 3 ) \rm n ^2 = o(n ^3) n2=o(n3)





二、分析算法的时间复杂度



构造图灵机认识如下语言 : A = { 0 k 1 k : k ≥ 0 } \rm A = \{ 0^k1^k : k \geq 0 \} A={0k1k:k0}

M 1 = \rm M_1 = M1= "在长度为 n \rm n n 的字符串 w \rm w w 上进行如下计算 :

① 扫描整个带子上的字符串 , 查看 0 0 0 1 1 1 的顺序 , 所有的 0 0 0 必须在所有的 1 1 1 前面 ; 如果顺序错误 , 进入拒绝状态 ;

② 扫描整个带子 , 遇到一个 0 0 0 , 就划掉一个 1 1 1 ; 如果带子上存在 0 0 0 1 1 1 , 该操作重复进行 ;

③ 如果最后只剩下 0 0 0 或只剩下 1 1 1 , 说明 两个数字的个数不等 , 进入拒绝状态 ; 如果最后带子上只剩下空白字符 , 说明两个数字个数相等 , 进入接受状态 ; "


分析上述算法的时间复杂度 :


字符串 w = " 0000 ⋯ 1111 ⋯ " \rm w = "0000 \cdots 1111 \cdots" w="00001111" , 整个 字符串长度为 n \rm n n ;

① 首先从左向右扫描一遍字符串 , 如果 0 0 0 出现在 1 1 1 右边 , 说明字符串不符合条件 , 检查的字符个数最坏的情况就是遍历 n \rm n n 次 , 使用 大 O \rm O O 标记 为 : O ( n ) \rm O(n) O(n) ;

② 扫描带子 , 读取到一个 0 0 0 , 划掉一个 1 1 1 , 然后在掉过头来 , 读取到一个 0 0 0 , 划掉一个 1 1 1 ;

这是一个循环 , 计算循环复杂度 , 只需要考虑 每次循环花费的时间 , 和 循环次数 ;

循环的次数最坏情况是 n 2 \rm \cfrac{n}{2} 2n , 还是 n \rm n n 的数量级 , 标记为 O ( n ) \rm O(n) O(n) ;

每次循环的花费时间步数 : 向右走 n 2 \rm \cfrac{n}{2} 2n 步 , 找到 1 1 1 字符 , 删除 1 1 1 字符后 , 然后再向左 n 2 \rm \cfrac{n}{2} 2n 步 回到第 0 0 0 个 , 大约是 n 2 \rm \cfrac{n}{2} 2n 步 , 数量级还是 n n n , 使用 大 O \rm O O 标记 为 : O ( n ) \rm O(n) O(n) ;

将上述 循环次数 和 每次循环步数 大 O \rm O O 标记 相乘 , 就是该阶段的 大 O \rm O O 标记 为 : O ( n ) × O ( n ) = O ( n 2 ) \rm O(n) \times O(n) = O(n^2) O(n)×O(n)=O(n2) ;


上述 ① 和 ② 总的 大 O \rm O O 标记 为 : O ( n ) + O ( n 2 ) = O ( n 2 ) \rm O(n) + O(n^2) = O(n^2) O(n)+O(n2)=O(n2)

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/111032302

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。