JasonBourne

数据结构与算法:队列

队列是一种操作受限的线性表数据结构,它的特点是只允许在表的前端进行删除操作,而在表的后端进行插入操作。即先进者先出。队列只支持两个基础操作,入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。 顺序队列和链式队列 队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。 用数组实现队列需要两...

数据结构与算法:链表

定义 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表和数组一样,作为最底层的数据结构,是很多其他数据结构的底层实现,比如可以用链表来实现队列、栈等等。相比数组对连续内...

数据结构与算法:堆

堆是一种特殊的树,首先,它是一个完全二叉树,其次它的每个节点的值都必须大于(或小于等于)其子节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。 堆的实现 堆是一颗完全二叉树,所以优先使用数组存储,相比与链表法可以更节省存储空间。因为我们不需要存储左右子节点的指针,单纯地通过数组的下标,...

数据结构与算法:散列表

散列表(hash table),又名‘hash表’,它用的是数组支持按照下标随机访问数据(时间复杂度O(1))的特性,所以散列表其实就是基于数组结构的一种扩展。简单的来说,就是把键值通过散列函数求得hash值之后,对数组容量进行取模运算,得到存放在数组位置的下标值,当我们按照键值查询元素时,我们用同样的方法将键值转化数组下标,从对应的数组下标的位置取数据。散列表这种数据结构虽然支持非常...

数据结构与算法:图

图是一种非线性的数据结构,表示多对多的关系。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 拿微信举例子,我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就...

数据结构与算法:深度广度优先搜索

什么是深度、广度优先搜索 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法就是基于“图”这种数据结构的。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。 图的存储邻接表存储方式的实现: public class Graph { // 无向图 private int v; // 顶点的个数 private LinkedList&l...

数据结构与算法:复杂度分析

为什么需要复杂度分析 数据结构与算法要解决的是快和省的问题,即如何让代码运行的更快,如何让代码更省存储空间。那么,执行效率就是算法一个非常重要的考量指标。事后统计法虽然也能帮助我们了解算法的执行效率,但是它有很大的局限性。一是非常依赖测试环境,不同级别的硬件设备,会显示出截然不同的结果;二是测试结果受到数据规模的影响,数据规模较小时,无法表现出一些算法的特性。而时间、空间复杂度分析就可以帮...

数据结构与算法:二叉树

树是一种非线性表结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。 树的各种概念 如下图,A 节点就是 B 节点的父节点,B 节点是...

数据结构与算法:二分查找

二分查找(Binary Search)算法,也叫折半查找算法。它针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 时间复杂度 我们假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。 可以看出来,这...

数据结构与算法:字符串匹配算法

编程语言提供的字符串查找函数,它们的底层就是依赖的字符串匹配算法。 BF算法 BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。 它的主要思想是在主串中,检查起始位置分别是 0、1、2….n-m 且长度为 m 的 n-m+1 个子串,...

数据结构与算法:B+树

B+树介绍 B+树是B树的一种变种,因此若想了解B+树,首先要了解B树的定义。B树又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用M表示。一般从查找效率考虑,通常要求M>=3。一棵M阶B树,有如下特性: 若根节点不是叶子结点,则至少有两棵树。 每一个节点最多M棵子树,最多有M-1个关键字。 除根节点外,其他的每个分支至少有ceil(M/2)个子...

数据结构与算法:数组

定义 数组是一种线性表数据结构,它用一段连续内存空间,来存储一组具有相同类型的数据。对于数组的定义有几个关键点:线性表,连续内存空间,相同类型数据。 线性表,顾名思义,就是数据像一条线一样串联的数据结构,结构中的每条数据最多只有前后两个方向,链表/栈/队列都属于线性表数据结构。而树/图等数据结构因为数据不是简单的前后关系,所以不属于线性表结构。 连续内存空间和相同类型数据则是数...

etcd 学习总结:分布式键值存储的核心原理

简介 etcd 是一个分布式、可靠的键值存储系统,专为分布式系统中的关键数据设计。它提供简单性、安全性、高性能和可靠性,广泛应用于 Kubernetes 等生产环境,是现代微服务架构中不可或缺的组件。 核心特性 强一致性:基于 Raft 算法,确保集群中各节点的数据强一致性 高可用性:支持集群部署,当节点故障时自动切换 高性能:支持线性一致性读取和批量提交优化写入性能 ...

MySQL 索引

索引简介 索引是数据库中一种排序的数据结构,用于提升数据查询效率 索引的分类 聚簇索引与非聚簇索引 数据行与索引结构组织在一起的索引为聚簇索引,反之则为非聚簇索引。 按底层结构实现划分 有序数组:可以通过二分法快速(O(logn))定位数据,但是当数组插入新数据时,需要移动插入位置后面的数据。适合在静态数据中使用。 哈希表:哈希表非常适合存储key-value型数据,查...