您的位置:首页 > 其它

算法学习笔记

2010-05-24 09:52 85 查看
一般算法:

尾递归

将递归函数调用放到递归单元中的最后一句,在递归参数中完成递归计算,缩小参数数据规模。

这种算法形式上是递归,实际上是在做迭代工作,可以很直观地转换成非递归的迭代算法。

素数筛选法

还是需要双层循环。但引入一个状态数组, 在每次外循环中利用内循环求出外循环变量i的在所求值范围内的所有倍数,加快筛选合数的速度。

汉诺塔

Fibonacci数列

关于互为逆运算且满足交换律的运算规律

定义两个符号#和@,这两个符号互为逆运算,也就是说(x # y) @ y = x。现在依次执行下面三条命令:
x <- x # y
y <- x @ y
x <- x @ y

执行了第一句后x变成了x # y。那么第二句实质就是y <- x # y @ y,由于#和@互为逆运算,那么此时的y变成了原来的x。第三句中x实际上被赋值为(x # y) @ x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。

排序算法:

冒泡排序, O(n^2), 单次循环中小数与大数交互位置

选择排序, O(n^2), 单次循环中将最小的数放在最前面

插入排序, O(n^2), 单次循环中从后往前把数插到刚好比它小的数的后一位

希耳排序, O(n^2), 在插入排序的基础上引入一个gap变量,让单次循环中从后往前插数是按gap的值进行“跳越”遍历,每插一次gap递减一次,直到gap被递减为1(如果gap在某次递减后小于1则让gap=1),通常gap的起始值取排序数组的长度的一半,递减量取2.2

快速排序, O(nlogn), 在单次处理中将比某一个成员值小的数移到它的左边,比它大的数移到它的右边,再分别对左边部分和右边部分进行同样逻辑的递归

归并排序, O(nlogn), 将自身不断二分(递归),在每一个二分部分中按序合并前半部分数据和后半部分数据。

图论:

深度优先遍历

广度优先遍历

最小生成树

Dijsktra最短路径算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: