【数据结构】常见的数据结构

1. 数组
Java的数组是引用类型,实例化后成为一个对象。
数组在内存中是一片连续的区间,具有顺序性的数据适合存放。
数组拥有索引的功能和.length的原生方法,是最底层的数据结构。
是组成高级数据结构的基石。
动态数组
数组是静态的容器,实例化后,对应的数组大小是确定的,内存空间也是连续的。动态数组解决的问题是,当存放的数据大小不确定时,数组大小进行自适应。自适应的过程实质是新创建一个大小不同的数组,并将原来的数据拷贝进这个数组。虽然说是动态数组,但本质是一种静态实现。

2.链表
Java的链表建立在引用上, 对比于数组,链表属于动态的数据结构。链表不需要使用的时候指定大小。Node是存储数据的介质,而所有Node通过引用连接在一起就变成了数据的容器。对于用户来说数据是连续的,但是内存空间是不连续的。以Node来存储的数据,只用修改引用就能完成整体数据的增删改查。当一个Node对象没有被任何对象引用的,JVM会自动回收这个空间。

public class Node {
	int value;
	Node next;
}

3.树
树是基于链表的一种数据结构。初衷是提高检索效率。特点是一个Node可以指向N个Node。

public class Node {
	int value;
	Node right, left; // 定义两个节点引用,形成二叉树
}

4.队列、栈
队列和栈都是一种高层的数据结构,从数据支持的操作来定义的。队列和栈可依赖于数组、列表、甚至是树。
队列:满足先进先出
栈:满足先进后出

5.循环队列
循环队列是基于数组的,并添加头尾指针。初衷是将出队操作的复杂度降低。从普通数组的O(n)降到O(1)。基于动态数组的循环队列的出队操作均摊复杂度也是O(1)。
在这里插入图片描述
6.二分搜索树

		43
	   /  \
	25	   57
	/ \	   / \
 12	  48  45  63

二分搜索树是基于树的数据结构,并赋予特殊的规则而形成的特殊的树。有顺序性,对二分搜索树进行中序遍历得到的结果就是数据的顺序排列。支持rank 和 select操作,也支持floor(x)(在所有数据中找到大于x并最接近x的树) ceil(y) (在所有数据中找到小于y并最接近y的元素)。二分搜索树查询的时间复杂度是O(logn) ~ O(n)。原因是二分搜索树,添加元素的时候可能会退化成链表。当数据完全随机的时候,二分搜索是还是可以保持O(logn) 的复杂度,性能较好。

7.二叉堆
二叉堆以树的形式组织数据,可以不用树的数据结构。使用的是数组的数据结构,因为二叉堆是一颗完全二叉树,可以用代码来操作下标,模拟树的左右孩子。在这里插入图片描述
8.优先队列
区别于普通队列,优先队列:出队顺序和入队顺序无关,和优先级相关。优先队列很适合用二叉堆来实现。

9.线段树
在这里插入图片描述
线段树使用树的组织形式。线段树可以看成一颗完全二叉树,也就能使用堆的性质。线段是指区间可以固定,不同区间的元素可以是动态的。往往使用线段树完成统计。

10.集合、映射
集合和映射对应Java中的Set和Map。集合和映射属于高层的数据结构。只要满足特定的方法,无论底层是怎么实现的。二分搜索树可以实现集合,带虚拟头结点的链表可以实现映射。实现集合和映射的方法还有很多。
在这里插入图片描述
在这里插入图片描述
11.Trie字典树
在这里插入图片描述

public class Trie {
	private class Node {
	
		public boolean isWord;
		public TreeMap<Character, Node> next;
		
		public Node(boolean isWord){
			this.isWord = isWord;
			next = new TreeMap<>();
		}
	}
}

Trie是树的组织形式,用到了高层数据结构映射进行实现。

12.并查集
在这里插入图片描述
在这里插入图片描述
使用数组实现,用多棵树来组织数据,特点是孩子指向父亲,可以对任意节点查找其根节点,也就方便的找到所属关系。数组元素存的是数组的下标即可。

13.AVL
在这里插入图片描述
AVL解决的二分搜索树中可能会退化成链表的隐患。引入平衡因子衡量平衡情况,平衡一旦给打破就自动校正。使用旋转操作校正。

14.2-3树
2-3树表示一个节点可以有两个叉也可以有三个叉
在这里插入图片描述
2-3树是一颗绝对平衡的树。2-3树是红黑树的基础
在这里插入图片描述

15.红黑树
java.util.TreeMap
java.util.TreeSet 的底层实现都是红黑树
在这里插入图片描述
16.哈希表
涉及哈希函数的设计,哈希冲突的处理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值