
数据结构和算法
文章平均质量分 70
程序猿进阶
要做就做第一,就算结果不是第一,也会是一个好成绩。 加油!我的未来不是梦。
展开
-
广度/深度优先搜索多维数据的理解
广度优先搜索(BFS)和深度优先搜索(DFS)是两种基本且重要的图搜索算法,它们在处理多维数据时各有优劣。BFS适用于寻找最短路径和层次遍历,而DFS适用于连通性检查和拓扑排序。理解这两种算法的底层逻辑和应用场景,有助于在实际问题中选择合适的算法。原创 2024-09-22 11:02:42 · 1296 阅读 · 20 评论 -
数组(数据结构)
数组Array是一种线性表数据结构,它用一组连续的内存空间,存储一组具有相同类型的数据。数组因具有连续的内存空间的特点,数据拥有非常高效率的“随机访问”,时间复杂度为O(1)。但因要保持这个连续的内存空间,导致数组在删除或插入操作的时非常低效。因为数组为了保持连续性,必然会涉及大量数据的迁移,这个是非常消耗时间的,平均时间复杂度为O(N)。原创 2023-10-04 22:14:58 · 1069 阅读 · 2 评论 -
队列——底层实现
队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。数组模拟环形队列 【1】队列本身是有序列表,若使用数组的结构来存储队列数据,队列数组的声明如下,其中 maxSize 是该队列的最大容量;分析环形数组实现思路:【1】尾(tail)索引的下一个为头(front)索引表示队列为满(因为判断空和判断满冲突,因此需要空出一个格子来做一个约定,相当于最多只能存放 maxSize - 2 的数据,浪费一个格子)这里判断队列满的公式:(tail+1)%maxSize == front ..原创 2021-03-29 22:07:09 · 1102 阅读 · 1 评论 -
栈——底层实现
栈的一个实际需求:请输入一个表达式,计算式:[7*2*2-5+1-5+3-3]点击计算【如下图】一、栈的介绍【1】栈的英文为(stack);【2】栈是一个先入后出(FILO-First In Last Out)的有序列表;【3】栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。【4】根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素原创 2021-03-29 22:07:06 · 688 阅读 · 0 评论 -
稀疏数组
一、稀疏数组的定义稀疏(sparsearray)数组:可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组。稀疏数组的应用场景:五子棋程序,有存盘退出和续上盘的功能,将五子棋盘转化成二维数组如下所示:分析上述问题:因为该二维数组默认的地方值为0,因此记录了很多没有意义的数据。当遇到此种情况时,可以使用稀疏数组。当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是: ■ 数组的第一行用于记录数组一共有几行几列..原创 2021-03-29 22:07:03 · 1250 阅读 · 0 评论 -
Hash 表
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。数组的优缺点是:寻址容易,插入和删除困难;链表的优缺点是:寻址困难,插入和删除容易;我.原创 2021-03-29 22:07:01 · 1242 阅读 · 1 评论 -
链表——底层原理
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。链表是有序的列表,但是它在内存中是存储如下:一、单链表介绍【1】一种最简单的结点结构如图所示,它是构成单链表的基本结点结构。在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。因为只有一个指针结点,称为单链表:【3】在单链表结构中还原创 2021-03-28 22:51:01 · 1116 阅读 · 0 评论 -
堆排序算法原理
它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。一、什么是堆【1】堆是一个完全二叉树,特点是从上往下,从左往右以次排列的;【2】在堆的数据结构中,堆中的最大值总是位于根节点,所有父节点都满足大于等于其子节点; 二、创建堆【需求】:将下面的二叉树,变成一个平衡二叉树。 【思路】:【1】先创建一个 heapfiy() 方法,从4号节点开始判断是否大于其孩子节点,如果否,则进行交换,并递归对4号节点进行 heapfiy() 操作。具体看....原创 2021-03-28 22:50:05 · 1140 阅读 · 0 评论 -
算法——归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。一、归并排序的思想【1】如下图,可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程。二、归并排序案例归并排序的应用案例:给你一个数组,.原创 2021-03-28 22:48:27 · 1213 阅读 · 0 评论 -
快速排序
快速排序(QuickSort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将需要排序的数据分成独立两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按照此方法对这两组数据分别进行快速排序,这个排序过程可以递归进行,以此达到整个数据变成有序序列。一、基本介绍快速排序是实践中的一种快速的排序算法,在对 Java基本类型的排序中特别有用。它的平均运行时间是。该算法之所以特别快,主要是由于非常精练和高度优先的内部循环(递归)。它的最坏情形性能为,但进行简单修改就可以使该情形极难出现。下.原创 2021-03-28 22:46:53 · 1446 阅读 · 0 评论 -
红黑树结构
AVL (平衡二叉树:追求"完全平衡")树的另一种变种是红黑树(Red-Black-Tree:只要求部分达到平衡)其就是一个二叉查找树。对红黑树的操作在最坏情形下花费 时间。红黑树是具有下列着色性质的二叉查找树:【1】每个节点或者是黑色,或者是红色。【2】根是黑色的;【3】每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!];【4】如果一个节点是红色的,则它的子节点必须是黑色的;【5】从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点; .原创 2021-03-28 22:46:13 · 2933 阅读 · 1 评论 -
B树、B+树、B*树——简单介绍
一、为什么是有B树二叉树存在的问题:二叉树的构建是在内存中执行的,需要将磁盘中的文件通过 IO操作进行读取。如果二叉树的节点少,这样也没有问题,但是如果二叉树的节点很多(比如说一个亿),则存在如下问题:【1】在构建二叉树时,需要多次进行 IO操作(海量数据存储在数据库或者文件中),节点海量,构建二叉树时,速度有影响。【2】节点海量,也造成了二叉树的高度很高,会降低操作速度。二、B树(多叉树)【1】在二叉树中,一个节点最多可以有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是原创 2021-03-28 22:44:52 · 1051 阅读 · 2 评论 -
雪花算法 SnowFlake 内部结构【分布式ID生成策略】
一、前言 如何在分布式集群中生产全局唯一的 ID?【方案一】UUID:UUID是通用唯一识别码 (Universally Unique Identifier),在其他语言中也叫GUID,可以生成一个长度 32位的全局唯一识别码。UUID 虽然可以保证全局唯一,但是占32位而且无序,入库性能比较差。//例如:44e128a5-ac7a-4c9a-be4c-224b6bf81b20String uuid = UUID.randomUUID().toString()举个例子:MySQL 使用 .原创 2021-03-28 22:44:02 · 4855 阅读 · 2 评论 -
选择排序
选择排序是一种简单直观的排序算法,其基本原理,对于一组记录的数据,通过第一次比较得到最小的记录,然后将该记录与第一条记录的位置交换;接着对不包含第一个以外的记录进行比较,得到最小记录并与第二个记录进行位置交换;重复该过程,知道进行比较的记录只有一个时为止。以数组 {38,65,97,76,13,27,49} 为例: 13[65 97 76 38 27 49] 13 27[97 76 38 65 49] 13 27 38[76 97 65 49] 13 27 38 49...原创 2021-03-28 22:41:27 · 1128 阅读 · 1 评论 -
插入排序
对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列。接着从而个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一条记录插入到有序序列中为止。例如:数组 {38,65,97,76,13,27,49}第一步插入38以后:[38]65 97 76 13 27 49第一步插入65以后:[38 65]97 76 13 27 49第一步插入97以后:[38 65 97]76 13 27 49第一步插入76以后:[38 65 76 97]13 27 .原创 2021-03-28 12:35:14 · 1532 阅读 · 1 评论 -
冒泡排序
冒泡排序顾名思义就是整个过程就像气泡一样往上升,单向冒泡排序的基本思想是(假设由小到大排序):对于给定的 n 个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和换位后,n 个记录中的最大记录将位于第 n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个为止。以数组 {45,3,2,5,7,8,32,9,1,22,0} 为例,冒泡排序的具体步骤如下:[3, 2, 5, 7, 8, 32, 9, 1, 22, 0.原创 2021-03-28 12:34:17 · 1198 阅读 · 1 评论