算法
Hacker_NO_1
这个作者很懒,什么都没留下…
展开
-
二叉查找树
二叉树的一个重要的应用是他们在查找中的应用假设树中的每一个结点存储一项数据。使二叉树成为二叉查找树的性质是,对于树中的每个结点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。注意,这意味着,该树所有死亡元素都可以用某一种一致的方式排序。template <typename Comparable>class BinarySearchTree{ public原创 2015-08-08 15:17:34 · 355 阅读 · 0 评论 -
一个精炼的广度优先搜索算法
用一个队列来存储要遍历的顶点。在迭代开始的时候,队列只含有距离为currDist的顶点,当添加距离为currDist的邻接点时,由于它们自队尾入队,因此这就保证它们直到所有距离为currDist的顶点都被处理之后才被处理。在距离为currDist处的最后一个顶点出队并被处理后,队列只含有距离为currDist+1的顶点,因此该过程将不断进行下去。只需要把开始的结点放入队列中以启动这个过程即可。无权最原创 2015-09-01 16:12:03 · 566 阅读 · 0 评论 -
最大子序列和求解 最优算法O(N)
/*** Linear-time maximum contiguous subsequence sum algorithm.*/int maxSubSum4(const vector<int> & a){ int maxSum=0,thisSum=0; for( int j=0;i<a.size();j++) { thisSum+=a[j];原创 2015-08-06 16:09:48 · 517 阅读 · 0 评论 -
最大子序列和问题求解 algorithm 1 O(N^3)
穷举法 /** *Cubic maximum contiguous subsequence sum algorithm. */ int maxSubSum1( const vector<int> & a) { int maxSum=0; for( int i=0; i<a.szie(); i++) for(int j=i;j<a.size();j++)原创 2015-08-06 14:26:23 · 603 阅读 · 0 评论 -
迷宫生成算法
应用求并/查找数据结构的一个例子是迷宫的生成。起点位于左上角。而中点位于图的右下角。可以把迷宫看成是由单元组成的5X5矩形,在该矩形中,左上角的单元被连通到右下角的单元,而且这些单元与相邻的单元通过墙壁分离开来。 生成迷宫的一个简单算法是从各处的墙壁开始(除入口和出口之外)。此时,不断地随机选择一面墙,如果被该墙分割的单元彼此不连通,那么就把这面墙拆掉。重复这个过程直到开始单元和终止单元原创 2015-08-31 15:52:34 · 2289 阅读 · 0 评论 -
快速选择
查找集合S中第k个最小元的算法几乎与快速排序相同。事实上,其前三步是一样的。 令|Si|为Si中元素的个数,快速选择的步骤如下: (1) 如果|S|=1,那么k=1并将S中的元素作为答案返回。如果正在使用小数组的截止方法且|S|<=CUTOFF,则将S排序并返回第k个最小元. (2)选取一个枢纽元v属于S。 (3)将集合S-{v}分割成S1和S2,就像快速排序中所做的那样。原创 2015-08-29 17:31:26 · 692 阅读 · 0 评论 -
对大对象进行排序的算法
快速排序就是快速排序,谢尔排序就是谢尔排序。然而,直接应用基于这些算法的函数模板时,如果要排序的Comparable对象很大的话,有时效率会很低。问题就在于。问题就在于重新排列Comparable对象时,进行太多复制Comparable对象的工作。如果Comparable对象很大而且难于复制的话,其代价也会很高。 一般来说,这个问题的解决方案很简单:生成一个指向Comparable的指针原创 2015-08-30 11:17:54 · 893 阅读 · 0 评论 -
快速排序
顾名思义,快速排序(quicksort)是在实践中最快的一致排序算法,它的平均运行时间是O(NlogN)。该算法之所以特别快,主要是由于非常精炼和高度优化的内部循环。它的最坏情形的性能为O(N^2),但稍加努力就可以改变这种情形。 像归并排序一样,快速排序也是一种分治的递归算法。将数组S排序的基本算法由下列简单的四步组成: (1)如果S中元素个数是0或1,则返回。 (2原创 2015-08-29 15:33:08 · 927 阅读 · 0 评论 -
一些简单排序算法的下界
以数为成员的数组的逆袭(inversion)是指具有性质i原创 2015-08-27 22:02:52 · 943 阅读 · 1 评论 -
归并排序
归并排序算法很容易描述。如果N=1,那么只有一个元素需要排序,答案是显而易见的。否则,递归地将前半部分数据和后半部分数据各自归并排序,得到排序后的两部分数据,然后使用合并算法将这两部分合并到一起。例如,欲将8元素数组24,13,26,1,2,27,38,15排序,我们地柜地将前4个数据和后4个数据分别排序,得到1,13,24,2,15,27,38。然后,将这两部分合并,得到最后的表1,2,13,15原创 2015-08-28 22:48:06 · 672 阅读 · 0 评论 -
堆排序
在利用最小堆进行排序时,需要执行N次deleteMin操作。按照顺序,最小的元素先离开堆。通过将这些元素记录到第二个数组然后再将数组拷贝回来,我们得到N个元素的排序。由于每个deleteMin花费O(logN)时间,因此总的运行时间是O(NlogN)。 该算法的主要问题在于,它使用了一个附加的数组。因此,存储需求增加一倍。在某些实例中这可能是个问题。注意,将第二个数组复制回第一个数组的附原创 2015-08-28 09:30:44 · 966 阅读 · 0 评论 -
谢尔排序
谢尔排序的名称源于它的发明者Donald Shell,该算法石冲坡二次时间屏障的第一批算法之一,不过,知道它最初被发现的如干年后才证明了它的亚二次时间界。它通过比较相距一定时间间隔的元素来工作;各趟 比较所用的距离随着算法的进行而减小,知道只比较相邻元素的最后一趟排序为止。由于这个原因谢尔排序也叫作所见增量排序。 增量序列的一个流行的选择是使用Shell建议的序列:hi=[N/2]和hk=h原创 2015-08-27 23:30:23 · 1062 阅读 · 0 评论 -
一些简单排序算法的下界
以数为成员的数组的逆袭(inversion)是指具有性质ia[j]的序偶(i,j)。列如 输入数据34,8,64,51,32,21有9个逆序,即(34,8),(34,32),(34,21),(64,51),(64,32),(64,21),(51,32),(51,21),(32,21)。定理1 N个互异元素的数组的平均逆序数是 N(N-1)/4 证明:见韦斯的《数据结构与算法分析》2原创 2015-08-27 23:13:19 · 1205 阅读 · 0 评论 -
排序算法
插入排序:就像摸牌,摸一张插进去,找一个哨兵,从第二个开始,和前一个比较,小的话前移一位。#include iostream> #includestdlib.h> using namespace std; #define N 4 //不能加分号结束 class sort { public: void insertSort(int a[]转载 2015-08-08 23:22:10 · 430 阅读 · 0 评论 -
欧拉回路的几个小概念
其中点必须终止在气点上的欧拉回路只有当图是连通的并且每个顶点的度是偶数是才有可能存在。这是因为,在欧拉回路中,一个顶点有边进入,则必须有边离开。如果任意顶点v 的度为奇数,那么最终会达到这样的一种地步,即只有一条边进入v的边尚为访问到,若沿该边进入v点,那么只能停在v,不可能再出来。如果恰好有两个顶点的度是奇数,那么当从一个奇数度 的顶点出发最后终止在另一个奇数度的顶点时,仍有可能得到一个欧拉环游。原创 2015-09-05 10:44:38 · 1112 阅读 · 0 评论