算法导论笔记(二)

1.插入排序

核心思想:从前向后对每个数和它之前的数字相比较,并把他放在合适的位置

2.拓扑排序

有向图排序,核心思想:

(1)深度遍历:遇到死端往回走,出盏顺序即为拓扑排序

(2)减一法:减去一个源端点即没有指向他的点,只有他指向别的端点,删除该端点,和他的线

3.生成排列(自底向上)

核心思想:从下至上1*C(2,1)*C(3,1)*...C(N,1)种

算法:Johnson:初始化1,2,3...n的队列,移动方向均向左。while存在移动元素do找到最大移动元素,交换最大移动元素和他移动所指向的元素,并且调整数值大于最大移动元素的元素的方向并生成新排列

移动元素:大的指向小的,该元素即可移动

4.生成子集(自底向上)

第n排 1 + C(N,1) + C(N,2) + C(N,3) +... + C(N,N) = POW(2,N)[包含空集]

减治思想的体现:A{a1,a2,...an} = 把an添加到{a1,a2,...,an-1}集合构成的所有子集

二进制格雷反射码:核心思想:如果n = 1,则L1 = {0,1} 否则执行:循环调用参数n-1得到L1,L2, = 反向L1,L1每个元素前+0,L2每个元素前+1,L1和L2拼接为L,返回L

5.折半查找

核心思想:已经排好序的list,while start < end :(start + end)/2和参数比,如果相等,则break,如果参数小,end = (start + end)/2,否则 start = (start + end)/2

6.假币问题

核心思想:同折半查找,对半分,轻的包含假币

7.俄式乘法

核心思想:A B相乘,不断将A/2,B*2,如果A为奇数,A/2向下取整,B = B * 2 (A),直到A等于1,最后将B + A1,A2,A3...

8.约瑟夫斯问题

核心思想:1~n成圈排列,第一个杀死第二个,直到剩下最后一个,最后一个存活的位置(2k+1/2k为圈内总人数)

奇数:J(2K+1) = 2*J(K)- 1 

偶数:J(2K) = 2*J(K) - 1

9.lamuto划分

核心思想:类似于快速排序,选择第一个作为基准,小的交换到前面,大的交换到后面,遍历完成后,将该基准元素和小的最后一个做交换

10.快速选择

核心思想:递归调用不断进行lamuto划分,直到找到第k小的元素

11.插值查找

核心思想:已知是有序数组,故可以按照比例来进行计算,线性函数

12.

猜你喜欢

转载自blog.csdn.net/mr_guo_lei/article/details/78631990