随笔分类 - 数据结构与算法
摘要:本文将总结一种数据结构:跳跃表。前半部分跳跃表性质和操作的介绍直接摘自《让算法的效率跳起来--浅谈“跳跃表”的相关操作及其应用》上海市华东师范大学第二附属中学 魏冉。之后将附上跳跃表的源代码,以及本人对其的了解。难免有错误之处,希望指正,共同进步。谢谢。 跳跃表(Skip List)是1987年才诞...
阅读全文
摘要:红黑树(一)之 原理和算法详细介绍概要目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 作者:Sky Wang 于 2013-08-08 概述:R...
阅读全文
摘要:引用:http://digital.cs.usu.edu/~allan/DS/Notes/Ch22.pdf一、简介:伸展树,或者叫自适应查找树,是一种用于保存有序集合的简单高效的数据结构。伸展树实质上是一个二叉查找树。允许查找,插入,删除,删除最小,删除最大,分割,合并等许多操作,这些操作的时间复杂...
阅读全文
摘要:三种旋转 当我们沿着树向下搜索某个节点X的时候,我们将搜索路径上的节点及其子树移走。我们构建两棵临时的树──左树和右树。没有被移走的节点构成的树称作中树。在伸展操作的过程中:1、当前节点X是中树的根。2、左树L保存小于X的节点。3、右树R保存大于X的节点。开始时候,X是树T的根,左右树L和R都是空的...
阅读全文
摘要:摊还分析本章内容:1.聚合分析2.核算法3.势能法4.动态表一 聚合分析1. 在摊还分析中,我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价,它不涉及概率,可以保证最坏情况下每个操作的平均性能。2. 摊还代价:对所有n,一个n个操作的序列最坏情况下话费时间为T(n),...
阅读全文
摘要:概要本章介绍斐波那契堆。和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现。后续再分别给出C++和Java版本的实现;实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!目录1.斐波那契堆的介绍2.斐波那契堆的基本操作3.斐波...
阅读全文
摘要:概要本章介绍二项堆,它和之前所讲的堆(二叉堆、左倾堆、斜堆)一样,也是用于实现优先队列的。和以往一样,本文会先对二项堆的理论知识进行简单介绍,然后给出C语言的实现。后续再分别给出C++和Java版本的实现;实现的语言虽不同,但是原理一样,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出...
阅读全文
摘要:题目描述输入n个整数,输出其中最小的k个。分析与解法解法一要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数。至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出...
阅读全文
摘要:Table of Contents1 遇到难题怎么办?2 什么是P、NP、NP-Complete和NP-hard3 P = NP ????4 参考1遇到难题怎么办?遇到一个问题,通常我们思考的是如何解它。于是就有了贪心、分治、动态规划等等算法;但也有一些问题,挠破了头也想不到高效的算法。怎么办?假如...
阅读全文
摘要:题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);2. 通过深搜优先生成树来判定...
阅读全文
摘要:0)引论不相交集是解决等价问题的一种有效的数据结构,之所以称之为有效是因为,这个数据结构简单(几行代码,一个简单数组就可以搞定),快速(每个操作基本上可以在常数平均时间内搞定)。首先我们要明白什么叫做等价关系,而在这个之前要先有一个关系(relation)的定义Relation:定义在数据集S上的关...
阅读全文
摘要:#include#includetypedef int ElementType;#define Cutoff (3)void swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp;}void WithSentrySort(ElementT...
阅读全文
摘要:注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序。同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现。按照功能进行模块划分的思想得到了彻底地贯彻。以下内容翻译自:http://cprogramminglanguage.net/quicksor...
阅读全文
摘要:归并排序算法实现:#include#include#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 )typedef int ElementType;void Merge(ElementType A[],Eleme...
阅读全文
摘要:堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=...
阅读全文
摘要:希尔排序通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。所以希尔排序也叫缩小增量排序。希尔排序使用一个序列h1,h2,....,hn,叫做增量序列,只要h1=1,任何增量序列都是可以的,不过有些增量序列比另外一些增量序列更好。在使用增量...
阅读全文
摘要:前言插入排序(insertion sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止.直接插入排序基本思想假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n].从i = 2起直到i = n ...
阅读全文
摘要:虽然左式堆每次操作花费O(logN),这有效的支持了合并,插入和DeleteMin,但还是有改进的余地,因为我们知道,二叉堆以每次操作花费常数平均时间支持插入。二项队列支持所有这种操作,每次操作的最坏情形运行时间为O(logN),而插入操作平均花费常数时间。二项队列结构二项队列不同于左式堆和二叉堆等...
阅读全文
摘要:简介设计一种堆结构像二叉堆那样高效的支持合并操作而且只使用一个数组似乎很困难。原因在于,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆,这将花费O(N)。正因为如此,所有支持高效合并的高级数据结构都需要使用指针。像二叉堆那样,左式堆也有结构性和堆序性。不仅如此,左式堆也是二叉树,它和二...
阅读全文

浙公网安备 33010602011771号