这篇博文主要会讲述基础的算法分析,对于算法分析主要是针对算法运行时间进行分析。

几个需要注意的读法:Omega(Ω),Theta(Θ)和大O符号。

一、算法分析 - 最坏情况分析法

算法分析其实主要针对两方面,但是平时更多地所讲的一个算法的好坏通常是通过算法运行时间来衡量,如若一个算法运行时间短,则说明这个这个算法的针对某个问题的执行效率不错,反之则说明算法较为低效。前面所说的算法针对运行时间衡量结果大部分指的更多是是效率问题,好坏非一个绝对的标准,针对不同问题,算法执行的时间也不同,并无法绝对说这个算法好还是那个算法好,基本要从实际出发。一般而言,我们所期望的是随着输入数量(input size: N)的成倍增长,算法运行效率应当仅慢常数因子c(constant factor c)。而我们在分析算法时很多时候用的是最坏情况分析法(Worst-case Analysis),亦称最坏情况运行时间(Worst-case Running Time)。而一个算法是有效率的(efficient)如果它的运行时间是多项式时间,也就是说针对某一个问题的算法运行时间不大于问题大小的多项式倍数。下图是不同算法随着输入大小的增加所需要运行时间:

二、渐近增长阶

假设算法的最坏情况运行时间我们记作T(n),这里有另外一个函数f(n),如果存在下述的三种情况,我们则称之为上界、下界和既是上界也是下界。

渐近上界:如果存在一个常数c > 0和n0 > 0以至于所有n > n0 都有T(n) < c · f(n),我们则称之为T(n)是O(f(n)),f(n)为T(n)的上界。

举个例子:假设我们有一个算法的运行时间为T(n) = pn2 + qn + r,这里的p、q和r都是大于0的数,那么如果我想说这个函数是服从O(n2)的话,则可以写成T(n) = pn2 + qn + r ≤ pn2 + qn2 + rn2 ≤ (p + q + r) · n2 ,这个则符合上述定义。因此我们称T(n)是O(n2) 。

渐近下界:反之,对于任意大的输入,如果存在一个函数f(n)致使T(n) ≥ ε · f(n)(亦称之为Ω(f(n))),我们则称之为渐近下界。

举个例子:T(n) = pn2 + qn + r ≥ pn2 ≥ pn(p = ε),所以T(n)是Ω(n),也就是f(n) = n是T(n)的下界。

既是上界也是下界:从上面两个式子我们可以看出f(n) = n2 是T(n)的上界也是下界,我们称之为Θ(n2)。

三、例子

这里主要列举几个算法来表述不同的运行时间。

3.1 线性时间(linear time)

线性时间指的是算法的运行时间最多为一个常数因子乘于输入的大小,最常用来表示的一个算法就是查找一个数列中的最大数及合并两个已经排好序的数列,这里仅展示伪代码,因为实现都较为简单,可以尝试用自己喜欢的语言复现。

# 寻找最大数
max <- a1
for i = 2 to n:if ai > max:max = ai# 合并两个排好序的数
i = 1, j = 1
final_output = []
while (both list are not empty):if ai <= bj:final_output.append(ai)i += 1else:final_output.append(bj)j += 1
final_output.append(remainder of the nonempty list)

3.2 对数时间(n log (n)) - 归并排序(此处是Python代码实现)

def MergeSort(lst):if len(lst) == 1:return lsthalf_length = len(lst) // 2left_lst = MergeSort(lst[:half_length])right_lst = MergeSort(lst[half_length:])return Merge(left_lst, right_lst)def Merge(left_lst, right_lst):"""Merge Function for Merge Sort"""l_index, r_index = 0, 0lst = []while l_index < len(left_lst) and r_index < len(right_lst):if left_lst[l_index] < right_lst[r_index]:lst.append(left_lst[l_index])l_index = l_index + 1else:lst.append(right_lst[r_index])r_index = r_index + 1lst = lst + left_lst[l_index:]lst = lst + right_lst[r_index:]return lst 

还有关于O(n2)、O(n3)等其他的运行时间的例子,此处就不一一举例,有兴趣的朋友可以参考下面的列出的书籍并按照自己喜欢的编程语言实现一遍。

如若有哪里讲的不对或者读者有更好的建议,欢迎指出,非常感谢!

参考:

《算法设计》,Jon Kleinberg / Éva Tardos,清华大学出版社,2007。

转载于:https://www.cnblogs.com/jielongAI/p/9562904.html

算法分析 - 学习笔记相关推荐

  1. 《数据结构与算法分析》学习笔记(二)——算法分析

    一.对算法分析方法的最简单的理解和使用方法 1.首先大家可能一般会被那些数学的概念搞晕,其实简单理解下来,就是假设任何语句执行的效率都是一样的,所以设定每一个语句的执行时间都是一个时间单位,那么只要计 ...

  2. 堆排序怎么建立初始堆_学习笔记-详解堆排序

    本文目的 上一章节已经详细的向大家介绍过排序的相关概念(详见学习笔记-排序简单介绍) ,本文旨在为大家详细的介绍堆排序. 堆排序 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序 ...

  3. 0.0 Introduction-机器学习笔记-斯坦福吴恩达教授

    斯坦福学习笔记 本书为斯坦福吴恩达教授的在 coursera 上的机器学习公开课的知识笔记,涵盖了大部分课上涉及到的知识点和内容,因为篇幅有限,部分公式的推导没有记录在案,但推荐大家还是在草稿本上演算 ...

  4. c++ 冒泡排序_学习笔记-详解冒泡排序

    本文目的 上一章节已经详细的向大家介绍过排序的相关概念学习笔记-排序简单介绍,本文旨在为大家详细的介绍冒泡排序. 冒泡排序 冒泡排序(Bubble Sort),是一种较简单的排序算法,是一种交换类排序 ...

  5. Python数据结构学习笔记——链表:无序链表和有序链表

    目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...

  6. Python数据结构学习笔记——队列和双端队列

    目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...

  7. Python数据结构学习笔记——栈

    目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...

  8. 计算机网络学习笔记(六)——网络层、虚电路和数据报交换、路由(距离矢量、链路状态算法)、IP编址、网络拥塞控制、网络互联

    文章目录 前言 概念 一.网络层相关概述 (一)三大核心功能 (二)通信两大阵营 二.交换技术 (一)交换技术的分类 (二)电路交换和分组交换 (三)虚电路与数据报 三.路由 (一)路由功能概述 (二 ...

  9. Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示

    Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示 zouxy09@qq.com http://blog.csdn.net/zouxy09 我的Kinect开发平台是: Win7 x86 ...

  10. Algorithms学习笔记-第一章 基础

    #第一章 基础 标签(空格分隔): Algorithms学习笔记 文章目录 @[toc] 1.1 基础编程模型 1.1.1-1.1.8 主要是简述基本的java语法与概念 1.1.9 讲解了本书中自行 ...

最新文章

  1. 详解:Camera-IMU内外参标定原理
  2. 敏捷原则比敏捷框架更重要
  3. python合并列表并按升序排序_在python中按升序合并两个排序的链接列表:单链接列表指针更新问题...
  4. Linux ln命令、软链接和硬链接的区别
  5. 架构的“一小步”,业务的一大步 1
  6. (10)<label>标签的用途
  7. 傅立叶:你让我如何理解你?
  8. ibm的服务器怎么重装系统,ibm服务器系统安装的具体教程
  9. 离散数学及其应用傅彦pdf_离散数学及其应用 傅彦 等 高等教育出版社
  10. 使用“VMware ThinApp”绿化软件
  11. 使用Layered分层窗口实现视频会议中的桌面区域共享
  12. 有理数加法C语言pta,有理数
  13. 电脑格式化之后如何进行数据恢复【图文教程】
  14. php可以开发大型网站吗?其实这个问题不用回答
  15. FlashFXP命令行
  16. 曾经拥有VS天长地久
  17. 设计模式 — 抽象工厂模式
  18. 微信开发系列 — — 微信模板消息
  19. 逻辑代数的基本公式和常用公式基本定理
  20. node.js里的天龙八部

热门文章

  1. javap -c命令详解
  2. UTM 用户线程模型
  3. Python学习笔记8—Python函数
  4. angular学习资源
  5. sqlplus下无法shutdown情况下不妨试试crsctl stop crs
  6. 阿里的dubbo 到底是用来干嘛的?
  7. 美团一面:两个有序的数组,如何高效合并成一个有序数组?
  8. 我一个普通程序员,光靠GitHub打赏就年入70万,其实你也可以
  9. 百度以侵犯商业秘密起诉前高管王劲 索赔5000万 内附王劲离职承诺函
  10. 掌握好这几点方法学习Linux,一定比别人更快入门运维!