随笔分类 - 数据结构和算法
摘要:首先,Shell是发明这个算法的人名,不是这个算法的思想或者特点。 希尔排序,也称为增量递减排序。基本思路,是把原来的序列,等效视为一个矩阵的形式。矩阵的列数,也称为宽度或者增量,记为w。 假设数组A[n]以及矩阵B[][],对于两者的对应关系,可以记为A[k]=B[k/w][k%w]。也就是说,A
阅读全文
摘要:快速排序是最经典和常用的排序算法了,已经有不计其数的博客0 0 首先介绍下快速排序的原理。快速排序的基础是基于这样的事实:在一个序列中,如果一个节点前面的所有元素都不大于它,后面的所有元素都不小于它,那么当整个序列达到有序状态时,这个节点的位置保持不变。符合这样条件的节点,称为轴点(pivot)。
阅读全文
摘要:这几天有点抵触情绪,看过了快速排序还有一些别的东西,但是一点都不想写有点复杂的代码0 0拖到了今天终于写了前几天就应该自己写一下的堆排序,完全用C语言写的,下面把代码贴一下。很多地方写得并不好,不过已经经过了测试,可以正确运行。 建堆是最为关键的环节,可以说堆建好了才能开始进行排序。这里为了保持高效
阅读全文
摘要:二叉堆是一种优先级队列(priority queue)。搜索树维护了全部数据结构的有序性,而在我们不需要得知全局有序,仅仅需要全局的极值时,这样是一种没有必要的浪费。根据对象的优先级进行访问的方式,称为循优先级访问(call-by-priority)。优先级队列本身并不是一个队列结构,而是根据优先级
阅读全文
摘要:突然想自己写个桶排序,然后做课后题又发现了计数排序,觉得挺有趣的。不过书上都没有给代码,所以就自己写了一下代码,超级烂0 0下面先简单介绍下这两种排序 桶排序 桶排序,就是根据散列的思想进行数据的排序。假设有M个桶,采用最简单的hash(key)=key,这样无需比较,就可以把数存入相应的桶中。针对
阅读全文
摘要:散列表(hashtable)是一种高效的词典结构,可以在期望的常数时间内实现对词典的所有接口的操作。散列完全摒弃了关键码有序的条件,所以可以突破CBA式算法的复杂度界限。 散列表 逻辑上,有一系列可以存放词条的单元(桶)组成。各个桶按照逻辑次序,在物理上也应当是连续的,因而,可以采用数组来实现,散列
阅读全文
摘要:词典,顾名思义,就是通过关键码来查询的结构。二叉搜索树也可以作为词典,不过各种BST,如AVL树、B-树、红黑树、伸展树,结构和操作比较复杂,而且理论上插入和删除都需要O(logn)的复杂度。 在词典中,key和value的地位相同,支持新的循值访问(call by value)的方式。因为词典的访
阅读全文
摘要:红黑树,顾名思义,就是把平衡二叉搜索树的节点赋予两种颜色,通过定义几条规则,达到约束的目的。红黑树可以保证,每次插入删除操作后的重平衡,全树拓扑结构的改变仅需要常数个节点,最坏情况下需要对logn个节点重染色,但是就分摊意义仍然为O(1)。 需要满足的条件: (1)树根始终为黑色 (2)外部节点均为
阅读全文
摘要:B-树(是B-树不是B减树)的使用,是为了平衡的容量硬盘与较小的内存、以及不同存储器层次之间I/O操作速度的巨大差异。分级存储是行之有效的方法,借助高效的调度方法,可以将内存的“高速度”和外存的“大容量”结合起来。内存的访问速度,与硬盘的访问速度相差几个数量级,因此最好能把一部分经常用到的数据放在内
阅读全文
摘要:伸展树同样是一种平衡二叉搜索树,它的优势在于,在足够长的序列中能保证分摊意义上的高效率,同时也无需记录高度或者平衡因子等信息。 伸展树的高效前提是局部性:刚刚被访问到的数据,可能在短时间内被再次访问;将被访问的下一元素,可能就在不久之前刚刚访问过的元素的附近。因此,伸展树的策略,就是把刚刚访问到的节
阅读全文
摘要:前面写过了向量和链表的结构,前者静态性能好而动态性能差,后者则相反。考虑改进树的结构,得到动态和静态性能都让人满意的数据结构,特别是在查找以及插入删除操作上具有优势。 查找或搜索(search):从一组数据对象中找出符合条件者的操作。把数据对象,定义为词条的形式(Entry),词条的形式为关键码-值
阅读全文
摘要:当用图结构来表示通信、交通等网络,权重代表距离或者成本,寻找最短路径就成为了一个重要的任务。 给定带权网络G=(V;E),源点s,对于其他所有顶点v,寻找s到v的最短路径,连接成一颗最短路径树。可以证明,最短路径的任一前缀也是最短路径。 这一性质,可以理解为,对于一颗最短路径树,按到起点的距离排序,
阅读全文
摘要:这篇介绍的是最小支撑树,常见的有Prim算法和Krustal算法。 支撑树:连通图G的某一无环连通子图T若覆盖G中所有的顶点,则称作G的一颗支撑树或生成树(spanning tree)。 支撑树必须覆盖所有的顶点,并且不能有环路,因此是禁止环路前提下的极大子图,也是保持通路前提下的最小子图。一个图可
阅读全文
摘要:上一篇博客里面提到了优先级搜索(priority first search),单独拿出来写一篇,因为优先级搜索可以适用大部分图搜算算法。所谓优先级搜索,是在图的遍历过程中,每次迭代都更新图中某些点或者是边的优先级,随着算法的不断推进调整,每次选取顶点或者边中优先级最高的那个元素进行访问。按照这种思想
阅读全文
摘要:与其他数据结构一样,图也需要进行遍历操作,来访问各个数据点,以及后续对顶点和边进行操作。相对于树来说,图的结构更为复杂。 图的遍历,可以理解为将非线性结构转化为半线性结构的过程。我们知道,树就是一种半线性结构,经遍历而确定的边类型中,最为重要的类型就是树边,所有的树边与顶点一起构成了原始图的一颗支撑
阅读全文
摘要:图是一种很常见的结构,日常生活中的许多东西都可以视为一个图结构,比如各个公交站点以及他们之间的通路;互联网中联结于IP节点之间的路由等。二叉树也可以认为是一种图,但二元关系仅限于父子关系。一般性的二元关系,属于非线性结构,图结构中的算法,也大多通过像二叉树中的方法一样,通过某种方式得到元素之间的次序
阅读全文
摘要:前面学过的数据结构,包括向量、链表、栈、队列,从物理上或者逻辑上来说,存在一定的前后次序,并且前驱和后继是唯一的,因此称之为线性结构。然而,向量的插入和删除操作、链表的循秩访问等操作,复杂度都非常高。树的结构,可以把两种结构的优势结合起来。 与前两种结构不同,树不存在天然的直接后继或者直接前驱关系,
阅读全文
摘要:最近在学数据结构,其实之前学到过链表,不过只是看了看书,没写课后题也没做什么练习。昨天看面试题,发现大多数都是单链表,而我学的都是双链表0 0于是今天花了一天写了写单链表,以及单链表的经典题目:链表翻转,链表归并排序。还没学到快排,等学到了再补上... 首先总结一下链表的特性。常见的线性表有两种:向
阅读全文

浙公网安备 33010602011771号