Data Structures and Algorithm
徽州风韵
这个作者很懒,什么都没留下…
展开
-
二叉查找树
二叉查找树性质:对于树中的每个结点X,它的左子树中所有项元素的值小于X中的项,而它的右子树中所有项的值大于X中的项。简单的介绍一些操作:(1)insert (插入) 先遍历树,如果找到要插入的值X,则什么也不做。否则将X插入到遍历路径的最后一点上,其算法实现采用递归。X小于t->element,向左子树遍历,X大于t->element,向右子树遍历,直到t==NULL,插入X。原创 2013-05-18 21:29:12 · 471 阅读 · 0 评论 -
单源最短路径—Bellman-Ford和Dijkstra算法
本文主要讲解《算法导论》中的单源最短路径问题,主要的两种算法是:Bellman-Ford和Dijkstra算法。Bellman-Ford算法是对图中的所有的边进行|V|-1次的松弛;Dijkstra算法对图中的边进行一次松弛。文中给出为什么这样做就可以解决单源最短路径问题。并给出程序。原创 2013-09-26 21:02:36 · 1102 阅读 · 0 评论 -
最小生成树—kruskal算法和prim算法
最小生成树的两种贪心策略:kruskal算法和prim算法,文中主要讲述两种算法的原理,同时侧重在编程时如何处理树的合并,采用在结点添加标示符flag,使得编程简单。原创 2013-09-25 20:12:58 · 917 阅读 · 0 评论 -
图的广度优先搜索和深度优先搜索
本程序主要是参考:算法导论(第三版),分析过程就省略了。grsph.h#pragma once#include#include#includeusing namespace std;templatestruct Node{ Comparable element;//结点的元素 vector*> next; //结点的连接指针,指向多个结点原创 2013-09-24 19:01:32 · 572 阅读 · 0 评论 -
贪心算法-赫夫曼编码
赫夫曼编码主要用于数据文件的压缩,用满二叉树实现的,字符都位于树叶上。赫夫曼算法:在输入的字符结点中,选择出现频率最小的2个结点,合并两个结点,形成新的树。新树频率为2个结点的频率之和。在新结点和原始结点(除去合并的2个结点)再寻找出现频率最小的个结点合并。依次下去,直到所有结点都合并在一个树上,此时生成的树为赫夫曼编码树。a(10) e(15) i(12) s(3) t原创 2013-05-24 20:50:40 · 759 阅读 · 0 评论 -
动态规划算法—最优二叉查找树
问题:给定一组单词w1,w2,...,wn和它们出现的固定概率p1,p2,...pn。问题是要以某种方法在一棵二叉查找树中安放这些单词使得总的期望访问时间最小。注意:二叉查找树中结点的值就是该单词出现的顺序。比如单词输入顺序:a(0.22) am(0.18) and(0.20) egg(0.05) if(0.25) the(0.02) two(0.08),括号里面数字是该单词出现的概原创 2013-06-01 15:47:43 · 1505 阅读 · 0 评论 -
动态规划算法——矩阵乘法的顺序安排
动态是解决递归过程的大量冗余计算的缺点,其采用把子问题的答案系统的记录在一个表中,当计算后面的问题是用到前面的结果可以直接到表中查找,而无需再递归重新计算。 比如:斐波那契数是一个常见的递归计算过程,采用递归算法程序效率非常低。递归算法是模仿递归过程的,计算F(n),存在一个对F(n-1)和F(n-2)的调用,求解F(n-1),要对F(n-2)、F(n-3)的调用,存在2次对F(n-2)原创 2013-05-26 15:59:54 · 4097 阅读 · 0 评论 -
红黑树
本文详细的讲解了红黑树的插入和删除过程,给出了每种不同情况下如何变化使其满足红黑树的性质,并且结合图解十分详细。最后给出了实现的代码,代码中有注释。看代码前先把每种变化情况搞清楚。原创 2013-09-19 10:13:05 · 721 阅读 · 0 评论 -
AVL树—平衡二叉查找树
一颗AVL树是其每个节点的左子树和右子树的高度做多差1的二叉查找树。下面几种几种情况需要进行调整满足AVL树的性质。1.在K3节点左子树或右子树进行一次插入,如下图1,导致了K1节点出现高度不平衡,此时采用单旋调整:具体做法,抓住K2节点,使劲的摇动它,在重力的作用下,K2变成新的根,二叉查找树性质告诉我们,在原树中K1>K2,于是在新树中K1变成K2的右儿子,K3和A仍然为K2的左儿子和K1原创 2013-09-14 11:01:19 · 580 阅读 · 0 评论 -
排序(插入排序、希尔排序、堆排序、归并排序、快速排序法)
(1)插入排序 假设位置0到P-1上的元素是已经排好序的,对于P上的元素,其与0到p-1位置元素比较,找到小于P位置元素j把j+1到p-1元素往后移动一个位置,把p位置元素插入,这样就完成0到p位置元素的排序,依次类推,最终完成排序。(2)希尔排序 使用一个增量序列h,每次排序都使得A[i](3)堆排序 先把数组元素按堆的顺序存储(采用堆的思想,与原创 2013-05-19 14:50:11 · 675 阅读 · 0 评论 -
二叉堆
堆序的性质:对于每一个结点X,X的父亲中的键小于或等于X中的键。其可以用一个数组表示而不需要使用链表,对于数组任一位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元2i+1中,它的父亲在位置i/2上。一些基本的操作:(1)insert(插入) 将一个元素X插入并不破坏堆序(arra),在堆最后位置建立一个空穴hole,判断X与其父亲位置元素的大小,若x(2)remov原创 2013-05-18 22:07:01 · 485 阅读 · 0 评论 -
回溯算法—n皇后问题
题目网上可以搜索到,直接给出程序,程序很简单。backtrack.h#pragma once#include#includeusing namespace std;struct P{ int x; int y; P():x(0),y(0){}};class Backtrack{public: Backtrack(int m); voi原创 2013-06-01 20:25:11 · 561 阅读 · 0 评论 -
回溯算法—公路收费点重建问题
问题:当有x1,x2,...xn点,它们位于x轴上。初始点的坐标x1=0,这些点是从左到右给出的,即i>j,则xi>xj。那么可得到两两点之间的距离。d1,d2,...dm。其中m=n(n-1)/2。现在的问题是已知到距离d1,d2,...dm,如何求解x1,x2,...xn?这个问题采用回溯算法实现。比如例子:D={d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12原创 2013-06-01 19:23:27 · 1378 阅读 · 1 评论 -
动态规划算法——最长公共子序列求法
给定序列X={ X1,X2,....Xn }、Y={ Y1,Y2,...Ym }找出它们的最大子序列Z={ Z1,Z2,...Zk }比如:X={ A,B ,C,B,D,A,B }、Y={ B,D,C,A,B,A },它们的最大子序列Z={ B,C,B,A}。 c[i][j]表示长度为i的X和长度为j的Y的最长子序列,c[0][j]=0,c[i][0]=0,任一序列与空序列的最长原创 2013-05-26 17:02:22 · 930 阅读 · 0 评论 -
贪心算法-节目安排
贪心算法分阶段工作,在每一个阶段,可以认为所做的决定是最好的,而不考虑将来的后果,这就意味着选择的是某个局部最优。当算法终止时,我们希望通过每次局部的最优最终得到全局最优。 节目表安排问题:比如某个学校举办元旦晚会,共有n个节目,假设每个节目开始时间start和结束时间end是已知的。由于时间的限制,晚会的整体时间是有限的,假设为m_time,那么怎样在总时间限制下尽量安排最多的节目。原创 2013-05-19 21:05:28 · 1241 阅读 · 0 评论 -
分治算法-最近点问题
在平面上输入一系列的点,找出其中距离最近的两个点,并将其坐标输出。一种比较简单的做法是采用2个for循环计算每2个点之间的距离,找出最短的那个。此方法是傻瓜式的,耗费时间为O(N^2)。采用分治算法:平面上的所有点可以从中间分成2部分,那么最短距离就可能有3中情况,(1)出现在左半平面的2个点距离最近;(2)出现在最右边的平面的2个点的距离最近;(3)两个点,1个在左半平面,1个在右半平面,它们之原创 2013-05-24 21:29:53 · 754 阅读 · 0 评论 -
股票买进卖出问题—百度实习招聘面试题
2014年百度暑期实习招聘被问到原创 2014-05-06 22:08:48 · 1009 阅读 · 0 评论