数据结构
文章平均质量分 81
笨蛋糕
当你的才华还不足以撑起你的野心时,你应该静下心去学习!
展开
-
最短摘要生成
题目:抽象点说,就是在一个字符串中,找一些目标字符串,找到包含所有目标字符串的最小字符串。题目虽然叫做最短摘要生成,但和实际的搜索snippet的计算还是有比较大的差距的。解法:文献[1]给出了一种比较好的解法,策略还是使用双指针,双指针对于很多算法设计很有价值,算法的思想是采用两个指针,开始两个指针都指向缓冲区的头部,尾指针向后扫描,直到头指针和尾指针中间包含了全部的关键字,那么头指针向原创 2014-06-15 16:17:48 · 750 阅读 · 0 评论 -
算法知识点整理
1、算法的几个基本特征是什么?原创 2014-08-06 11:21:38 · 1765 阅读 · 0 评论 -
二叉查找树
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; (2)、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; (3)、它的左、右子树也分别为二叉查找树原创 2014-07-29 12:53:31 · 588 阅读 · 0 评论 -
栈实现括号匹配
算法:检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。原创 2014-08-06 12:15:48 · 898 阅读 · 0 评论 -
两个N*N矩阵的乘法
实现两个N*N矩阵的乘法,矩阵由一维数组表示。原创 2014-07-28 18:41:06 · 2381 阅读 · 0 评论 -
插入排序
三、插入排序直接插入排序(direct Insert Sort)的基本思想是:顺序地将待排序的记录按其关键码的大小插入到已排序的记录子序列的适当位置。子序列的记录个数从1开始逐渐增大,当子序列的记录个数与顺序表中的记录个数相同时排序完毕。原创 2014-07-13 19:21:55 · 585 阅读 · 0 评论 -
简单选择排序
简单选择排序的基本思想:第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行i-1趟比较,直到所有记录排序完成为止。例如:进行第i趟选择时,从当前候选记录中选出关键字最小的k号记录,并和第i个记录进行交换。实现代码如下:原创 2014-07-13 19:26:43 · 639 阅读 · 0 评论 -
最小堆与最大堆
最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。最小堆和最大堆的增删改相似,其实就是把算法中的大于改为小于,把小于改为大于。生成最大堆:最大堆通常都是一棵完全二叉树,因此我们使用数组的形原创 2014-08-10 16:59:06 · 1080 阅读 · 0 评论 -
带权有向图最短路径
1、带权有向图最短路径1) 适用条件&范围:a) 单源最短路径(从源点s到其它所有顶点v);b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图)c) 所有边权非负(任取(i,j)∈E都有Wij≥0);2) 算法描述:在带权图中最常遇到的问题就是,寻找两点间的最短路径问题。 解决最短路径问题最著名的算法是Dj原创 2014-07-28 13:14:36 · 7254 阅读 · 0 评论 -
希尔排序
希尔排序(Shell Sort)又称为缩小增量排序,输入插入排序算法,是对直接排序算法的一种改进。本文介绍希尔排序算法。 对于插入排序算法来说,如果原来的数据就是有序的,那么数据就不需要移动,而插入排序算法的效率主要消耗在数据的移动中。因此可知:如果数据的本身就是有序的或者本身基本有序,那么效率就会得到提高。 希尔排序的基本思想是:将需要排序的序列划分成为若干个较小的子序列原创 2014-07-13 19:18:28 · 548 阅读 · 0 评论 -
Trie树及应用
最近在看字符串算法了,其中字典树、AC自动机和后缀树的应用是最广泛的了,下面将会重点介绍下这几个算法的应用。 字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不过 Trie 的 key 只能是字符串。 Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度都为 O(k) ,原创 2014-05-18 16:08:37 · 510 阅读 · 0 评论 -
堆排序
1、n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质):1)ki=号。//k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。原创 2014-07-13 20:23:11 · 1295 阅读 · 0 评论 -
归并排序
1、归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。例如有两个有序表:(7,10,13,15)和(4,8,19,20),归并后得到的有序表为:(4,7,8,10,13,15,19,原创 2014-07-13 19:30:27 · 586 阅读 · 0 评论 -
快速排序
一、快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解: 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记原创 2014-07-13 19:04:07 · 569 阅读 · 0 评论 -
如何判断一棵树是平衡二叉树
平衡二叉树(AVL树)是满足下面条件的二叉树:要么是一棵空树,要么左右子树都是AVL树,并且左右子树的深度之差的绝对值不大于1。由此可知,要判断一棵树是不是AVL树,只要判断它的左右子树的深度之差。问题落到了如何求一棵树的深度上去了。下面使用递归的方法求一棵树的深度:[cpp] view plaincopy#inclu原创 2014-07-29 13:44:06 · 714 阅读 · 0 评论 -
数据结构知识点整理
1、数据结构的定义?原创 2014-08-06 12:44:03 · 1223 阅读 · 0 评论 -
冒泡排序
冒泡排序算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。[1]原创 2014-07-13 20:36:31 · 780 阅读 · 0 评论 -
KMP应用举例
给定一个字符串,问最多是多少个相同子串不重叠连接构成。KMP的next数组应用。这里主要是如何判断是否有这样的子串,和子串的个数。若为abababa,显然除其本身外,没有子串满足条件。而分析其next数组,next[7] = 5,next[5] = 3,next[3] = 1,即str[2..7]可由ba子串连接构成,那怎么否定这样的情况呢?很简单,若该子串满足条件,则len%su原创 2014-07-13 12:19:55 · 744 阅读 · 0 评论 -
KMP模式匹配算法
KMP算法详解:KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字。其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n)。在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0.原创 2014-06-15 16:09:00 · 524 阅读 · 0 评论