简介
本文主要介绍决策树模型,推导了基于比较的排序算法的最快速度,然后给出了一种在特定条件下的线性时间复杂度的排序算法。
decision-tree model
这里决策树就不多做介绍,其本质就是通过比较来给出所有排序结果的模型。基于比较的算法,merge sort, insertion sort, quick sort, heap sort这一类算法,都可以用决策树模型来描述
根据推论,一颗完整的决策树,需要
>
=
n
!
>=n!
>=n!的叶子(这里可以使用排列组合的知识,要想构建一个数列完整的决策关系,至少需要
n
!
n!
n!次比较)
因此使用完全二叉树去构建这个决策树,得到的树的深度肯定是最小的。就有
n
!
<
=
2
h
n!<=2^h
n!<=2h
上面的公式是可以证明基于比较的排序算法,最快为nlgn
Counting sort
counting sort是有一定前提的,就是对于 A [ i ] ( 1 < = i < = n ) A[i](1<=i<=n) A[i](1<=i<=n),都有 1 < A [ i ] < k 1<A[i]<k 1<A[i]<k。伪代码如下:
for j = 1 to k
C[j] = 0
for i = 1 to n
C[A[i]] = C[A[i]] +1
for j = 2 to k
C[j] = C[j]+C[j-1]
for i = n to 1
B[C[A[i]]] = A[i]
C[A[i]] = C[A[i]]-1
其running time is Θ ( n + k ) \Theta(n+k) Θ(n+k)
//我们假设给我们的数据都是在5到20之间的
const offset int = 5
func CountingSort(A []int) []int{
len := len(A)
temp := make([]int, 16)
for i:=0; i<len; i++ {
A[i] -= offset
temp[A[i]]++
}
for i:=1; i<16; i++ {
temp[i] = temp[i]+temp[i-1]
}
for i:=0; i<16; i++ {
temp[i]--
}
ans := make([]int, len)
for i:=len-1; i>=0; i--{
ans[temp[A[i]]] = A[i]+offset
temp[A[i]]--
}
return ans
}