逻辑结构指的是:数据元素之间的逻辑结构,并非是数据元素的内部数据项之间的关系
如果数据元素保持一致,那么查找时可以使用折半查找是错的:原因是:这跟数据的存储方式有关,如果是链式存储,那么不能采用折半查找,必须是有序的顺序表才可以进行折半查找
int
foo(
int
n){
if
(n <=
1
)
return
1
;
return
n * foo(n -
1
);
}
上面的程序的时间复杂度为 O(n)
一目了然看出来 最好和最坏时间复杂度相同的排序算法是不受初始序列影响的
关于折半查找的一些题目:
一个算法的基本特征:
有穷性 确切性 输入项 输出项 可行性 正确性 健壮性
一个好的算法的基本特征:
健壮性 无二义性 可读性好的
根据分析递归方程分析算法的时间复杂度
T(n) = a * T(n/b) + f(n)
a ³ 1,b > 1,f(n)一般是个简单函数
两种方法来计算时间复杂度:
第一种就是:
一是用递归树,逐层代入原式,最终形成一个级数,然后用一个函数来表达,得到T(n)。
第二种就是:
应用主项定理:主项定理也就是对递归树方法的一种归纳,形成了固定的计算方式,并分三种情形来计算。
这三种情形主要是比较 nlogba 与 f(n),为什么要比较这两个函数呢?
观察原式,可以看出,nlogba其实相当于用递归树方法解出的递归方程的右侧的第一项,
而f(n)则是递归方程的右侧的第二项,这样,主项定理实际上是在比较组成结果的两个函数项,
而且这种比较是按照数量级(或者说是变化幅度)来比较的,也就是说,如2n 与 28n是
数量级(变化幅度)相当的。
这样有三种情况:
-
f(n) < nlogba
也就是 f(n) = O(nlogba - e ) ,e > 0为任意小的常数
或者说,f(n) 比 nlogba变化的慢,慢ne
那么,T(n) Î Q (nlogba) -
f(n) > nlogba
也就是 f(n) = W(nlogba +e ) ,e > 0为任意小的常数
或者说,f(n) 比 nlogba变化的快,快ne
那么, T(n) Î Q(f(n))可以简单地说,递归方程的右侧的两项,哪项变化的块,T(n)就属于哪项的数量级
-
f(n) = nlogba
也就是两项的数量级相当,就给这个数量级乘上一个lg n
T(n) Î Q(nlogba * lg n)
深度优先遍历:如果一个顶点被访问了两次 说明有向图中有环
拓扑排序:用于判断是否有环的方法
常用算法的比较:
排序方法 比较次数 移动次数 稳定性 辅助空间
最好 最差 最好 最差 最好 最差
冒泡排序 n n^2 0 n^2 是 1 1
快速排序 nlogn n^2 logn n 否 logn n
堆排序 nlogn nlogn nlogn nlogn 否 1 1
对于基本有序的排序算法 冒泡排序算法的时间复杂度最好