第1章:(大题:推导题)
1、母函数:相关类型题请看课本11页的
1、Huffman树:(课本29页)
算法设计:
Huffman树的构造:已知n个字符的权为Pi 其中i=1,2,3……n
Step1:构造n个带权为Pi 的只有根节点的二元树集。L={T1,T2……Tn}
Step2:在L中选择权最小的两棵二元树为左右子树组成一棵新的二元树,其权为左右子树的权之和;
Step3:在L中删除两棵子树,将新树加入树集L;
Step4:重复Step2、Step3直至L中只含一棵二元树。
时间复杂性分析:时间复杂度为 T=O(n^2)
空间复杂性:其空间复杂度为T=O(n+1)。
2、二分查找(课本33页)
算法设计:
READ A(1:n), x
K←1, m←n
While k≤ m do
j←INT[(K+M)/2]
IF x=A[j] THEN
EXIT
IF x<a[j] THEN
m←j-1
ELSE
K←j+1
END
IF k>m THEN
j←0
OUTPUT j
时间复杂度分析:最好的情况下为一次查找到查找数据,即x=A[n/2].
最坏的情况下,设n=2L,则要查找L+1次,即log2n+1次。
所以,可以得到时间复杂度为:O(log2n)
空间复杂度分析:由于在查找中,n个元素占用空间为n,故其空间复杂度为O(n)
3.矩阵的链乘:
算法设计
READ n, r(1:n+1)
mij ← 0
S←0
for m = n-1 to 1 do
{ for i = 1 to m do
{ for j = S+1 to n do
{ for k = i to j-1 do
{ x(k) = m(i,k)+m(k+1,j)+r(i)r(k+1)r(j+1)
}
}
m(i,j) = min(x(k))
}
S←S+1
}
If m(i,j)!=0
{then output i,j}
时间复杂性分析:因为算法中使用了4个FOR循环,而真正执行时间却是最内层的一个循环,其数量级只有n3 ,所以时间复杂度为 T=O(n3 )
空间复杂性:因为所需要用到的空间只是存储m(i,j),所以其空间复杂度为T=O(n2)。
1、二分插入排序法:(课本224):可能性大
void binSort(SortObject * pvector)
{
int i, j, left, mid, right;
RecordNode temp;
for( i = 1; i < pvector->n; i++ )
{
temp = pvector- >record[i];
left = 0; right = i – 1;
while (left <= right)
{
mid = (left+right)/2;
if (temp.key < vector->record[mid].key)
right = mid-1;
else
left = mid+1;
}//while
for(j=i-1; j>=left; j--)
pvector->record[j+1] =
pvector->record[j]; if(left != i)
pvector->record[left] = temp;
}// for
} // binSort
算法思想描述:在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,如果小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的所有元素后移,再把第i个元素放在目标位置上。
时间复杂性分析:
算法的移动次数:
- 最坏的情况为n2/2
- 最好的情况为n
- 平均移动次数为O(n2)
所以二分法插入排序算法的平均时间复杂度为T(n)= O(n2)
空间复杂度分析:由于在查找中,n个元素占用空间为n,故其空间复杂度为O(n)
2、下溢排序法:(课本226):可能性小
S1. k←n。
S2. j←l,lab←0。
S3. 若x(j)>x(j+1),则转S4,否则,转S5。
S4. r←x(j),x(j) ←x(j+1),x(j+1) ←r,lab←l。
S5. j←j+1。
S6. 若j<k,则转S3,否则,转S7。
S7. 若lab=1,则作【k←k-1,转S2】,否则,结束
时间复杂性分析:
下溢排序最好时间复杂度是O(n),下溢排序最坏时间复杂度为O(n2),
下溢排序平均时间复杂度为O(n2)
空间复杂度分析:由于在查找中,n个元素占用空间为n,故其空间复杂度为O(n)