算法导论学习笔记(时时更新)

排序是算法的基础


算法包括输入输出,数据结构,衡量算法的是速度,
插入排序:对数组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树算法将所需


页面(数据集合)从磁盘复制到主存,然后将修改过的页面写回磁盘。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值