排序是算法的基础
算法包括输入输出,数据结构,衡量算法的是速度,
插入排序:对数组A[length]进行排序θ(n*n):
for j=2 to length;
key=A[j];//insert A[j] into the A[1..j-1]
i=j-1
while i>=0 and A[i]>key
A[i+1]=A[i]
i--
A[i+1]=key
引出循环不变式的概念(并证明)
输入规模:输入中的项数,输入规模量度。
运行时间:执行的基本操作数。
最坏状况运行时间:对于规模为n的任何输入,算法运行的最长时间。
平均情况:可能会用到概率分析,使用随机化算法计算期望等等。
增长量级(增长率):计算出运行时间的简化表达式,通过系数比较。
集合离散数学分析(就是概率?)
分治法:利用递归把一个大问题分解成若干个小问题解决。
递归法排序θ(n*lgn):
Merger-Sort(A,p,r)
if p<r
q=(p+r)/2
Merger-Sort(A,p,q)
Merger-Sort(A,q+1,r)
Merger(A,p,q,r)
其中:Merger(A,p,q,r)
n1=q-p+1
n2=r-q
let L[1..n1+1]and R[1..n2+1]be new arrays
for i=1 to n1
L[i]=A[p+i-1]
for j=1 to n2
R[j]=A[q+j]L[n1+1]=
L[n1+1]=~ //终止标志
R[n2+1]=~
i=1
j=1
for k=p to r
if L[i]<=R[j]
A[k]=L[i]
i++
else A[k]=R[j]
j++
递归的一中式子:T(n)={ c when n=1
{ 2T(n/2)+cn when n>1 (分为原来的一半)
引出递归树的概念。
冒泡法排序:
for i=1 to A.length -1
for j=A.length downto i+1
if A[j]<A[j-1]
exchange A[j] with A[j-1]
渐近记号 θ记号(刻画算法运行时间等其他方面):定义:对于一个给定函数g(n),
θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n>=n0,有
0<=c1*g(n)<=f(n)<=c2*g(n)}
说明f(n)属于θ(g(n))有时可以表示匿名函数(出现在等式右边)
出现在等式左边时,记作f(n)=θ(g(n)),g(n)是f(n)的渐近紧确界
要求每个成员渐近非负,使用θ(1)来表示一个常量或者关于某个变量的
常量函数。
O记号 渐进上界(最坏情况运行时间) ,定义:对于一个给定函数g(n),O(g
(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=f(n)<=c*g(n)}
Ω记号 渐近下界(最优情况运行时间),定义:对于一个给定函数g(n),Ω(g
(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=c*g(n)<=f(n)}
o记号 非渐近紧确上界,定义:对于一个给定函数g(n),o(g(n))={f(n):
对 任意(注意区别) 的正常量c>0和n0>0,使得对所有n>=n0,有0<=f(n)<c*g(n)}
w记号 非渐近紧确下界,定义:对于一个给定函数g(n),w(g(n))={f(n):
对任意正常量c>0和n0>0,使得对所有n>=n0,有0<=c*g(n)<f(n)}
斐波那契数:递归:0,1,1,2,3,5,8...
F0=0
F1=1
Fi=F(i-1)+F(i-2)
求解递归数的三个方法:
1.代入法:首先猜测迭代式子的结果,在用数学归纳法证明。
2.递归树:每一个节点代表一个单一子问题的代价,对每层中的代价求和,在对所有
层求和即可。
3.主方法求解:T(n)=aT(n/b)+f(n),其中a>=1,b>1是常数,f(n)是渐近正函数(见笔
记本)
第六章:堆排序,(需要最大堆,维护堆和建堆)
对于一个数组A[length],
sort
{
Build_Max_Heap(A)
for i=A.length downto 2
exchange A[1] with A[i]
A.heap_size--
Max_Heap(A,1)
}
Build_Max_Heap(A)
{
A.heap_size=A.length
for i=A.length/2 downto 1
Max_Heap(A,i)
}
Max_Heap(A,i)
{
l=left(i)
r=right(i)
if l<= A.heap_size and A[l]>A[i]
largest=l
else largest=i
if r<= A.heap_size and A[r]>A[largest]
largest=r
if largest!=i
exchange A[i] with A[largest]
Max_Heap(A,largest)
}
第十章:链表的操作:(二叉树可以用链表的形式表示)
插入元素:(插入x)
x.next=L.head
if L.head!=NIL
L.head.prev=x
L.head=x
x.prev=NIL
第十一章:hash (用于元素的关键字和元素储存的位置建立一个hash algorithm方便加密查
找)一种类似于数组结构的可以直接寻址。
hash table:哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈
希表。这种方法的基本思想是:首先在元素的关键字k和元素的存储位置p之间建立一个对应关
系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直 接存入地址
为f(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置
p=f(k),从而达到按关键字直接存取元素的目的。
第十四章:数据结构的扩张:对基本数据结构进行扩展以支持一些 附加功能
1.选择一种基础数据结构
2.确定数据结构要维护的附加信息
3.检验能否附加信息。
4.增加一些功能。
第十五章:*动态规划:(与分治法类似,但是用于处理子问题重叠的情况)常用于求解最优
化问题,一个问题有很多解希望找到里面最大或者最小的解。关键字:记忆,空间换时间,不
重复 求解,由交叠子问题从较小问题解逐步决策,构造较大问题的解。
1.刻画一个最优解的结构特征。
2.递归定义最优解的值。
3.计算最优解的值,通常采用自底向上的方法。
4.利用计算出的信息构造一个最优解
第十六章:贪心算法(dp的简化,他在每一步都做出看起来最佳的选择,希望得到全局最优解
)
第十七章:摊还分析:我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评
价操作代价。但摊还分析不同于平均情况,它不涉及概率,他可以保证最坏情况下的每个操作
的平均性能。
第十八章:b树:为磁盘或其他直接存取的辅助设备而设计的一种平衡搜索树,相比红黑树,
他在降低磁盘I/O操作数方面要更好一些
他的节点可以有很多孩子,n个节点的b树高度为O(lgn),b树算法将所需
页面(数据集合)从磁盘复制到主存,然后将修改过的页面写回磁盘。
算法包括输入输出,数据结构,衡量算法的是速度,
插入排序:对数组A[length]进行排序θ(n*n):
for j=2 to length;
key=A[j];//insert A[j] into the A[1..j-1]
i=j-1
while i>=0 and A[i]>key
A[i+1]=A[i]
i--
A[i+1]=key
引出循环不变式的概念(并证明)
输入规模:输入中的项数,输入规模量度。
运行时间:执行的基本操作数。
最坏状况运行时间:对于规模为n的任何输入,算法运行的最长时间。
平均情况:可能会用到概率分析,使用随机化算法计算期望等等。
增长量级(增长率):计算出运行时间的简化表达式,通过系数比较。
集合离散数学分析(就是概率?)
分治法:利用递归把一个大问题分解成若干个小问题解决。
递归法排序θ(n*lgn):
Merger-Sort(A,p,r)
if p<r
q=(p+r)/2
Merger-Sort(A,p,q)
Merger-Sort(A,q+1,r)
Merger(A,p,q,r)
其中:Merger(A,p,q,r)
n1=q-p+1
n2=r-q
let L[1..n1+1]and R[1..n2+1]be new arrays
for i=1 to n1
L[i]=A[p+i-1]
for j=1 to n2
R[j]=A[q+j]L[n1+1]=
L[n1+1]=~ //终止标志
R[n2+1]=~
i=1
j=1
for k=p to r
if L[i]<=R[j]
A[k]=L[i]
i++
else A[k]=R[j]
j++
递归的一中式子:T(n)={ c when n=1
{ 2T(n/2)+cn when n>1 (分为原来的一半)
引出递归树的概念。
冒泡法排序:
for i=1 to A.length -1
for j=A.length downto i+1
if A[j]<A[j-1]
exchange A[j] with A[j-1]
渐近记号 θ记号(刻画算法运行时间等其他方面):定义:对于一个给定函数g(n),
θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n>=n0,有
0<=c1*g(n)<=f(n)<=c2*g(n)}
说明f(n)属于θ(g(n))有时可以表示匿名函数(出现在等式右边)
出现在等式左边时,记作f(n)=θ(g(n)),g(n)是f(n)的渐近紧确界
要求每个成员渐近非负,使用θ(1)来表示一个常量或者关于某个变量的
常量函数。
O记号 渐进上界(最坏情况运行时间) ,定义:对于一个给定函数g(n),O(g
(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=f(n)<=c*g(n)}
Ω记号 渐近下界(最优情况运行时间),定义:对于一个给定函数g(n),Ω(g
(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=c*g(n)<=f(n)}
o记号 非渐近紧确上界,定义:对于一个给定函数g(n),o(g(n))={f(n):
对 任意(注意区别) 的正常量c>0和n0>0,使得对所有n>=n0,有0<=f(n)<c*g(n)}
w记号 非渐近紧确下界,定义:对于一个给定函数g(n),w(g(n))={f(n):
对任意正常量c>0和n0>0,使得对所有n>=n0,有0<=c*g(n)<f(n)}
斐波那契数:递归:0,1,1,2,3,5,8...
F0=0
F1=1
Fi=F(i-1)+F(i-2)
求解递归数的三个方法:
1.代入法:首先猜测迭代式子的结果,在用数学归纳法证明。
2.递归树:每一个节点代表一个单一子问题的代价,对每层中的代价求和,在对所有
层求和即可。
3.主方法求解:T(n)=aT(n/b)+f(n),其中a>=1,b>1是常数,f(n)是渐近正函数(见笔
记本)
第六章:堆排序,(需要最大堆,维护堆和建堆)
对于一个数组A[length],
sort
{
Build_Max_Heap(A)
for i=A.length downto 2
exchange A[1] with A[i]
A.heap_size--
Max_Heap(A,1)
}
Build_Max_Heap(A)
{
A.heap_size=A.length
for i=A.length/2 downto 1
Max_Heap(A,i)
}
Max_Heap(A,i)
{
l=left(i)
r=right(i)
if l<= A.heap_size and A[l]>A[i]
largest=l
else largest=i
if r<= A.heap_size and A[r]>A[largest]
largest=r
if largest!=i
exchange A[i] with A[largest]
Max_Heap(A,largest)
}
第十章:链表的操作:(二叉树可以用链表的形式表示)
插入元素:(插入x)
x.next=L.head
if L.head!=NIL
L.head.prev=x
L.head=x
x.prev=NIL
第十一章:hash (用于元素的关键字和元素储存的位置建立一个hash algorithm方便加密查
找)一种类似于数组结构的可以直接寻址。
hash table:哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈
希表。这种方法的基本思想是:首先在元素的关键字k和元素的存储位置p之间建立一个对应关
系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直 接存入地址
为f(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置
p=f(k),从而达到按关键字直接存取元素的目的。
第十四章:数据结构的扩张:对基本数据结构进行扩展以支持一些 附加功能
1.选择一种基础数据结构
2.确定数据结构要维护的附加信息
3.检验能否附加信息。
4.增加一些功能。
第十五章:*动态规划:(与分治法类似,但是用于处理子问题重叠的情况)常用于求解最优
化问题,一个问题有很多解希望找到里面最大或者最小的解。关键字:记忆,空间换时间,不
重复 求解,由交叠子问题从较小问题解逐步决策,构造较大问题的解。
1.刻画一个最优解的结构特征。
2.递归定义最优解的值。
3.计算最优解的值,通常采用自底向上的方法。
4.利用计算出的信息构造一个最优解
第十六章:贪心算法(dp的简化,他在每一步都做出看起来最佳的选择,希望得到全局最优解
)
第十七章:摊还分析:我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评
价操作代价。但摊还分析不同于平均情况,它不涉及概率,他可以保证最坏情况下的每个操作
的平均性能。
第十八章:b树:为磁盘或其他直接存取的辅助设备而设计的一种平衡搜索树,相比红黑树,
他在降低磁盘I/O操作数方面要更好一些
他的节点可以有很多孩子,n个节点的b树高度为O(lgn),b树算法将所需
页面(数据集合)从磁盘复制到主存,然后将修改过的页面写回磁盘。