数据结构
文章平均质量分 51
数据结构学习笔记
华der
记录学习的点点滴滴~~~
展开
-
哈希表
哈希表充分体现了算法设计领域的经典思想:空间换时间。 ①哈希函数的设计:“键”通过哈希函数得到的“索引”分布越均匀越好。对整型:小范围正整数直接使用。小范围负整数可以进行偏移为正整数。大整数,可以通过取模的方式,只取后几位。(模一个素数,可以让结果尽量均匀分布)对浮点型:转为整型处理。对字符串:转为整型对复合类型:转为整型(...原创 2019-01-09 21:56:31 · 173 阅读 · 0 评论 -
红黑树
目录红黑树2-3树红黑树红黑树2-3树基于二分搜索树(二叉查找树),实现的一棵绝对平衡的树。 参考:二分搜索树注:二叉查找树是向下生长,而2-3树是向上生长。目的:为了解决二分搜索树的不平衡性(二分搜索树在最坏情况下可能退化成链表)。2节点:含有一个键(及值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3...原创 2019-01-09 15:17:07 · 222 阅读 · 0 评论 -
自定义AVL树(2):实现集合(Set)与映射(Map)
通过AVL树的方式实现自定义集合(Set)和自定义映射(Map)。 参考:自定义集合(Set) Set.java参考:自定义映射(Map) Map.java参考:自定义AVL树 AVLTree.java 包结构:实现自定义集合(Set):package AVL;public class AVL...原创 2019-01-03 22:57:11 · 424 阅读 · 0 评论 -
自定义AVL树(1)
通过学习自定义平衡二叉树,了解平衡二叉树这一数据结构。AVL树是以二分搜索树为基础的改进。参考:二分搜索树之前的线段树、堆(基于完全二叉树)都是平衡二叉树。 平衡二叉树,又称AVL树,它是一种特殊的二分搜索树(或叫二叉排序树)。AVL树或者是一棵空树,或者是具有以下性质的二叉树:(1)左子树和右子树都是平衡二叉树;(2)左子树和右子树的深度(高度)之差的绝对值不超过1。...原创 2019-01-03 22:43:32 · 183 阅读 · 0 评论 -
自定义并查集
一种特殊的多叉树。主要支持两个方法:①union(p,q) ②isConnected(p,q) find方法中的路径压缩: 基于rank的优化: 以 union(4,2)为例: 将层数最少的元素2的根节点,指向层数较多的元素4的根节点。 首先是这样的 ...原创 2019-01-03 19:46:48 · 139 阅读 · 0 评论 -
自定义字典树(前缀树)
通过学习自定义字典树,了解字典树这一数据结构。 之前的二分搜索树(二叉树)、堆(完全二叉树)、线段树(平衡二叉树)都是基于二叉树。而字典树是一种多叉树。 如果有n个条目,使用树结构查询的时间复杂度为O(log n),如果有100万个条目(2^20),log n 大约为20; 而使用Trie(字典树)的时间复杂度与有多少条目无关,为O(w),w为查询单词的长度(大多数单词的...原创 2019-01-03 12:00:48 · 245 阅读 · 0 评论 -
自定义线段树(区间树)
通过学习自定义线段树(区间树),了解线段树这一数据结构。线段树首先是平衡二叉树。 用例:查询一个区间[i,j]的最大值,最小值,或者区间数字和等。实质:基于区间的统计查询。为什么用线段树: 使用数组实现 使用线段树 更新 O(n) O(log n) ...原创 2019-01-02 22:49:39 · 183 阅读 · 0 评论 -
自定义堆(2):通过堆实现优先队列
学习堆、优先队列之间的关系。 普通队列:先进先出;后进后出。优先队列:出队顺序和入队顺序无关,和优先级相关。 入队 出队(拿出最大元素) 之前自定义的普通线性结构 O(1) O(n) 之前自定义的顺序线性结构 O(n) O(1) 堆 O(log n) O(log n) 此外:优先队列应用的经典问题是:在N个元素...原创 2019-01-01 23:20:29 · 122 阅读 · 0 评论 -
自定义堆(1):实现最大堆
通过学习自定义堆,了解堆的数据结构。 本篇以最大堆为例。底层依赖了自定义数组, 参考:自定义数组 中的 Array.java所以,其时间复杂度分析: add O(log n) extractMax O(log n) replace O(log n) ...原创 2019-01-01 23:04:54 · 428 阅读 · 0 评论 -
自定义映射(Map)
通过学习自定义映射,了解映射的数据结构。 本篇分别以链表的方式和以二分搜索树的方式实现了映射。 首先写一个映射的接口,描述其具有的基本功能。Map.java然后写一个接口的实现类:其中,方式一: 用的是链表的方式。 LinkedListMap.java 方式二:用的是二分搜索树的方式。 BSTMap.java 方式一与方式二的时间复杂度分析:其中: ...原创 2018-12-29 13:36:55 · 889 阅读 · 0 评论 -
自定义集合(Set)
通过学习自定义集合,了解集合的数据结构。 本篇分别以链表的方式和以二分搜索树的方式实现了集合。 首先写一个集合的接口,描述其具有的基本功能。Set.java然后写一个接口的实现类:其中,方式一: 用的是链表的方式。 LinkedListSet.java 用到了 自定义链表 中的 LinkedList.java方式二:用的是二分搜索树的方式。 ...原创 2018-12-28 22:50:00 · 979 阅读 · 0 评论 -
自定义树(2):二分搜索树(Binary Search Tree)
二分搜索树也是一种二叉树。 二分搜索树的遍历: 层序遍历图解: 删除任意元素图解: 代码实现:package BST;import java.util.LinkedList;import java.util.Queue;public class BinarySearchTree<E extends Com...原创 2018-12-28 17:21:52 · 349 阅读 · 0 评论 -
自定义树(1):二叉树
通过学习自定义树,了解与树相关的数据结构。 1)树:n(n>=0)个结点的有限集。结点的度:结点拥有的子树的数目叶子结点(终端结点):度为0的结点分支结点(非终端结点):度不为0的结点树的度:树中各结点的度的最大值层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1树的深度(高度):树中结点的最大层次2)森林是指m(m>=0)...原创 2018-12-28 14:21:22 · 210 阅读 · 0 评论 -
自定义链表(3):用链表的方式实现队列
通过学习自定义链表,了解链表的数据结构。本篇以链表的方式实现队列。(参看数组队列 ,以及 循环队列) 首先写一个队列的接口,描述其具有的基本功能。参看 自定义队列:Queue.java然后写一个接口的实现类,这只是其中一种实现方式。LinkedListQueue.java最后写一个测试类,测试自定义队列的效果。Test.java LinkedListQueue...原创 2018-12-26 22:38:05 · 237 阅读 · 0 评论 -
自定义链表(2):用链表的方式实现栈
通过学习自定义链表,了解链表的数据结构。本篇以链表的方式实现栈。(参看以数组的方式实现栈) 虽然自定义链表(1)中的链表的时间复杂度都为O(n),但若只对链表的表头进行增、删、查,都为O(1),利用这一点,可以用来实现栈。 首先写一个栈的接口,描述其具有的基本功能。Stack.java然后,引用自定义链表(1)中的: LinkedList.java然后写一个接口的...原创 2018-12-26 22:16:49 · 155 阅读 · 0 评论 -
自定义链表(1)
通过学习自定义链表,了解链表的数据结构。首先写一个链表类 :LinkedList.java最后,测试: Test.java、 知识点:1.链表的内部维护了一个节点Node类。该类包括数据域和指针域(指针域指向下一个Node节点)2.通常需要一个虚拟头结点,但不是必须的。 结构:LinkedList.java:package LinkedList...原创 2018-12-26 21:53:18 · 442 阅读 · 0 评论 -
自定义队列(2):循环队列
通过学习自定义队列,了解队列的数据结构。首先写一个队列的接口,描述其具有的基本功能。Queue.java然后写一个接口的实现类,这只是其中一种实现方式,为循环队列。LoopQueue.java最后写一个测试类,测试自定义数组队列的效果。Test.java 在 自定义队列(1):数组队列 这篇文章中,数组队列的dequeue()方法的时间复杂度为O(n),这是因为,数组队列中,每...原创 2018-12-26 17:22:14 · 203 阅读 · 0 评论 -
自定义队列(1):数组队列
通过学习自定义队列,了解队列的数据结构。首先写一个队列的接口,描述其具有的基本功能。Queue.java然后写一个接口的实现类,这只是其中一种实现方式,为数组队列。ArrayQueue.java最后写一个测试类,测试自定义数组队列的效果。Test.java整个栈的实现,借助了 自定义数组 这篇文章的类。Array.java结构:Queue.java:packag...原创 2018-12-26 16:23:37 · 351 阅读 · 0 评论 -
自定义栈:用自定义的静态数组的方式
通过学习自定义栈,了解栈的数据结构。首先写一个栈的接口,描述其具有的基本功能。Stack.java然后写一个接口的实现类,这只是其中一种实现方式。ArrayStack.java最后写一个测试类,测试自定义栈的效果。Test.java整个栈的实现,借助了 自定义数组 这篇文章的类。Array.java结构如下: Stack.java:package algorith...原创 2018-12-26 10:24:34 · 148 阅读 · 2 评论 -
自定义数组
通过学习自定义数组,了解数组的数据结构。package algorithm;public class Array<E> { private E[] data; private int size;//数组的实际大小 /** * 无参的构造函数,默认初始容量 */ public Array() { this(10);//默认初始容量为10 } /** ...原创 2018-12-25 22:33:44 · 2123 阅读 · 0 评论