数据结构
腾阳山泥若
简单记录开发中遇到的问题,方便快速查找
展开
-
【跳表】
跳变是一种高效的搜索结构,是对链表的一种优化,如下图所示,以下图片均摘自博客,原始的链表结构如下图,实现查找、删除和插入复杂度都为O(n),因为需要遍历链表而跳表的思想如下,即多加一些索引,高层的索引跳跃连接,可以更快地抵达要查找的目标节点,查找时先从最高层索引开始,高速前进,当下一个节点的值大于要查找的值时就进入下一层,相当于减速,直到最底层找到目标节点,相对于原始链表,优势在于高层索引可以快速跨越,能实现O(logn)级别的查找、删除和插入。Java实现如下,相对于红黑树等二分查找结构实现更简单原创 2020-08-22 17:29:02 · 108 阅读 · 0 评论 -
【并查集】Java实现
并查集理解并查集的两个重要操作为find(x):找到x所属的父亲union(x, y):将x和y所属的集合合并Java实现如下class UnionFindSet { public int[] parent; public UnionFindSet(int n) { parent = new int[n]; for (int i = 0; i < parent.length; i++) parent[i] = -1; } public int find(int原创 2020-07-28 22:56:06 · 187 阅读 · 0 评论 -
【堆】建堆、插入、删除、堆排序
参考堆就是利用数组来实现二叉树,可用于构建优先队列、堆排序、TopK问题等。可分为:最大堆:父节点的值比其子节点大最小堆:父节点的值比其子节点小堆的根节点存放了最小(或最大)元素,但是其它节点的排序是未知的,即左节点不一定比右节点大(或小),堆的搜索相对于二叉搜索树更慢,二叉搜索树(如AVL)是平衡二叉树,搜索时间复杂度为O(nlogn),而堆的目的只是为了获得最大(或最小)元素,将其存储在头节点。实现堆只需要一个顺序存储结构的数组,相对于二叉树而言,空间开销更低,二叉树还需要分配左右指针占用原创 2020-07-19 11:14:10 · 447 阅读 · 0 评论 -
【二叉树】平衡二叉树
平衡二叉树是一种二叉查找树又称为AVL树(Adelsen-Velskii and Landis),特点为每个节点的左、右子树深度之差的绝对值不大于1,左子树的值小于右子树,重要操作为插入和删除。插入插入新节点后可能导致树中的节点不平衡,插入新节点后要从插入位置沿着根回溯,找到第一个不平衡的节点,沿回溯路径往下取两层节点,然后进行平衡化处理:单向右旋单向左旋先左后右旋转先右后左旋转当三个节点处于同一直线(“\”或“/”)时进行单向旋转,否则(“<”或“>”)进行两次旋转。例子原创 2020-07-06 17:30:15 · 717 阅读 · 0 评论 -
【二叉树】创建、先序遍历、中序遍历、后序遍历、层序遍历 Java实现
三种遍历的区别在于访问语句的位置,如下,先序遍历先访问根节点,中序遍历在中间访问根节点,后序遍历最后访问根节点。先序遍历void PreOrderTraverse ( BinTree T ) { if (T) { cout << T->data; PreOrderTraverse ( T->lChild ); PreOrderTraverse ( T->rChild ); }}中序遍历void InOr原创 2020-07-06 14:35:42 · 279 阅读 · 0 评论