算法导论 第三章 函数的成长

渐近符号

Θ记号

Θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n>=n0,都有0<=c1g(n)<=f(n)<=c2g(n)}

重点:

1.f(n)是Θ(g(n))的成员,至于f(n)=Θ(g(n))这种写法的原因后面会知道

2.根据P26可知,g(n) 是f(n)的一个渐进紧确界

3.当n足够大的时候,f(n)非负

O符号

O(g(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=f(n)<=cg(n)}

重点:

1.Θ记号渐近地给出了函数的上限和下限。当只有一个渐近上界时,使用O记号

2.按照集合论的写法,Θ(g(n))是O(g(n))的子集

3.当我们说运行时间为O(n^2),意思是存在一个为O(n^2)的函数f(n),使得对于n的任意值,不管选择什么特定的规模为n的输入,其运行时间的上界都是f(n),最坏情况运行时间就是O(n^2)

Ω符号

Ω(g(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=cg(n)<=f(n)}

定理3.1 对于任意两个函数f(n)和g(n),我们有f(n)=Θ(g(n))且当f(n)=O(g(n))和f(n)=Ω(g(n))

等式与不等式的渐近符号

时间: 2024-10-10 12:05:12

算法导论 第三章 函数的成长的相关文章

算法导论 第三章 函数的增长

//参考博文:http://blog.csdn.net/so_geili/article/details/53353593 //1.渐近效率: A:指的是当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加 B:通常,渐近的表示某个算法对除很小的输入外的所有情况都将是最好的选择 //2.Θ记号的数学含义: A:方式一:设f(n)和g(n)是定义域为自然数集合的函数.如果limn→∞f(n)/g(n)存在,并且等于某个常数c(c>0) 那么f(n)=Θ(g(n)).通俗理解为

2018/11/29 算法时空(2) 算法导论第三章 函数的增长

渐进记号: O记号: 欧米茄记号: 注意: O记号是复杂度函数的上限, 欧米茄记号是复杂度函数的下限. 等式/不等式渐进记号: 极限的定义: 通过极限的方法, 来求复杂度函数. 当极限的值是一个大于零的函数的时候, 这说明法f(x)函数和g(x)函数的复杂度在一个数量级. 此时使用渐进符号. 此时可以使用大O记号表示渐进函数的上界, 使用欧米茄符号表示渐进函数的下界 如果极限的值等于零, 表示分母的函数增长的比分子的函数增长的更快, 此时引入小o记号, 表示g(x)的复杂度增长的非常的快, 远比

算法导论 第三章 and 第四章 python

第三章 渐进的基本O().... 常用函数 % 和  // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法):猜测一个(靠经验)--数学归纳法 ·2:递归树法:画树p31[第3版中文]p51->递归式--证明 3:主方法: 快速,有些地方不能涉及,递归式不易写出 4.1最大数组问题 分治法: 1.A[low ,mid]  2.A[mid+1, high] 3.包含mid中间(想左和右分别遍历组合找出最大)

算法导论 第13章 红黑树

二叉查找树的基本操作包括搜索.插入.删除.取最大和最小值等都能够在O(h)时间复杂度内实现,因此能在期望时间O(lgn)下实现,但是二叉查找树的平衡性在这些操作中并没有得到维护,因此其高度可能会变得很高,当其高度较高时,而二叉查找树的性能就未必比链表好了,所以二叉查找树的集合操作是期望时间O(lgn),最坏情况下为O(n). 红黑树也是一种二叉查找树,它拥有二叉查找树的性质,同时红黑树还有其它一些特殊性质,这使得红黑树的动态集合基本操作在最坏情况下也为O(lgn),红黑树通过给节点增加颜色和其它

算法导论 第6章 堆排序

堆数据结构实际上是一种数组对象,是以数组的形式存储的,但是它可以被视为一颗完全二叉树,因此又叫二叉堆.堆分为以下两种类型: 大顶堆:父结点的值不小于其子结点的值,堆顶元素最大 小顶堆:父结点的值不大于其子结点的值,堆顶元素最小 堆排序的时间复杂度跟合并排序一样,都是O(nlgn),但是合并排序不是原地排序(原地排序:在排序过程中,只有常数个元素是保存在数组以外的空间),合并排序的所有元素都被拷贝到另外的数组空间中去,而堆排序是一个原地排序算法. 1.在堆排序中,我们通常使用大顶堆来实现,由于堆在

算法导论 第6章 堆排序(简单选择排序、堆排序)

堆数据结构实际上是一种数组对象,是以数组的形式存储的,可是它能够被视为一颗全然二叉树,因此又叫二叉堆.堆分为下面两种类型: 大顶堆:父结点的值不小于其子结点的值,堆顶元素最大 小顶堆:父结点的值不大于其子结点的值,堆顶元素最小 堆排序的时间复杂度跟合并排序一样,都是O(nlgn),可是合并排序不是原地排序(原地排序:在排序过程中,仅仅有常数个元素是保存在数组以外的空间),合并排序的全部元素都被复制到另外的数组空间中去,而堆排序是一个原地排序算法. 1.在堆排序中,我们通常使用大顶堆来实现,因为堆

算法导论 第8章 线性时间排序

合并排序和堆排序的时间复杂度为O(nlgn),插入排序和冒泡排序的时间复杂度为O(n^2),快速排序的时间复杂度在平均情况下是O(nlgn),这些排序算法都是通过对元素进行相互比较从而确定顺序的,因此都叫比较排序. 比较排序可以看做是决策树(一个满二叉树),因为每一次比较都是一个分支.n个元素的序列,其排序的结果有 n! 种可能(n个元素的全排),所以这个决策树有 n! 个叶子结点,假设树的高度为h,则有:n! <= 2^h,所以h >= lg(n!) = Ω(nlgn).一次比较排序就是从决

算法导论 第9章 中位数和顺序统计学

/* * 算法导论 第九章 中位数和顺序统计学 * 线性时间选择元素 */ #include <iostream> #include <ctime> using namespace std; int minimum(int *arr, int len); int randomizedSelect(int *arr, int p, int r, int i); int randomizedPartition(int *arr, int p, int r); void exchange

算法导论 第2章

本章主要是算法知识的基础讲解,介绍了循环不变式,几个简单的排序算法,递归分治算法等内容. 1.循环不变式 循环不变式主要用来说明算法的正确性,那么什么是循环不变式呢,其实就是在循环过程中,一些元素数据必须保持的一些性质,例如在插入排序中,数组为A,必须保证三个性质: (1) 初始化:在循环开始之前,循环不变式是成立的,即:A[0]是有序的,A[1...n-1]是无序的. (2) 保持:在循环的某一次迭代开始之前,循环不变式是成立的,那么在此次迭代结束后依然应该是成立的,即:A[0...i]是有序