![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
我的数据结构之旅
文章平均质量分 91
不能说的秘密go
求知若饥,虚心若愚
展开
-
线性表学习笔记
Java集合中的List代表一种集合元素允许重复,允许有序的集合。因此,可以通过下标索引来访问List集合中的元素。那么在什么情况下需要使用List集合?如果有一组数据节点,其中多个数据节点之间有松散的一对一关系,类似于A数据节点之后是B数据节点的这种关系,我们应该使用List的集合来保存。换一个角度来看,存在这种松散的,一对一关系的多个数据节点就是典型的线性结构,应该使用线性表来保存它们。Java原创 2017-01-04 00:04:44 · 2304 阅读 · 0 评论 -
B+树在数据库索引中的应用
目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构(更少的磁盘I/O操作次数的渐进复杂度)一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复...原创 2018-05-05 14:37:19 · 1779 阅读 · 0 评论 -
搜索树之B-/B+树的特性与实现
现代计算机中,在内存与外存(磁盘)组成的二级存储系统中, 数据全集往往存放于外存中,计算过程中则可将内存作为外存的高速缓存,存放最常用数据项的复本。借助高效的调度算法,如此便可将内存的“高速度”与外存的“大容量”结合起来。 两个相邻存储级别之间的数据传输,统称I/O操作。各级存储器的访问速度相差悬殊,故应 尽可能地减少I/O操作。仍以内存与磁盘为例,其单次访问延迟大致分别在纳秒(ns)和毫秒(m...原创 2018-04-19 00:59:21 · 5847 阅读 · 1 评论 -
红黑树的特性和实现
平衡二叉搜索树的形式多样,且各具特色。比如,伸展树实现简便、无需修改节点 结构、分摊复杂度低,但可惜最坏情况下的单次操作需要n时间,故难以适用于对可靠性和稳定性要求极高的场合。 反之,AVL树尽管可以保证最坏情况下的单次操作速度,但需在节点中嵌入平衡因子等标识;更重要的是,删除操作之后的重平衡可能需做多达logn次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。红黑树即是针对后一不足的改进...原创 2018-04-23 00:13:34 · 8623 阅读 · 0 评论 -
伸展树的特性及实现
除了AVL树,本章将按照二叉搜索树的介绍,继续介绍平衡二叉搜索树家族中的另一个成员—Splay伸展树。相对于AVL,Splay的实现更为简捷。伸展树无需时刻都严格地保持全树的平衡,但却能够在任何足够长的真实操作序列中,保持分摊意义上的高效率。伸展树也不需要对基本的二叉树节点结构,做任何附加的要求或改动,更不需要记录平衡因子或高度之类的额外信息,故适用范围更广。通常在任意数据结构的生命期内,...原创 2018-04-16 23:59:17 · 6866 阅读 · 4 评论 -
十种常见的排序算法总结(java版)
排序是程序开发中非常常见的操作,对一组任意的数据元素经过排序操作后,就可以把他们变成一组一定规则排序的有序序列。排序算法属于算法中的一种,而且是覆盖范围极小的一种,但彻底掌握排序算法对程序开发是有很大的帮助的。对于一种算法,一般从如下3个方面来衡量算法的优劣。 时间复杂度 空间复杂度 稳定行 对于一般的排序,可以使用非常简单的排序来完成,如直接选择,直接...原创 2016-03-06 23:03:54 · 7215 阅读 · 5 评论 -
AVL树的实现
前面笔者介绍了二叉搜索树的一般实现和平衡二叉树的实现原理。 本篇文章将继续前文的平衡搜索树来介绍一种具体的平衡搜索树—AVL树。AVL树的特性AVL树中,对于任一节点V,其左右子树的高度差不能超过1。这个高度差定义为平衡因子。原创 2018-01-01 17:55:55 · 3337 阅读 · 2 评论 -
平衡二叉搜索树的实现原理
二叉搜索树的树高与性能前面笔者介绍了二叉搜索树的实现和性能分析,查询,插入和删除等操作均线性正比于二叉树的高度。在最坏的情况下,线性表退化为列表,二叉搜索树的性能会降低至O(n)。因此,如果能控制树高,则二叉搜索树的性能会明显提升理想平衡与适度平衡理想平衡既然二叉搜索树的性能主要影响与树高,则应该在节点数目固定的前提下,尽可能降低树高。也意味着,应尽可能地使兄弟子树的高度彼此接近,即全树尽可能的平衡原创 2017-12-31 22:08:21 · 1396 阅读 · 0 评论 -
从最小支撑树和最短路径树学习图的优先级搜索
前面笔者介绍了图的广度优先搜索算法和图的深度优先搜索。这两种搜索虽然各有特点,但基本结构却几乎相同。都需要通过迭代逐一发现各顶点,将其归纳到遍历树中做相应的处理。两种算法的唯一差别在于,如何选取下一个节点的问题。如果将选取下一节点的策略抽象为获取优先级最高的节点,则对于BFS或是DFS则可统一处理,他们的区别仅在于更新节点的优先级的策略不同而已。根据优先级来遍历,称为优先级搜索。原创 2017-12-17 16:02:11 · 2816 阅读 · 0 评论 -
二叉搜索树基本操作的实现
对线性表比较熟悉的读者会很清楚线性表的查找性能。无论是链式存储或是顺序存储,在最坏情况或是平均情况下都查需要线性时间。另外,对于堆和栈两种特殊的线性表甚至不提供对任一元素的查找接口。因此,若需要对象集合的组成可以高效地动态调整,又能高效的查找,则线性表很难胜任。高效率的动态修改和高效率的静态查找,是否能够兼顾?如果能,需要采取什么样的数据结构。笔者接下来的几篇博文,将回答这个问题。即采用树...原创 2017-12-31 19:15:15 · 1147 阅读 · 0 评论 -
图的拓扑排序及其应用
拓扑排序的定义对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。原创 2017-12-06 00:28:18 · 5369 阅读 · 0 评论 -
图的广度优先搜索算法并生成BFS树
笔者在前面的两篇文章中介绍了图的两种实现方法: 图的邻接表的实现 图的邻接矩阵的实现 接下来笔者将介绍图遍历算法原创 2017-12-04 00:11:24 · 19416 阅读 · 1 评论 -
图的深度优先搜索算法并生成DFS树
前面一篇文章介绍了图的广度优先搜索算法和BFS树,这篇文件笔者将介绍另一种图的遍历算法-深度优先算法概述深度优先搜索(Depth-First Search,DFS)选取下一顶点的策略,可概括为:优先选取最后一个被访问到的顶点的邻居。以顶点 s 为基点的 DFS 搜索,将首先访问顶点 s;再从 s 所有尚未访问到的邻居中任取其一,并以之为基点,递归地执行 DFS 搜索。原创 2017-12-04 00:59:53 · 19650 阅读 · 3 评论 -
图的邻接表的实现
上篇文章介绍了图的邻接矩阵的实现,本文即介绍图的另一种实现方法-邻接表原创 2017-12-03 22:08:01 · 3100 阅读 · 0 评论 -
图的邻接矩阵的实现
对于图的一些基本概率和术语的内容汗牛充栋,故本文不会做过多解释。仅仅总结下笔者学习图的邻接矩阵的相关知识邻接矩阵的实现原理邻接矩阵(adjacency matrix)是图ADT最基本的实现方式,使用二维数组A[n][n]来表示由n个顶点构成的图。原创 2017-12-03 19:01:51 · 30912 阅读 · 0 评论 -
二叉树的链式存储实现及遍历
关于二叉树链式存储和遍历原创 2017-11-18 21:38:59 · 4875 阅读 · 0 评论 -
二叉树的顺序存储实现及遍历
关于二叉树的实现,常见的大概有三种实现方法: 顺序存储:采用数组来记录二叉树的所有节点 二叉链表存储: 每个节点保留一个left,right域,指向左右孩子 三叉链表存储: 每个节点保留一个left, right, parent域,指向左右孩子和父亲 本文将实现顺序存储来实现一个二叉树并介绍其遍历方法原创 2017-11-08 00:57:50 · 13832 阅读 · 0 评论 -
栈和队列学习笔记
栈和队列的比较简单,两种就是一个做了某些特殊限制的线性表。比如,去除线性表中可以通过通过索引访问元素的功能。去除通过某个元素得到索引位置的功能。去除普通线性表中可以在任意位置增删的功能,而只允许在线性表的某端进行,这样线性表就变成了特殊的线性表:栈,队列。从逻辑上看。栈和队列其实是有普通线性表发展而来,普通线性表增加一些特殊的限制就可以得到栈和队列了原创 2017-01-07 22:41:13 · 1134 阅读 · 0 评论 -
主流的hash算法概述及在JDK Map中的应用
hash算法的应用场景Java中的Map实际是一个“散列表”的数据结构,散列表是逻辑上由一系列可存放词条(或其引用)的单元组成,故这些单元也称作桶(bucket) —— 一般都使用线性表来实现。一组词条在散列表内部的具体分布,取决于所谓的散列(hashing)方案:事先在词条与桶地址之间约定的某种映射关系,可描述为从关键码空间到桶数组地址空间的函数: hash() 。这里的hash()...原创 2018-05-21 15:59:57 · 1148 阅读 · 0 评论