![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构 & 算法
文章平均质量分 73
ccnunlp
这个作者很懒,什么都没留下…
展开
-
【查找结构1】静态查找结构概论
在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能。比如说:(1) 全文检索技术中对文本建立索引之后,对索引的查找效率将决定搜索引擎的质量。(2) mysql数据库的索引就是B+树结构,查找效率极高。(3) Windows OS的文件系统结构也是采用B+树进行存储的。 在《查找算法》系列文章中,我将主要介绍动态查找树结构。其他静态查找结...2010-03-05 18:51:31 · 135 阅读 · 0 评论 -
【串和序列处理 7】LIS 最长递增子序列
LIS:给定一个字符串序列S={x0,x1,x2,...,x(n-1)},找出其中的最长子序列,而且这个序列必须递增存在。 下面给出解决这个问题的几种方法: (1) 转化为LCS问题 思想:将原序列S递增排序成序列T,然后利用动态规划算法取得S与T的公共最长子序列。具体算法详见《LCS最长公共子序列》。 效率:...2010-03-25 16:37:38 · 107 阅读 · 0 评论 -
【排序结构1】插入排序
1、基本概念介绍 (1) 如果待排序列中有两个相同的关键字 Ki = Kj,其顺序是Ki在Kj之前。如果经过排序之后,Ki 和 Kj的顺序颠倒了,则说明这个排序方法是不稳定的。否则则是稳定排序。 (2) 在内存中就可以完成的排序过程,称为内部排序。如果待排数据量很大,内存不够容纳全部数据,在排序过程中必须对外存进行访问,则叫做外部排序。 实际上,...2010-04-13 17:11:22 · 100 阅读 · 0 评论 -
【排序结构2】交换排序
1、起泡排序 O(N^2) 起泡排序的过程很简单,首先将第一个关键字和第二个关键字比较,若为逆序,则将两个记录交换。然后再用第二个关键字和第三个关键字比较,以此类推,知道第n-1个关键字和第n个比较完,这样最大的关键字将被交换到第n个位置上。这个过程称做第一趟气泡排序。然后对前n-1进行第二趟气泡排序,将第二大的关键字交换到第n-1个位置上。当第n-1趟气泡排序完成之后,有序序列...2010-04-14 11:04:57 · 82 阅读 · 0 评论 -
【排序结构3】 选择排序
(1) 简单选择排序 O(N^2)一趟简单选择排序的操作为:通过n-i 次关键字间的比较,从n-i+1 个记录中选择出关键字最小的记录,并和第 i (i<=i<=n)个记录交换之。#include<iostream.h>/*************************************** * 简单选择排序 Simple Selectio...2010-04-14 21:10:59 · 126 阅读 · 0 评论 -
【排序结构4】 归并排序
归并排序 O(N*logN) 是另一种效率很高的排序方法。"归并"的含义就是将两个或两个以上的有序表组合成一个有序表。加入两个有序表的长度分别为m、n,则一次归并的时间复杂度为O(m+n)。 我们可以用"归并"的思想来实现排序。假如待排序列含有n个关键字,则可看成是n个有序的子序列,每个序列长度为1,然后两两归并,得到[n/2]个长度为2或1的子序列,在两两归并....,知道得到一个长度为...2010-04-17 16:29:55 · 104 阅读 · 0 评论 -
【排序结构5】 基于比较的内部排序总结
★ 基于“比较”操作的内部排序性能大PK 我们首先总结一下《排序结构专题1-4》中的十种方法的性能((N个关键字的待排序列)):排序方法 平均时间 最坏时间 辅助存储空间 稳定性 直接插入排序O(N^2) ...2010-04-18 16:15:20 · 272 阅读 · 1 评论 -
【排序结构6】 桶排序
从《基于比较的排序结构总结 》中我们知道:全依赖“比较”操作的排序算法时间复杂度的一个下界O(N*logN)。但确实存在更快的算法。这些算法并不是不用“比较”操作,也不是想办法将比较操作的次数减少到 logN。而是利用对待排数据的某些限定性假设 ,来避免绝大多数的“比较”操作。桶排序就是这样的原理。 桶排序的基本思想 假设有一组长度为N的待排关键字序列K[1....n]。...2010-04-19 20:28:17 · 253 阅读 · 0 评论 -
【排序结构7】 基数排序
《桶排序》中我们能够看到,数据值的范围越大,可能需要桶的个数也就越多,空间代价也就越高。对于上亿单位的关键字,桶排序是很不实用的。基数排序是对桶排序的一种改进,这种改进是让“桶排序”适合于更大的元素值集合的情况,而不是提高性能。 多关键字排序问题(类似于字典序): 我们先看看扑克牌的例子。一张牌有两个关键字组成:花色(桃<心<梅<方)+面值(2...2010-04-20 16:17:21 · 159 阅读 · 0 评论 -
【串和序列处理 8】最长平台问题
1、经典最长平台算法 已知一个已经从小到大排序的数组,这个数组中的一个平台(Plateau)就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中[1]、[2,2]、[3,3,3]、[4]、[5,5]、[6]都是平台。是编写一个程序,接受一个数组,把这个数组中最长的平台找出来。在上面的例子中3,3,3就是该数组中最长的...2010-04-28 16:41:12 · 670 阅读 · 0 评论 -
★经典问题—元素选择问题
元素选择问题 : 给定线性序集中n个元素和一个整数k(1<=k<=n),要求找出这n个元素中第k小的元素(第n-k大)。这一问题可以演化成找最大最小值、找中位数等。 最简单思想:如果是直接找最大最小值,则可以通过N次比较来完成,其时间复杂度为O(N),空间复杂度为O(1)。除此之外,对于一般的k值,可以考虑对序列N先进行排序,然后直接定位第k个位置上的数即可...原创 2010-05-24 10:53:35 · 353 阅读 · 0 评论 -
【串和序列处理 6】LCS 最长公共子序列
LCS:又称最长公共子序列。其中子序列(subsequence)的概念不同于串的子串。它是一个不一定连续但按顺序取自字符串X中的字符序列。例如:串"AAAG"就是串“CGATAATTGAGA”的一个子序列。 字符串的相似性问题可以通过求解两个串间的最长公共子序列(LCS)来得到。当然如果使用穷举算法列出串的所有子序列,一共有2^n种,而每个子序列是否是另外一个...2010-03-23 17:38:47 · 155 阅读 · 0 评论 -
【串和序列处理 5】KMP子串匹配算法
模式匹配:在字符串S中,子串P的定位操作通常称做串的模式匹配。说白了,就是在一个字符串中寻找子串。在Suffix Trie和PAT tree中我们已经讨论过匹配子串的方法了。这里我们讨论一种线性匹配算法来寻找子串。 例: 我们要在S="ababcabcacbab"中查找子串P="abcac"。下图左侧是一种很普通的模式匹配算法这种普通的模式匹配算法很简单,但时间复杂度是O(...2010-03-22 19:59:46 · 310 阅读 · 0 评论 -
【查找结构 2】二叉查找树 [BST]
当所有的静态查找结构添加和删除一个数据的时候,整个结构都需要重建。这对于常常需要在查找过程中动态改变数据而言,是灾难性的。因此人们就必须去寻找高效的动态查找结构,我们在这讨论一个非常常用的动态查找树——二叉查找树。 二叉查找树的特点 下面的图就是两棵二叉查找树,我们可以总结一下他的特点:(1) 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值...2010-03-06 16:44:16 · 103 阅读 · 0 评论 -
【查找结构3】平衡二叉查找树 [AVL]
在上一个专题中,我们在谈论二叉查找树的效率的时候。不同结构的二叉查找树,查找效率有很大的不同(单支树结构的查找效率退化成了顺序查找)。如何解决这个问题呢?关键在于如何最大限度的减小树的深度。正是基于这个想法,平衡二叉树出现了。 平衡二叉树的定义 (AVL—— 发明者为Adel'son-Vel'skii 和 Landis) 平衡二叉查找树,又称...2010-03-08 10:00:40 · 164 阅读 · 0 评论 -
【查找结构5】多路查找树/B~树/B+树
在前面专题中讲的BST、AVL、RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关。那么降低树高自然对查找效率是有所帮助的。另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实际背景下,平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。那么如何减少树的深度(当然不能减少查询数据量),一个基本的想法就是:1. 每个节点存储多个元素(但元素数量不能...2010-03-09 11:56:52 · 225 阅读 · 0 评论 -
【查找结构4】红黑树 [RBT]
大部分转载:http://yanglongylj.blog.163.com/blog/static/563834532009113021438417/ 红黑树的性质与定义红黑树(red-black tree)是一棵满足下述性质的二叉查找树:1. 每一个结点要么是红色,要么是黑色。2. 根结点是黑色的。3....2010-03-10 10:58:07 · 106 阅读 · 0 评论 -
【查找结构6】动态查找树比较
我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)。这四种树都具备下面几个优势:(1) 都是动态结构。在删除,插入操作的时候,都不需要彻底重建原始的索引树。最多就是执行一定量的旋转,变色操作来有限的改变树的形态。而这些操作所付出的代价都远远小于重建一棵树。这一优势在《查找结构专题(1):静态查找结构概论》...2010-03-12 13:32:47 · 246 阅读 · 0 评论 -
【串和序列处理 1】PAT Tree 子串匹配结构
Patricia Tree 简称PAT tree。它是 trie 结构的一种特殊形式。是目前信息检索领域应用十分成功的索引方法,它是1992年由Connel根据《PATRICIA——Patrical Algorithm to Retrieve Information Coded in Alphanumeric》算法发展起来的。 PAT tree 在字符串子串匹配...2010-03-14 19:10:28 · 192 阅读 · 0 评论 -
【串和序列处理 2】字符串编辑距离算法
我们来看一个实际应用。现代搜索技术的发展很多以提供优质、高效的服务作为目标。比如说:baidu、google、sousou等知名全文搜索系统。当我们输入一个错误的query="Jave" 的时候,返回中有大量包含正确的拼写 "Java"的网页。当然这里面用到的技术绝对不会是我们今天讲的怎么简单。但我想说的是:字符串的相似度计算也是做到这一点的方法之一。 字符串编辑距离:是一种...2010-03-15 08:45:21 · 290 阅读 · 0 评论 -
【串和序列处理 3】Trie Tree 串集合查找
Trie 树,又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。 Trie 有三种结构: 标准trie (standard trie)、压缩trie、后缀trie(suffix trie)。最后一种将在《字符串处理4:后缀树》中详细讲,这里只将前两种。...2010-03-18 13:40:32 · 205 阅读 · 0 评论 -
【串和序列处理 4】Suffix Trie 子串匹配结构
Suffix Trie:又称后缀Trie或后缀树。它与Trie树的最大不同在于,后缀Trie的字符串集合是由指定字符串的后缀子串构成的。比如、完整字符串"minimize"的后缀子串组成的集合S分别如下: s1=minimize s2=inimize s3=nimize s4=imize ...2010-03-20 15:15:25 · 221 阅读 · 0 评论 -
★经典问题—欧几里得求最大公约数
问题:快速求取正整数a,b的最大公约数? 欧几里得算法(又称辗转相除法) 定理:gcd(a,b) = gcd(a,a mod b) 证明:对于任何正整数a,b。如果a>b,都有a=k*b+r 即r=a-k*b => r=a mod b. 假设d为a,b的公约数,则a=a1*d,b=b1*d。 ...2010-03-20 19:21:56 · 164 阅读 · 0 评论 -
★经典问题—链表中的环问题
转载:http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html作者:胡满超 from:C++博客 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到...原创 2010-06-29 14:43:00 · 137 阅读 · 0 评论