数据结构和算法
文章平均质量分 75
思翊
Hello , world.
展开
-
算法导论-第15章-动态规划-15.3 最长公共子序列
一: 作用 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法。二:概念 举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出子序列不见得一定是连续的,连续的那是子串。 我想大家已经了解了子序列的概念,那现在可以延伸到两个字符串了,那么大家能够看转载 2014-11-10 08:58:20 · 830 阅读 · 0 评论 -
算法导论-第22章-基本的图算法-22.5 强连通分量
代码:#include using namespace std;//8个点#define N 8 #define WHITE 0#define GRAY 1#define BLACK 2//边结点结构struct Edge{ int start;//有向图的起点 int end;//有向图的终点 Edge *next;//指向同一个起点的下一条边 int typ原创 2014-12-02 11:16:24 · 1126 阅读 · 0 评论 -
算法导论-第15章-动态规划-15.1 钢条切割问题
一、综述动态规划是通过组合子问题的解而解决整个问题的。动态规划适用于子问题不是独立的情况,也就是各子问题的包含公共的子子问题。动态规划对每个子问题只求解一次,将其结果保存在一张表中。动态规划通常用于最优化问题。动态规划的设计步骤:a.描述最优解的结构b.递归定义最优解的值c.按自底向上的方式计算最优觖的值d.由计算出的结构构造一个最优解原创 2014-11-07 08:31:40 · 1310 阅读 · 0 评论 -
算法导论-第24章- 单源最短路径 - 24.1 Bellman-Ford 算法
1、综述原创 2014-12-07 11:40:23 · 1182 阅读 · 0 评论 -
算法导论-第24章- 单源最短路径 - 24.3 Dijkstra 算法
1、综述Dijkstra(迪杰斯特拉)算法是典型的最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从原创 2014-12-10 08:48:18 · 2639 阅读 · 0 评论 -
算法导论第六章-堆排序
//堆排序算法,通过建立最大堆去排序,排序结果为从小到大,复杂度为O(nlogn)#includeusing namespace std;//数组长度#define length 11//堆的长度有变化,定义为全局变量int heap_size=length-1;//维护堆的性质,思路是节点i的子树都已经是最大堆,但i可能小于其孩子,让其逐级下降,从而变成最大堆void MA原创 2014-10-26 09:31:59 · 957 阅读 · 0 评论 -
算法导论-第12章-二叉搜索(查找)树
一、概念1.定义与性质(1)设x为二叉查找树中的一个结点,若y是x左子树中的一个结点,则key[y] (2)二叉查找树上执行的基本操作的时间与树的高度成正比。2.结构(1)结点结构:关键字key卫星数据data分别指向父、左右孩子的指针p, left, right3.在二叉查找树上的操作查找一个关键字:SEARCH(x转载 2014-11-04 09:09:48 · 890 阅读 · 0 评论 -
算法导论第四章-快速排序
//快速排序复杂度为O(nlogn),平均复杂度也是O(nlogn),所以就平均时间而言,被认为是最好的一种排序方法#includeusing namespace std;//以a[low]为枢轴,小于它的都放到a[low]前面,大于它的都放到后面,则low的位置即确定int quick_sort(int *a,int low,int high){ int tmp=a[low];原创 2014-10-26 11:07:36 · 430 阅读 · 0 评论 -
AVL树,红黑树,B树,B+树,Trie树应用场景简介
AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。原创 2015-07-28 21:16:27 · 1871 阅读 · 0 评论 -
算法导论-16.1-4 活动教室选择问题
题目:假设要用很多个教室对一组活动进行调剂。我们希望应用尽可能少的教室来调剂所有的活动。请给出一个有效的贪心算法,来断定哪一个活动应应用哪一个教室。(这个题目也被成为区间图着色(interval-graph coloring)题目。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的色彩均不雷同,所需的起码色彩对应于找出调剂给定的所有活动所需的起码教室转载 2014-11-14 10:51:34 · 1904 阅读 · 0 评论 -
算法导论-第15章-动态规划-15-2 最长回文子序列(LPS)
问题描述回文序列(Palindromic sequence, Palindrome)是指正向遍历和反向遍历完全相同的序列,例如字符串“AAAAA”显然是一个回文序列,又如字符串“ABC@CBA”也是一个回文序列。现在,我们要在一个(字符)序列中找出最长回文子序列的长度。例如字符序列"BBABCBCAB",最长回文子序列是“BACBCAB”(可能不唯一),它的长度是7;子序列"BBBBB"和"B原创 2014-11-11 14:11:04 · 5322 阅读 · 1 评论 -
算法导论-第16章-贪心算法-16.1 活动选择问题
前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解。书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析。本篇笔记给出活动选择问题的详细分析过程,并给出详细的实现代码进行测试验证。关于贪心算法的详细分析过程,下次在讨论。1、活动选择问题描述 有一个需要使用每转载 2014-11-13 08:56:30 · 877 阅读 · 0 评论 -
算法导论-第32章- 字符串匹配 - KMP算法
书中依次讲了4种方法,朴素算法、RabinKarp算法、有限自动机算法、KMP算法1、朴素算法:算法用一个循环来找出所有有效位移,该循环对n-m+1个可能的每一个s值检查条件P[1...m] = T[s+1....s+m];//朴素的字符串匹配算法void nativeStringMatcher(string st, string sp){ int n = st.le原创 2014-12-11 16:47:57 · 2358 阅读 · 0 评论 -
算法导论第二章-归并排序
算法导论P17-P19归并排序算法,最坏情况(θ(nlogn)),平均情况(θ(nlogn))原创 2014-10-22 11:32:46 · 631 阅读 · 0 评论 -
算法导论-第11章-散列表-11.1-4 大数组的直接寻址表
一、题目我们希望我们希望通过利用在一个非常大的数组上直接寻址的方式来实现字典。开始时,该数组中可能包含废料,但要对整个数组进行初始化是不实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典方案。每个存储的对象占用O(1)的空间;操作search,insert,delete的时间为O(1);对数据结构初始化时间为O(1)。 (提示:可以利用另外一个栈,其大小等于实际存储在字典中的关转载 2014-10-31 11:19:34 · 589 阅读 · 0 评论 -
算法导论第四章-最大子数组问题
转自:http://blog.csdn.net/ithomer/article/details/7096252原创 2014-10-23 10:16:05 · 754 阅读 · 0 评论 -
算法导论第九章-中位数和顺序统计量
9.1 最小值和最大值转载 2014-10-29 08:18:08 · 520 阅读 · 0 评论 -
算法导论-第15章-动态规划-15.4 最优二叉搜索树
一、什么是最优二叉查找树最优二叉查找树:给定n个互异的关键字组成的序列K=,且关键字有序(k1图一显示了给定上面的概率分布pi、qi,生成的两个二叉查找树的例子。图二就是在这种情况下一棵最优二叉查找树。概率分布:i01234原创 2014-11-10 11:27:56 · 981 阅读 · 0 评论 -
算法导论-第10章-10.2 链表
一、概念(1)数组的线性序是由数组的下标决定的,链表中的顺序是由各对象中的指针所决定的(2)链表结点结构node *prev;node *next;int key;(3)链表结点node *head;node *nil;//哨兵(4)对链表的操作LIST-SEARCH(L, k)LIST-INSERT(L, x)LIST-DELETE(L, x)转载 2014-10-29 16:07:43 · 500 阅读 · 0 评论 -
算法导论第10章-基本数据结构-10.1栈和队列
1.栈(1)栈实现了后进先出操作。在栈的数组实现中,栈顶指针指向栈顶元素,插入时先修改指针再插入,删除时先取栈顶元素再修改指针。当top[S]=0时,栈中空的。(2)数组栈的结构:int top;//栈顶指针int *s];//指向栈数组(3)在栈上实现的操作STACK-EMPTY(S)//判断栈是否为空PUSH(S, x) //把x压入到转载 2014-10-29 08:49:47 · 456 阅读 · 0 评论 -
算法导论第12章-二叉搜索树
一、概念1.定义与性质(1)设x为二叉查找树中的一个结点,若y是x左子树中的一个结点,则key[y] (2)二叉查找树上执行的基本操作的时间与树的高度成正比。2.结构(1)结点结构:关键字key卫星数据data分别指向父、左右孩子的指针p, left, right3.在二叉查找树上的操作查找一个关键字:SEARCH(x, k)求最小关键字:MINIMUM转载 2014-10-12 15:06:02 · 537 阅读 · 0 评论 -
链表的一些基本操作
#include#include#define NUM 10//逆序建立的节点数目struct chain{ int value; struct chain *next;}; struct chain *create() //创建链表,当输入不是int型数据时结束{ struct chain *head,转载 2014-03-26 10:57:16 · 572 阅读 · 0 评论 -
算法导论-第10章-10.4 二叉树之基础篇
一、二叉树的基本操作1、二叉树的定义转载 2014-10-30 10:15:01 · 600 阅读 · 0 评论 -
算法导论-第11章-散列表
转自:http://blog.csdn.net/mishifangxiangdefeng/article/details/7713307一、概念1.综述散表表仅支持INSERT、SEARCH、DELETE操作。把关键字k映射到槽h(k)上的过程称为散列。多个关键字映射到同一个数组下标位置称为碰撞。好的散列函数应使每个关键字都等可能地散列到m个槽位中2.散表函数转载 2014-10-31 08:13:58 · 589 阅读 · 0 评论 -
算法导论-第10章-10.4 二叉树之提高篇(非递归遍历)
二叉树的层次遍历要用到队列,前序、中序和后序非递归遍历要用到栈,这里使用C++标准库中的容器适配器queue和stack。1、 二叉树的层次遍历二叉树的层次遍历类似图的广度优先遍历,都用到了队列。基本思路:(1)根结点非空,则入队列(2)队列非空,队首元素出队列,输出结点值,若结点有左孩子,左孩子入队列;若结点有右孩子,右孩子也入队列。(3)重复步骤转载 2014-10-30 10:26:50 · 623 阅读 · 0 评论 -
算法导论-16.2-6 在O(n)时间内求解分数背包问题
题目:说明如何在O(n)时间内解决分数背包问题常规算法:先求avgi = vi/wi,按照avgi从大到小排序,再贪心选择,时间复杂度为O(nlgn)改进:更一般的情况,不需要排序,例如:如果a1, a2,a3是avgi 最大的三个物品,如果它们的总量和不大于W,我们是不需要知道它们间的相对顺序的。O(n)算法:选择一个物品作为主元,对所有物转载 2014-11-17 09:25:41 · 3931 阅读 · 0 评论 -
算法导论-第18章-B树
一、定义1、B树B树是为磁盘或其它直接存取辅助存储设备而设计的一种平衡查找树,主要特点是降低磁盘I/O操作次数。B树以自然的方式推广二叉查找树。B树的分支因子由磁盘特性所决定。 2、B数的数据结构int n:当前存储在结点x中的关键字数key[N]:n个关键,以非降序存放bool leaf;//TRUE:x是叶子;FALSE:x是内结点n转载 2014-11-19 08:19:07 · 647 阅读 · 0 评论 -
算法导论-第12章-二叉搜索树-12.2-1
9.设二叉排序树中关键字由1至1000的整数构成,现要查找关键字为363的结点,下述关键字序列哪一个不可能是在二叉排序树上查找到的序列? (a) 2,252,401,398,330, 344,397,363; (b) 924, 220, 911, 244, 898, 258,原创 2014-11-04 10:50:48 · 1291 阅读 · 0 评论 -
算法导论-第22章-基本的图算法-22.2 广度优先搜索(BFS)
一、综述转载 2014-11-25 10:00:58 · 738 阅读 · 0 评论 -
算法导论-第22章-基本的图算法-22.2 广度优先搜索-22.2-4 用邻接矩阵方法实现BFS
一、题目如果BFS的输入图是用邻接矩阵表示的,且对该算法加以修改以处理这种输入图表示,那么该算法的运行时间如何?二、答案与代码运行时间为O(n^2),处理方法见代码。1.Mat_Graph.h#include #includeusing namespace std;#define N 100#define WHITE 1#define G转载 2014-11-26 09:30:00 · 708 阅读 · 0 评论 -
算法导论-第22章-基本的图算法-22.3 深度优先搜索-22.3-7-使用栈来代替递归实现DFS
题目:重写过程DFS,利用一个栈来消除递归代码:#include #include using namespace std;#define N 10#define WHITE 0#define GRAY 1#define BLACK 2//边结点结构struct Edge{ int start;//有向图的起点 int end;//有向图的终点转载 2014-11-28 11:13:23 · 1613 阅读 · 0 评论 -
算法导论-第14章-数据结构的扩张
一、概念1.动态顺序统计动态顺序统计是指,在一个动态的无序的集合中,任意的顺序统计量都可以在O(lgn)时间内确定。2.基础数组结构红黑树,每个树结点的域包括:key[x],color[x],left[x],right[x]3.附加信息size[x]:以结点x为根的子树的内部结点(包括x)数,即子树的大小。如果定义哨兵nil,则size[ni转载 2014-11-06 10:52:25 · 552 阅读 · 0 评论 -
算法导论-第22章-基本的图算法-22.3 深度优先搜索(DFS)
一、综述 深搜策略:在深搜过程中,对于最新发现的顶点,如果它还有以此为起点的而未探测到的边,就沿此边继续探测下去。当顶点v的所有边都已被探测过后,搜索将回溯到发现顶点v有起始点的那些边。时间戳:当顶点v第一次被发现时记录下第一个时间戳d[v],当结束检查v的邻接表时,记录下第二个时间戳f[v]。v在d[v]时刻前是白色的,在时刻d[v]和f[v]之间是灰色的,在时刻f[v]之后是黑色的。转载 2014-11-26 10:45:20 · 939 阅读 · 0 评论 -
算法导论-第22章-基本的图算法-22.1 图的表示
一、综述图的表示方法通常有两种,即邻接表表示法和邻接矩阵表示法。这两种方法都可以表示有向图和无向图1.邻接表表示法(1)用邻接表表示无向图(2)用邻接表表示有向图(3)邻接表的优点及适用场合使用邻接表表示稀疏图比较紧凑2.邻接矩阵表示法(1)用邻接矩阵表示无向图(2)用邻接矩阵表示有向图转载 2014-11-24 10:24:44 · 700 阅读 · 0 评论 -
算法导论-第13章-红黑树
一、概念1.定义与性质(1)定义红黑树字义:满足(a)每个结点或是红的,或是黑的(b)根结点是黑的(c)每个叶结点(NIL)是黑的(d)如果一个结点是红的,则它的两个儿子是黑的(e)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点的二叉查找树称为红黑树。黑高度定义:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上的黑色结点的个数称为x的转载 2014-11-05 08:32:14 · 647 阅读 · 0 评论