一、如何进行算法分析
算法分析指对一个算法需要的资源进行预测,其分析包括对一个算法的空间复杂度分析和时间复杂度分析。而随着硬件技术的飞速发展和成本的降低,我们更加关注算法在时间上的表现。
比较直观的做法是通过算法执行的时间来度量一个算法的时间上的效率。但这与执行算法的硬件和运行时的情境关系很大,不同机器、不同状态下的同一算法的运行时间都可能不同,所以这种算法是不科学的。
一个算法所需的时间应当是随着其输入规模增长的,而输入规模与特定具体问题有关。对大多数问题来说其最自然的度量就是输入中的元素个数。
算法的运行时间是指在特定输入时所执行的基本操作数。我们可以得到关于一个关于输入规模n的所需时间的函数。
然而可以进一步简化算法的时间分析,我们进行进一步抽象,首先,忽略每条语句的真实代价,通过运行时间的增长率来度量一个算法在时间方面的表现。我们只考虑公式的最高次项,并忽略它的常数系数。
通常,有三种情况的分析:
(1)最坏情况分析:这个是最常用的。通常我们想知道一个算法最糟能糟到什么情况,以此来分辨一个算法的好坏。对于升序排序算法,最糟糕的输入便是降序排列的数列。
(2)平均情况分析:这个也常用到。输入规模n下的期望时间。
(3)最好情况分析:比较少遇到。对于一个排序算法最好的情况无非输入已是排好序的。
二、要用到的渐近记号
所有记号都表示一切满足条件的函数的集合。
1、Θ记号 Θ(g(n)) = { f(n) : 若存在正常数c1,c2和n0,使对所有n>=n0时有0<=c1*g(n)<=f(n)<=c2*g(n)}
其效果相当于删除f(n)中的低阶项,并忽略最高阶项的系数。
2、Ο记号 Ο(g(n)) = { f(n) : 存在正常数c和n0,使对所有n>=n0,有0<=f(n)<=c*g(n) }
Ο记号在一个常数因子内给出某函数的一个上界。f(n) = Ο(g(n))表示f(n)是集合O(g(n))的一个元素。f(n) = Θ(g(n))隐含着f(n) = Ο(g(n)),因为Θ记号强于Ο记号。对f(n) = Ο(g(n))只能说明g(n)的某个常数倍是f(n)的渐近上界,而不反映该上界如何接近。Ο记号在用作对算法最坏情况运行时间的上界时就有对任意输入的运行时间的上界。
3、Ω记号 Ω(g(n)) = { f(n) : 存在正常数c和n0,使所有n>=n0有0<=c*g(n)<=f(n) }
Ω记号给出一个函数的渐近下界。
对于上面三种,有下面的定理:
对任意两个函数f(n)和g(n),f(n) = Θ(g(n))当且仅当f(n) = Ο(g(n))和f(n) = Ω(g(n)).
4、其它符号
ο记号:Ο记号提供的渐近上界可能是也可能不是渐近紧确的。2n^2 = Ο(n^2)是渐近紧确的,而2n = O(n^2)不是。而o记号用来表示非渐近紧确的。 o(g(n)) = { f(n) : 对任意正常数c,存在正常数n0,使对所有n>=n0,有0<=f(n)<=c*g(n) }
ω记号:ω记号与Ω记号的关系和o记号与Ο记号的关系一样,不在多说。
总之,可以这样理解,Θ记号相当于"=",Ο相当于“<=",Ω相当于”>=",o相当于“<",ω相当于">".这样理解只用于区别不同渐近记号间的关系,其实每个渐近记号为一个函数集合,而非两个数关系那样的。
分享到:
相关推荐
算法学习笔记Learn-Algorithms__nonstriater,,。 。
统计学习方法笔记-基于Python算法实现。统计学习方法笔记-基于Python算法实现 所有代码均可直接运行。统计学习方法笔记-基于Python算法实现。统计学习方法笔记-基于Python算法实现 所有代码均可直接运行。统计学习...
2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-...
学习笔记-双指针算法-位运算-离散化-区间合并
蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯算法学习笔记C++B组蓝桥杯...
Python学习笔记--皮大庆
Java版本算法练习+笔记总结 按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构进行系统的练习 每道题都有标号和题目链接.zip
《算法笔记和算法笔记-上机训练实战指南整套-胡凡》是一份全面的算法学习资源,由胡凡编著,旨在帮助学习者深入理解和掌握计算机算法。这份资料包括了两部分:《算法笔记》和《算法笔记-上机训练实战指南》,两者...
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
数据结构与算法分析学习笔记数据结构与算法分析学习笔记数据结构与算法分析学习笔记数据结构与算法分析学习笔记数据结构与算法分析学习笔记
caffe学习笔记1-7-完整版-薛开宇
DEAP库学习笔记
【cpp-算法学习笔记】是一份专注于C++编程语言的算法学习资源,旨在帮助开发者深入理解和掌握各种基础及高级算法。这份笔记包含了丰富的实例、解释和练习,是C/C++开发人员提升算法技能的理想教材。在C++这个强大的...
根据提供的文件信息,我们可以推断出这是一本关于算法学习与实践的书籍——《算法笔记-上机训练实战指南》的完整版。本书由胡凡编写,共有442页,旨在为读者提供全面深入的算法知识以及丰富的上机练习案例。接下来,...
dojo学习笔记(二) dojo.lang.array & dojo.lang.func & dojo.string.extras dojo学习笔记(六)- ContentPane dojo学习笔记(四) dojo的拖拽示例以及疑问! 介绍dojo事件 使用 Dojo 工具包和 JSON-RPC 构建...
根据提供的文件信息,本文将对《算法笔记-上机训练实战指南》这本书进行详细的知识点梳理,主要包括但不限于:算法基础知识、数据结构应用、经典算法详解、编程实践技巧等内容。 ### 一、算法基础知识 #### 1.1 ...
dojo学习笔记(二) dojo.lang.array & dojo.lang.func & dojo.string.extras dojo学习笔记(六)- ContentPane dojo学习笔记(四) dojo的拖拽示例以及疑问! 介绍dojo事件 使用 Dojo 工具包和 JSON-RPC 构建...