摘要: 议题:快速排序算法实现之三(三路划分遍历,解决与划分元素相等元素的问题)分析:算法原理:使用三路划分策略对数组进行划分(也就是荷兰国旗问题,dutch national flag problem)。这个实现是对实现二的改进,它添加处理等于划分元素的值的逻辑,将所有等于划分元素的值集中在一起,并且以后... 阅读全文
posted @ 2014-05-30 09:54 Leo C. 阅读(797) 评论(0) 推荐(0) 编辑
摘要: 议题:快速排序实现之一(单向遍历)分析:算法原理:主要由两部分组成,一部分是递归部分QuickSort,它将调用partition进行划分,并取得划分元素P,然后分别对P之前的部分和P 之后的部分递归调用QuickSort;另一部分是partition,选取划分元素P(随机选取数组中的一个元素,交换... 阅读全文
posted @ 2014-05-30 09:39 Leo C. 阅读(1821) 评论(0) 推荐(0) 编辑
摘要: 四种基本算法概述:基本排序:选择,插入,冒泡,希尔。上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件。前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比;前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存;所以尽管他们的运行时间只相差常数倍... 阅读全文
posted @ 2014-05-30 09:21 Leo C. 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)分析:KMP算法用于在一个主串中找出特定的字符或者模式串。现在假设主串为长度n的数组T[1,n],模式串为长度m的数组P[1,m];数组T和P满足:n>m,且所有元素都来自有限字母表中的字符... 阅读全文
posted @ 2014-05-29 11:19 Leo C. 阅读(651) 评论(0) 推荐(0) 编辑
摘要: 红黑树(Red-Black Tree)红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B);通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的差值不会超过一倍,最终使得BST接近平衡;红黑树内每个节点包含五个属性:color, key, lef... 阅读全文
posted @ 2014-05-29 10:51 Leo C. 阅读(632) 评论(0) 推荐(0) 编辑
摘要: 广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search)BFS优缺点:同一层的所有节点都会加入队列,所以耗用大量空间;仅能非递归实现;相比DFS较快,空间换时间;适合广度大的图;空间复杂度:邻接矩阵O(N^2);邻接表O(N+E);时间复杂度:... 阅读全文
posted @ 2014-05-29 10:01 Leo C. 阅读(1369) 评论(0) 推荐(0) 编辑
摘要: 图最短路径算法(Graph Shortest Path Algorithm, eg: Floyd-Warshall, Dijkstra, Bellman-Ford, SPFA, Kruskal, Prim, Johnson)最短路径问题有多个衍生问题(并且每个衍生问题都涉及是否有负权边)单源点最短路... 阅读全文
posted @ 2014-05-28 10:23 Leo C. 阅读(1209) 评论(0) 推荐(0) 编辑
摘要: A*搜索算法(A Star Search Algorithm)A*算法主要用于在二维平面上寻找两个点之间的最短路径。在从起始点到目标点的过程中有很多个状态空间,DFS和BFS没有任何启发策略所以穷举所有的状 态空间,不适合仅需对局部进行搜索的应用。启发式搜索的关键在于:当前节点在选择下一步节点的时候... 阅读全文
posted @ 2014-05-28 09:56 Leo C. 阅读(2249) 评论(0) 推荐(0) 编辑
摘要: B树(B-Tree)1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量少 的操作次数内完成CPU分配的任务,B树就按照此原则设计,B树与红黑树的主要区别在于B树节点可以有超... 阅读全文
posted @ 2014-05-28 09:50 Leo C. 阅读(441) 评论(0) 推荐(0) 编辑
摘要: 二叉堆(Binary Heap)二叉堆是完全二叉树(或者近似完全二叉树);其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者最大堆);一般使用数组构建二叉堆,对于array[i]而言,其左子节点为array[2*i],其右子节点为 arr... 阅读全文
posted @ 2014-05-28 09:28 Leo C. 阅读(1611) 评论(0) 推荐(0) 编辑