数据结构与算法
文章平均质量分 73
Sharing_Li
已于2015停止维护
展开
-
二叉树(BiTree)(递归与非递归法)
二叉树的基本性质: 1.二叉树的第i层上最多有2^(i - 1)个结点。 2.在一棵深度为k的二叉树中,最多有2^k - 1个结点,最少有k个结点。 3.在一棵二叉树中,如果叶子结点的格式为n0,度为2的结点数为n2,则n0 = n2 + 1。 4.具有n个结点的完全二叉树深度为[log2 n] + 1。 5原创 2013-04-25 21:23:08 · 2663 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树的相关概念概念: 平衡二叉树是一种二叉排序树,它具有如下性质: 1、每一个结点的左子树和右子树的深度最多相差1; 2、每一个结点的左子树和右子树也都是平衡二叉树 平衡因子(BF,balance factor): 结点的平衡因子是该结点的左子树的深度与右子树的深度之差,有-1,0,1三种原创 2013-06-23 21:53:13 · 990 阅读 · 0 评论 -
哈希查找
1.哈希表的概念: 哈希是一种重要的存储方法,也是一种重要的查找方法。 基本思想:以关键字K为自变量,通过一个确定的函数f,计算出对应的函数值f (k),把这个值解释为关键字等于K的结点的存储地址。查找时,再根据要查找的关键字用同样的函数计算地址,然后到相应的存储单元取出要查找的结点。按这个思想建立的表,称为哈希表,称函数f 为哈希函数,称f (k)的值为哈原创 2013-06-24 11:38:01 · 985 阅读 · 0 评论 -
二叉排序树查找
二叉排序树: 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;原创 2013-06-05 20:41:21 · 1188 阅读 · 0 评论 -
图的深度优先搜索与广度优先搜索
遍历图的基本搜索方法有两种: 深度优先搜索DFS(Depth First Search)和广度优先搜索BFS(Broad First Search)。这两种方法都适用于有向图和无向图。 深度优先搜索的的基本思想: (1)访问顶点 v ; (2)从 v 的未被访问的邻接点中选取一个顶点 w ,从 w 出发进行深度优先遍历。若 v 的邻接点都被访原创 2013-05-13 19:20:46 · 949 阅读 · 0 评论 -
关键路径与AOE网
在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们叫做AOE网(Activity On Edge Network)。AOE网中没有入度的顶点称为源点或始点,没有出度的顶点称为终点。AOE网是要建立在活动之间制约关系没有矛盾的基础之上,再来分析完成整个工程至少需要多少时间。 我们把路径上各个活动所持续的时原创 2013-05-21 21:16:46 · 1284 阅读 · 0 评论 -
常用算法之分治算法
分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……任何一个可以用计算机求解的问题所需的计算时间都与其规转载 2013-05-07 15:06:29 · 627 阅读 · 0 评论 -
常用算法之分支限界法
一、基本描述类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。(1)分支搜索算法所谓“分支”就是采用广度优先的策略,依次搜索E-结点的所有分转载 2013-05-07 15:51:02 · 871 阅读 · 0 评论 -
常用算法之回溯法
1、概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回转载 2013-05-07 15:38:42 · 755 阅读 · 0 评论 -
常用算法之贪心算法
一、基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一转载 2013-05-07 15:25:03 · 922 阅读 · 0 评论 -
常用算法之动态规划
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有转载 2013-05-07 15:16:20 · 921 阅读 · 0 评论 -
拓扑排序与AOV
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,即AOV网(activity on vertex network)。AOV网中的弧表示活动之间存在某种制约关系。AOV网中不能出现回路。测试AOV网是否存在回路的方法就是对AOV网进行拓扑排序。 设G = (V,E)是一个有向图,V中的顶点序列V1,V2,......Vn,满足若原创 2013-05-19 19:22:29 · 1018 阅读 · 0 评论 -
最短路径算法(Dijkstra和Floyd)
最短路径: 最短路径是指两顶点之间经历的边数最少的路径,若边有权值,则指权值之和最小的路径。Dijkstra(迪杰斯特拉)算法的基本思想: 每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短原创 2013-05-18 14:45:17 · 1129 阅读 · 0 评论 -
最小生成树算法(Prim和Kruskal)
无向连通图的最小生成树 设G=(V,E)是一个无向连通图,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树即为其最小生成树。Prim(普里姆)算法的基本思想是: 设 G=(V,E) 是一个无向连通图,令T=(U,TE) 是 G 的最小生成树。T的初始状态为 U={v0}(v0∈V),TE={},然后重复执行下述操作:原创 2013-05-15 20:55:43 · 1100 阅读 · 0 评论 -
KMP解析
先看字符串S“abcdex”和T"abcdx",比较的时候,两字符串都从下标0开始比较,直到S[4] = 'e' != T[4] = 'x'。然后S从下标1开始,T从下标0开始继续比较。我们可以发现,这是没必要的,在T中,T[0]和T[1],T[0]和T[2],T[0]和T[3]都不相等,因为T[1] = S[1],T[2] = S[2],T[3] = S[3],所以T[0]和S[1],S[2],原创 2013-04-19 12:54:14 · 843 阅读 · 0 评论 -
线索二叉树
在具体应用中,有时需要访问二叉树中的结点在某种遍历序列中的前驱和后继,为方便并效率地使用,我们可以利用原二叉树上没有使用的空指针域。若左指针为空,则指向前驱,若右指针为空则指向后继。线索表的结点结构类型为:enum flag{Child,Thread};templatestruct ThrNode{ Type data; ThrNode * lchild,*原创 2013-04-25 21:27:43 · 712 阅读 · 0 评论 -
哈夫曼树
设二叉树具有n个带权值的叶子结点,从跟结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度(WPL),我们将其中WPL最小的二叉树叫做哈夫曼树。 哈夫曼算法的基本思想是: 将n个结点按照权值从小到大排序,也就相当于n个树,取其中根节点最小的两棵树构造一棵新的二叉树,将这两棵数在原集合中删除,并将新树的加入原集合中继续重复比较直到只剩下一原创 2013-04-26 10:54:06 · 792 阅读 · 0 评论 -
常用排序算法
一、插入排序 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。 1、直接插入排序void InsertSort(int r[],int n)//0号单元用作暂存单元和监视哨{ for (int i = 2; i <= n; i++) { r[0] = r[i];//暂存待插关键码 f原创 2013-06-25 14:57:13 · 949 阅读 · 0 评论