
数据结构
文章平均质量分 85
埃泽漫笔
OceanBase开源项目ODC(OceanBase Developer Center)的核心贡献者,Github地址:https://github.com/oceanbase/odc,希望大家能赏脸支持下我们OceanBase公司的开源项目,点亮一颗小星星就行。
Maven中央仓库OceanBase开源组件 https://central.sonatype.com/artifact/com.oceanbase/db-browser 和 https://central.sonatype.com/artifact/com.oceanbase/ob-sql-parser 的核心贡献者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构-跳表
跳表,即跳跃链表(Skip List),是基于并联的链表数据结构。跳表插入、删除、查找元素的时间复杂度跟红黑树都是一样量级的,时间复杂度都是O(logn),而且跳表有一个特性是红黑树无法匹敌的(具体什么特性后面会提到)。所以在工作中,跳表也会经常被用到。废话不多说了,开始今天的跳表学习。什么是跳表?跳表的查找、插入、删除元素的流程跳表查找、插入、删除元素的时间复杂度跳表插入元素时,如何动态维护索引?为什么Redis选择使用跳表而不是红黑树来实现有序集合?工作中其他使用跳表的场景。原创 2025-01-02 00:46:04 · 1156 阅读 · 0 评论 -
基本数据结构-数组
定义在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识arrayelementsorkey因为数组内的元素是连续存储知道了数组的数据起始地址BaseAddress ,就可以由公式BaseAddress + i * size 计算出索引 i 元素的地址i 即索引,在 Java、C 等语言都是从 0 开始size 是每个元素占用字节,例如 int 占 4 byte,double 占 8 byte小测试已知 array 的数据。原创 2024-10-21 09:11:19 · 1116 阅读 · 0 评论 -
基本数据结构-链表
定义在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续可以分类为单向链表,每个元素只知道其下一个元素是谁双向链表,每个元素知道其上一个元素和下一个元素循环链表,通常的链表尾节点 tail 指向的都是 null,而循环链表的 tail 指向的是头节点 head链表内还有一种特殊的节点称为哨兵(Sentinel)节点,也叫做哑元( Dummy)节点,它不存储数据,通常用作头尾,用来简化边界判断,如下图所示的head节点随机访问性能。原创 2024-10-21 09:15:26 · 1190 阅读 · 0 评论 -
数据结构-队列
计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾移除的一端称为头,(尾部入队,头部出队),就如同生活中的排队买商品queue先定义一个简化的队列接口/*** 向队列尾插入值* @param value 待插入值* @return 插入成功返回 true, 插入失败返回 false*//*** 从对列头获取值, 并移除* @return 如果队列非空返回对头值, 否则返回 null*/E poll();/**原创 2024-10-21 09:22:00 · 594 阅读 · 0 评论 -
数据结构-栈
计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书先提供一个栈接口/*** 向栈顶压入元素* @param value 待压入值* @return 压入成功返回 true, 否则返回 false*//*** 从栈顶弹出元素* @return 栈非空返回栈顶元素, 栈为空返回 null*/E pop();/*** 返回栈顶元素, 不弹出。原创 2024-10-22 01:07:14 · 160 阅读 · 0 评论 -
数据结构-优先级队列
例2 - 完全二叉树(Complete Binary Tree)特点:最后一层可能未填满(填满肯定算完全二叉树),靠左对齐。和普通队列一样,一端进, 另一端出,不过出队顺序不一样,按优先级出队,与FIFO有别。例1 - 满二叉树(Full Binary Tree)特点:每一层都是填满的。计算机科学中,堆是一种基于树的数据结构,通常用。完全二叉树可以使用数组来表示。原创 2024-10-22 01:19:03 · 614 阅读 · 0 评论 -
数据结构-双端队列
各种队列、栈对比定义特点队列一端删除(头)另一端添加(尾)栈一端删除和添加(顶)双端队列两端都可以删除、添加优先级队列优先级高者先出队延时队列根据延时时间确定优先级并发非阻塞队列队列空或满时不阻塞并发阻塞队列队列空时删除阻塞、队列满时添加阻塞Java 中 LinkedList 即为典型双端队列实现,不过它同时实现了 Queue 接口,也提供了栈的 push pop 等方法不同语言,操作双端队列的方法命名有所不同,参见下表吐槽一下 leetCode 命名比较 low。原创 2024-10-22 01:12:40 · 282 阅读 · 0 评论 -
数据结构-阻塞队列
普通的队列在很多场景下都不能很好地工作,例如大部分场景要求分离向队列放入(生产者)、从队列拿出(消费者)两个角色、它们得由不同的线程来担当,而之前的实现根本没有考虑线程安全问题队列为空,那么在之前的实现里会返回 null,如果就是硬要拿到一个元素呢?只能不断循环尝试队列为满,那么再之前的实现里会返回 false,如果就是硬要塞入一个元素呢?只能不断循环尝试因此我们需要解决的问题有用锁保证线程安全用条件变量让等待非空线程与等待不满线程进入等待状态,而不是不断循环尝试,让 CPU 空转。原创 2024-10-22 01:22:49 · 921 阅读 · 0 评论 -
数据结构-堆
例2 - 完全二叉树(Complete Binary Tree)特点:最后一层可能未填满(填满肯定算完全二叉树),靠左对齐。例1 - 满二叉树(Full Binary Tree)特点:每一层都是填满的。以大顶堆为例,相对于之前的优先级队列,增加了堆化等方法。遍历数组元素,按照堆的特性进行插入。给一个乱序的数组,使其元素按照大顶堆的特性进行排列。计算机科学中,堆是一种基于树的数据结构,通常用。每一层的交换次数为:节点个数*此节点交换次数。下面看交换次数的推导:设节点高度为 3。下潜最多交换次数(高度-1)原创 2024-10-22 01:45:08 · 777 阅读 · 0 评论 -
数据结构-二叉树
对于前、中两种遍历,实际以上代码从右子树向回走时,并未走完全程(stack 提前出栈了)后序遍历以上代码是走完全程了。对于后序遍历,向回走时,需要处理完右子树才能 pop 出栈。下面是一种统一的写法,依据后序遍历修改。1✔️ 左✔️ 右💤。1✔️ 左✔️ 右💤。1✔️ 左✔️ 右💤。3✔️ 左✔️ 右💤。1✔️ 左✔️ 右💤。1✔️ 左✔️ 右💤。4✔️ 左✔️ 右✔️。2✔️ 左✔️ 右✔️。5✔️ 左✔️ 右✔️。6✔️ 左✔️ 右✔️。3✔️ 左✔️ 右✔️。1✔️ 左✔️ 右✔️。原创 2024-10-22 01:50:59 · 984 阅读 · 0 评论 -
数据结构-二叉搜索树
二叉搜索树最早是由Bernoulli兄弟在18世纪中提出的,但是真正推广和应用该数据结构的是1960年代的D.L. Gries。他的著作《The Science of Programming》中详细介绍了二叉搜索树的实现和应用。在计算机科学的发展中,二叉搜索树成为了一种非常基础的数据结构,被广泛应用在各种领域,包括搜索、排序、数据库索引等。随着计算机算力的提升和对数据结构的深入研究,二叉搜索树也不断被优化和扩展,例如AVL树、红黑树等。int key;原创 2024-10-22 01:55:38 · 1204 阅读 · 0 评论 -
数据结构-AVL树
AVL 树是一种自平衡二叉搜索树,由托尔·哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字:Adelson-Velsky 和 Landis,他们是苏联数学家,于 1962 年发表了一篇论文,详细介绍了 AVL 树的概念和性质。在二叉搜索树中,如果插入的元素按照特定的顺序排列,可能会导致树变得非常不平衡,从而降低搜索、插入和删除的效率。为了解决这个问题,AVL 树通过在每个节点中维护一个平衡因子来确保树的平衡。平衡因子是左子树的高度减去右子树的高度。原创 2024-10-23 00:16:31 · 1354 阅读 · 0 评论 -
数据结构-红黑树
红黑树是一种自平衡二叉查找树,最早由一位名叫Rudolf Bayer的德国计算机科学家于1972年发明。然而,最初的树形结构不是现在的红黑树,而是一种称为B树的结构,它是一种多叉树,可用于在磁盘上存储大量数据。在1980年代早期,计算机科学家Leonard Adleman和Daniel Sleator推广了红黑树,并证明了它的自平衡性和高效性。从那时起,红黑树成为了最流行的自平衡二叉查找树之一,并被广泛应用于许多领域,如编译器、操作系统、数据库等。原创 2024-10-23 00:34:09 · 982 阅读 · 0 评论 -
数据结构-B树
B树(B-Tree)结构是一种高效存储和查询数据的方法,它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database Systems》中的,题目为"Organization and Maintenance of Large Ordered Indexes"。原创 2024-10-24 23:48:57 · 1129 阅读 · 0 评论 -
数据结构-哈希表
给每份数据分配一个编号,放入表格(数组)。建立编号与表格索引的关系,将来就可以通过编号快速查找数据理想情况编号当唯一,数组能容纳所有数据现实是不能说为了容纳所有数据造一个超大数组,编号也有可能重复解决方案有限长度的数组,hash冲突时以【拉链】方式存储数据允许编号适当重复,通过数据自身来进行区分。原创 2024-10-25 00:03:05 · 481 阅读 · 0 评论 -
数据结构-图
他因对开发结构化编程语言做出的基础贡献而获得了1972年的图灵奖,并担任德克萨斯大学奥斯汀分校的斯伦贝谢百年计算机科学主席,任职时间从1984年到2000年。如果在 3 层循环结束后,在 dist 数组的对角线处(i==j 处)发现了负数,表示出现了负环。如果两个顶点之间存在路径,则这两个顶点是连通的,所有顶点都连通,则该图被称之为。中,从一个顶点开始,可以通过若干条有向边返回到该顶点,那么就形成了一个环。如果是无向图,那么边是双向的,下面是一个无向图的例子。,若子图连通,则称为连通分量。原创 2024-10-29 22:58:42 · 928 阅读 · 0 评论