数据结构
文章平均质量分 94
csu_zhengzy~
做一只认真的小平头~
展开
-
一、【数据结构】向量(vector)的实现
本文使用c++实现vector数据结构,vector的接口函数采用高效的实现方式,这样一方面使我加深对数据结构的理解,另一方便可以让我再回顾回顾c++,之前写了好久python都快把c++忘记了。vector接口列表 操作 功能 对象 vector(int c, Rank s, T v) 设置容量、初始大小、元素初始值 vector(int c, Rank...原创 2018-11-20 19:07:00 · 1431 阅读 · 0 评论 -
十五、【优先级队列】左式堆(leftist heap)
一、左式堆存在的意义除了标准的插入和删除操作,堆结构在实际应用中的另一个常见的操作是合并,即将堆A和堆B重新组织成一个堆。若采用最基本的完全二叉堆数据结构,其最高效的实现策略是采用Floyd建堆算法将堆A和堆B直接重构成一个新堆,但是该算法的时间复杂度为O(n),这种性能在实际中不让人满意,而左式堆结构能保证在合并操作中只需要调整很少的点,所以能保证合并操作的时间复杂度低至O(logn)。而且...原创 2018-12-22 16:59:50 · 1040 阅读 · 0 评论 -
九、【数据结构】伸展树(splay tree )的解析与实现
和之前介绍的AVL树一样,伸展树也是平衡二叉树中的一种,但是它和AVL的原理不同,相比之下,伸展树的实现更加便捷。这里先回顾一下AVL树的特点。一、回顾AVL树的特点AVL树保证静态查找效率的关键技巧是添加约束条件,使在任意时刻(不包含瞬时状态)树的高度始终在一个很低的范围。具体的策略是引入平衡因子的概念,以及在树失衡时,使用AVL自己的一套等效旋转技巧使树恢复平衡。这种方案具有一定的...原创 2018-12-11 16:24:34 · 1428 阅读 · 1 评论 -
十四、【优先级队列】完全二叉堆(complete binary heap)
在实际环境中,普通的FIFO的队列不能保证整体效率达到最高,如CPU的多任务调度,医院诊疗等,简单的“先入先出”原则并不是很好的方案,对大多数问题而言,应该根据事物特性的指定合适的优先级方案灵活的操作,而优先级队列很适合处理这样的问题。一、优先级队列此前的搜索树结构和词典结构,都支持覆盖数据全集的访问和操作,它们定义并维护显式或者隐式的全序关系(full order)。就对外接口的功能而言...原创 2018-12-22 13:30:17 · 822 阅读 · 0 评论 -
八、【数据结构】AVL树的解析与实现
一、平衡二叉搜索树上节介绍了二叉搜索树的概念及其意义,我们可以知道二叉搜索树旨在把有序向量的二分查找策略融入到树查找中从而提高二叉树的静态查找性能。但是search(),insert()和remove()等主要接口的运行时间,均线性正比于二叉搜索树的高度。而且在最坏情况下,二叉搜索树可能彻底退化成列表,此时的查找效率甚至会降至O(n)。因此,若不能有效地控制树高,则从实际的性能而言,二叉搜索树...原创 2018-12-10 16:51:19 · 663 阅读 · 1 评论 -
十一、【数据结构】红黑树(red-black tree )的详解与实现
一、红黑树的存在意义平衡二叉搜索树的形式多样,各具特色,如伸展树实现简便,不需要修改节点的数据结构即可使分摊复杂度降低到O(logn)的量级,但是在最坏情况下单次搜索操作需要Ω(n)的时间,因此其难以被使用在核电站、医院等对可靠性和稳定性要求极高的场合。而AVL树,虽然其可以保证在最坏情况下的单次操作速度,但是其需要在节点中嵌入平衡因子标识,而更加严重的是,其在单次删除操作之后可能导致Ω(lo...原创 2018-12-15 22:53:57 · 2058 阅读 · 0 评论 -
十三、【数据结构】散列表(hashtable)的详解及实现
散列在数据结构算法中占据独特而重要地位。此类方法以最基本的向量作为底层支撑结构,通过适当的散列函,在词条的关键码与向量单元的秩之间建立起映射关系,理论分析和实验统计均表明,只要散列散列函数以及冲突排解策略设计得当,散列技术可在期望的常数时间内实现词典的所有接口。尤为重要的是,散列技术完全摒弃了基于关键码大小比较式的设计思路,其算法性能不受CBA(compare based algothrim)...原创 2018-12-20 20:32:57 · 1879 阅读 · 0 评论 -
七、【数据结构】二叉搜索树(bst)的解析与实现
本文使用C++实现二叉搜索树(binary search tree,bst)数据结构。一、为什么要引入二叉搜索树通过对向量和列表这两类线性数据结构的原理分析,我们可以发现向量结构在对静态查询操作的支持比较好,有序向量的二分查找能做到在O(logn)的时间,但是对删除和插入操作在最坏情况下能达到O(n)的时间。而与向量相对立的列表结构能很好地支持动态操作,如删除和插入只需要O(1)的时间,但...原创 2018-12-09 14:24:07 · 621 阅读 · 0 评论 -
六、【数据结构】图-邻接矩阵(adjacency matrix)的实现
本文旨采用C++实现图数据结构,具体地以邻接矩阵的方式实现图数据结构。图结构可以描述一组对象之间的二元关系,例如在城市交通中,联接于各个公交车站之间的道侣,或者在互联网中个网络节点之间的路由都可以很方便地用图结构来表述,另外在之前介绍的树结构也属于图的一种,此类一般性的二元关系,属于图论。在将一些对象之间的关系用图结构表示后,那么我们就可以使用图算法方便地解决这些对象的某些问题,比如拓扑排序,...原创 2018-12-07 10:53:07 · 5389 阅读 · 0 评论 -
十、【数据结构】B-树(B-tree)的解析与实现
一、B-树的出发点任何一种数据结构的产生都不是毫无根据凭空想象出来的,一般而言它们都是为了解决某种问题才被设计。B-树的产生主要是解决数据库查找时候对外存的访问次数的。我们知道,第一台电脑只有一万多个电子管,而现在一个硬盘都能TB的存储量级,可以说到目前为止计算机的存储能力已经有了巨大的提升。但是实际上人们对存储空间需求的增长更加迅速,现在的大型数据库都需要以TB为单位来计量,而我们知道,在相...原创 2018-12-13 13:13:57 · 1767 阅读 · 2 评论 -
五、【数据结构】二叉树(binary tree)的实现
本文使用C++实现二叉树数据结构,与之前实现的向量、列表、栈和队列不同,树是一种分层结构,虽然树是分层结构,但若附加某种约束,如遍历次序,则树结构也可以转变成线性次序,因此树属于半线性结构。树结构具有非常多的变种,在算法理论和实际应用中,各种树结构扮演着最为关键的角色。另外,任何有根有序的多叉树,都能转变成二叉树,因此二叉树数据结构具有非常重要的地位。两种特殊的二叉树:完全二叉树、满二叉树...原创 2018-12-02 21:28:53 · 2443 阅读 · 0 评论 -
四、【数据结构】队列(queue)的实现
本文使用C++实现队列数据结构,与栈一样,队列(queue)也是线性逻辑的数据结构,队列结构同样支持对象的插入和删除,但是两种操作的对象范围分别被限制于队尾和队头,并且这两种操作又分别被称为入队和出队。队列结构的特点:先进先出(First in first out,FIFO)一、队列数据结构的实现队列数据结构的实现可通过对vector或则list类封装得到,但是考虑到队列内元素的移动,...原创 2018-11-26 21:35:36 · 1115 阅读 · 0 评论 -
三、【数据结构】栈(stack)的实现
本文使用C++实现栈数据结构,栈数据结构同之前实现的vector和list数据结构一样都属于线性序列结构,但是栈的数据操作范围仅限于逻辑上的特定顶端,即只能对栈顶进行操作。由于栈结构具有的简洁性和规范性,它既为构建更复杂、更高级数据结构的基础,也是算法设计的基本出发点。鉴于其的基础性及使用的频繁程度,其常常作为标准配置的基本数据结构以硬件直接实现。因此,栈结构无论就工程或是理论而言,其基础性地位都...原创 2018-11-26 15:19:57 · 546 阅读 · 0 评论 -
二、【数据结构】列表(list)的实现
本文使用c++实现list数据结构,list的接口函数采用高效的实现方式,这样一方面使我加深对数据结构的理解,另一方便可以让我再复习复习c++,通过前几天写的vector数据结构的底层实现,我确实又进一步地熟悉使用C++进行编程,,这次写list的实现过程中,我几乎没有怎么查看《c++prime》了哈哈,就是函数对象形式的遍历函数的声明格式怎么也想不起来,后来查书才明白函数的形参其实是个类的对象,...原创 2018-11-24 14:59:20 · 2751 阅读 · 0 评论 -
十二、【数据结构】位图(bitmap)的详解与实现
一、定义 --概念部分参考http://www.iteblog.com/archives/148位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图法。引用bitset介绍:A bitset is a special contain...原创 2018-12-18 13:26:04 · 13177 阅读 · 3 评论