研究生期间的第一个暑假,只有20多天,不过已经算是老板开恩了,实验室其他组最少的只放一个星期,不过人家是有项目做唉,羡慕中……,废话少说了。放假前参加了大老板请的一位在美国搞算法的老师上的高级算法课,总体感觉一般般,八节课里有的简单到不想听,有的难到听不懂,不过老师还算认真,当做一次算法复习还是好的,现将总结写在这儿,也算是对这十几天有个交代。
这次算法课主要集中在几个常用算法:贪婪法,排序,图周游,最大流问题以及NP问题
1.贪婪法:
初学算法时便知道这是解决问题一种很好很简单的方法,听课后才发现它能解决的问题还真是多。解决这类问题的方法可概括为“步步为营”,即每一步的选择一定是最优的过后不能更改,这一点是与动态规划最大的区别,动态规划也是类似的自底向上的解决方法,但是其做每一次选择的时候可能会对前面的选择作出动态的调整,由于这种特性使用动态规划时采用递归是很常见甚至是必须的方法。
贪婪法典型例题有邮局建设问题:在一个一维空间里居民点的坐标已经给定,现打算筹建最大覆盖半径100里的邮局,求邮局的最少个数。
这是典型的贪婪法问题,只需从第一个居民点开始向右100里建第一个邮局,然后从这个邮局向右100里第一个覆盖不到的居民点开始重复上述过程直至所有居民点都被覆盖,伪代码如下:
Post-office(P, H, m, n)
- P[1] = H[1] + 100.
- m ¬1
- for i ¬2 do n
- do if H[i] > P[m] + 100,
- then {m ¬m + 1
- P[m] ¬H[i] + 100
- }
- ifP[m] > H[n]
- then P[m] ¬H[n]
- Return P, m
- End
complexity is obviously O(n).
当时自己写的时候出了点小问题,我每次确定邮局后都去求最远未覆盖点easti,然后再从easti向右找,这完全没必要,只对H数组做一次扫描足矣。
其它问题还有诸如加油站选择问题等,topcoder的算法教程里也有对greedy的很好的介绍http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=greedyAlg
2.排序
主要讲了整数排序中的计数排序(counting sort),也就是前段时间论坛上炒的沸沸扬扬的所谓“张仰彪排序法”,这个算法在算法导论里已有详细的陈述,不知道这位发明者有没有看过,如果没有参考过那我还真是挺佩服他的,这是外话。具体的做法就不再赘述,对counting sort的关注主要是因为其算法复杂度为O(n),从而有些只针对整数的排序就不必采用标准的快排,提高排序的效率。
典型的例子是判断N皇后共存问题,N皇后问题是用回溯法解决的,这里只讨论N皇后的共存判断问题,我们注意到这个问题只需要排序就可以完成复杂度为 O(n)。原问题如下:
在一个n´n的棋盘里如何放置互不攻击的n个皇后是个有名的问题。我们用坐标(i, j)来表示一个皇后被置于棋盘的第i行和第j列这一点上。一个在坐标(i, j)上的皇后和一个在坐标(u, v)上的皇后会互相攻击当且仅当它们在同一行,或者同一列,或者同一对角线,也就是(i = u) 或 (j = v) 或 |i -u| = |j-v|。现在假设有n个皇后,他们的位置是 (a1, b1),(a2, b2),…,(an, bn)。请设计一个O(n)的算法来检查他们是否可以相安无事。
解决方案是:将他们按行号排序后很容易检查是否有两个皇后在同一行。同样可以在O(n)时间内查出是否有在同一列的皇后。两个在坐标(i, j)和(u, v)上的皇后如果在对角线上互相攻击,那么必有|i -u| = |j-v|,也就是i - u = j - v,或者i - u = v – j。这也就是说必有 i - j = u – v,或者i + j = u + v。这两种情况同样可以用计数排序在O(n)时间内检查
相关推荐
1.3 递推算法 1.4 枚举(穷举)算法 1.5 递归算法 1.6 分治算法 1.7 贪婪算法 1.8 试探法算法 1.9 模拟算法 4.1 排序概述 4.2 冒泡排序法 4.3 快速排序法 4.4 简单选择排序法 4.5 堆排序法 4.6 直接插入排序法 4.7 ...
稳定性和原地排序也是考察点,如堆排序、归并排序、插入排序和计数排序的稳定性,以及快速排序、桶排序、堆排序和插入排序是否为原地排序。 最后,设计策略的识别也是关键,快速排序采用的是分治法(Divide and ...
排列组合算法是研究如何有效地列出所有可能的组合或排列,如全排列、组合计数等。在解决实际问题时,这些算法经常与回溯法结合使用。 图论算法是处理网络结构问题的关键,包括最短路径算法(如Dijkstra算法、Floyd-...
7. 计数排序、桶排序、基数排序:非比较型排序,适合特定数据分布情况。 三、搜索算法 1. 线性搜索:最简单的搜索方式,遍历整个数组来查找目标元素。 2. 二分搜索:适用于已排序数组,每次将查找区间减半,效率较...
8 第五课 线性时间的排序法,下限,计数排序法, 基数排序法 阅读: 8 章第 1 到 3 节 收《作业 2》发《作业 3》 9 第六课 序列统计,中位数 阅读:9 章 10 演示课 4 中位数的应用,桶式排序 阅读:8 章第 4 节 ...
而计数排序虽然时间复杂度低,但空间复杂度高。 五、数据结构与算法 1. **希尔排序**:希尔排序是一种基于插入排序的算法,通过设置间隔序列(希尔序列)对数据进行预处理,再进行插入排序,可以提高排序效率。 2. ...
线性时间排序算法是指那些可以在O(n)时间内完成排序的算法,如计数排序、基数排序和桶排序。这些算法适用于特定类型的数据集,具有很高的实用价值。 #### 8. 中位数和序统计:Medians and Order Statistics 中位数...
- **计数排序**:介绍一种适用于整数排序的线性时间算法——计数排序。 - **基数排序**:讲解基数排序的工作原理及其适用范围。 - **桶排序**:介绍桶排序的基本思想及其效率分析。 #### 第九章:中值与顺序统计...
4. **贪婪法**:贪婪算法是一种每一步都采取当前状态下最优选择的策略,以期达到全局最优。这种算法常用于求解背包问题、活动选择问题等。然而,贪婪算法并不总是能保证得到全局最优解,因为它可能过于短视。 5. **...
- **线性时间排序(Sorting in Linear Time)**:包括计数排序、基数排序等,适用于整数排序,时间复杂度为O(n)。 #### 3. 数据结构 - **散列表(Hash Tables)**:一种基于哈希函数实现的高效查找数据结构,通过...
本章介绍了几种线性时间排序算法,如计数排序、基数排序和桶排序,它们在特定的数据分布下能提供更好的性能。 #### 9. Medians and Order Statistics 中位数和其他顺序统计量在数据挖掘和统计学中有广泛的应用。这...
本章探讨了几种可以在O(n)时间内完成排序的算法,例如计数排序、基数排序和桶排序。 - 第九章 中值与顺序统计(Medians and Order Statistics) 讲解了如何在未排序的序列中快速找到第k小(或第k大)的元素。 第...
- **线性时间排序**:如计数排序、基数排序等。 - **中位数与序统计**:找到数组中第k小的元素。 **补充材料**:教师手册为这些排序算法提供了详细的分析与实现过程,以及相关的习题解答。 ##### 第11章至第14章:...
这些都是解决复杂问题的有效策略,例如贪心法可以用于解决着色问题,分治法可以用于快速排序,动态规划能解决最优化问题,而回溯则常用于解决组合优化问题如八皇后问题。 8. **实践教学**:通过趣味程序设计(如...
对于给定的排列,逆序计数问题可以通过分治法解决,将问题分解为两个子问题,再进行递归处理和合并,其时间复杂度为Θ(nlog2n),符合Master定理的应用。 连续背包问题的贪婪策略是按照价值密度从大到小选择物品,以...
2.3.3 最好、最坏和平均操作计数 2.3.4 步数 第3章 渐近记法 3.1 引言 3.2 渐近记法 3.2.1 大Ο记法 3.2.2 渐近记法Ω和Θ 3.3 渐近数学(可选) 3.3.1 大O记法 3.3.2 Ω记法 3.3.3 Θ记法 3.3.4 小ο记法 3.3.5 ...
4. **组合代数**:研究组合的数量和性质,如组合恒等式和组合计数。 5. **计算几何**:研究几何问题的算法,如点线面的关系、多边形的计算和碰撞检测。 **算法:** 1. **排序算法**:包括冒泡排序、插入排序、合并...
- **第十六章 贪婪算法**:探讨贪婪算法的设计策略和适用性。 - **第十七章 分摊分析**:讲解分摊分析技术,分析复合操作的成本。 **第五部分:高级的数据结构(Advanced Data Structures)** - **第十八章 B-树**...
通过示例,如快速排序、归并排序等,读者能够深刻理解分治法的应用场景及其优势。 ##### 贪婪算法及其证明 贪婪算法是一种简单的算法设计策略,它总是做出在当前看来最好的选择。本章不仅介绍了贪婪算法的基本原理...