首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏java学习java

    索引数据结构3

    如果 我们建了许多索引,每个索引对应B+树都要进行相关维护操作,会给性能拖后腿。 MySQL数据结构选择合理性  全表遍历 这里都懒得说了。 当 M=3 时,同样 31 个节点可以由下面 三叉树来进行存储:   B-Tree  B 树结构如下图所示: 一个 M 阶 B 树(M>2)有以下特性: 1. 根节点儿子数范围是 [2,M]。 2. 每个中间节点包含 k-1 个关键字和 k 个孩子,孩子数量 = 关键字数量 +1,k 取值范围为 [ceil(M/2), M]。 3. 上面那张图所表示 B 树就是一棵 3 B 树。 我们可以看下磁盘块 2,里面的关键字为(8,12),它 有 3 个孩子 (3,5),(9,10) 和 (13,15),你能看到 (3,5) 小于 8,(9,10) 在 8 和 12 之间,而 (13,15

    52030编辑于 2022-11-15
  • 来自专栏热爱编程的证据

    数据结构入门(3)1:顺序表接口实现

    前言 本文将一一介绍顺序表基本功能接口实现,帮助大家提高编程能力,加深对数据结构理解 本文将以动态顺序表为主进行解释 基本接口功能 #pragma once #define _CRT_SECURE_NO_WARNINGS 实现原理: 当顺序表内元素个数等于最大容量就扩容,且每次是双倍扩容,但是当最大容量为0时(创建初)将最大容量设置为4即可,这是考虑到了0*任何数都等于0情况。 这里提一下,因为relloc功能是在已经通过动态申请内存上进行扩大或缩小,但当创建初,顺序指针为空,则此时realloc功能就等于malloc。 和上面的一个原理,但不一样是将pos后面的数组按从前往后顺序往前移实现覆盖,记得size--。 ); for (int i = 0; i < psl->size; i++) { printf("%d ", psl->a[i]); } printf("\n"); } 以上这些就是顺序表基本功能实现细节

    25910编辑于 2024-02-18
  • 来自专栏c/c++

    数据结构——lesson3单链表介绍及实现

    ,所以使用结束后需要释放空间; (3)从堆上申请空间是按照一定策略分配,所以物理空间可能连续也可能不连续。 实际中更多是作为 其他数据结构子结 构,如哈希桶、图邻接表等等。另外这种结构在 笔试面试中出现很多。 (2)带头双向循环链表: 结构最复杂,一般用在单独存储数据。 实际中使用链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。 3.单链表实现 (1)单链表定义 typedef int SLTDateType; typedef struct SListNode { SLTDateType data;//存放数据 struct ,单链表实现关键在于理解它逻辑结构,包括两个变量,一个是指向数据,另一个则指向下一节点指针,此外,单链表实现还涉及了二级指针内容以及动态内存函数内容,涉及代码知识更为广泛,但是只要抓住了关键点就会发现每个函数中心思想都是不变

    29210编辑于 2024-03-13
  • 来自专栏热爱编程的证据

    数据结构入门(3)2.链表接口实现

    前言 本文将介绍链表常见功能实现 头文件 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include ,里面包含着该节点值以及指向下一个结点地址指针,用动态申请方式更加方便,插入时只需要将前一个结点里指针指向自己即可,但新结点刚创建时,里面的指针指向空,不要变为野指针。 遍历终止条件时当前指针下一个指针指向空,如果该指针指向空的话,遍历到末尾时会进一次循环,走到空,此时会丢失之前结点地址。 1.当链表有两个以上结点时,遍历到末尾结点前驱结点,然后释放掉下一个指针指向结点,再置为空即可,如果遍历到删除结点的话,你释放时就会丢失掉前一个结点地址,那个结点指针就会变成野指针。 根据free特性,可以将空和单个结点情况考虑进去。

    23210编辑于 2024-03-12
  • 来自专栏合集

    数据结构|队列实现

    队列 队列特性是先进先出。每次数据出去只能队列头部,每次数据进来只能加在队列尾部。 队列实现一般有两种方式,线性队列,链表队列。 链表队列 链表队列实现可以参考单向链表。 先建立一个普通单向链表,然后设置三个属性。队列头,用来标识当前队列头地址;队列尾,用来标识队列尾地址;队列长,记录当前队列长,理论上不给队列设置长度可以无限扩展。 每次删除数据,就把队列头标识移到下一个node地址。每次增加数据则就把队列尾指针指向node加上下一个node地址,同时把队列尾标识移过去即可。 线性队列 超简单,基于数组实现,每次删除数据则把数组第一个删除,把后续往前面移动,最后一个直接置空;添加数据只需要在最后继续添加即可;数组会有定长,删除和添加数据一定要检验。

    38620发布于 2020-06-05
  • 来自专栏我的计算机成长

    数据结构-栈实现

    1.栈概念及结构 栈:一种特殊线性表,其只允许在固定一端进行插入和删除元素操作。进行数据插入和删除操作一端称为栈顶,另一端称为栈底。 栈中数据元素遵守后进先出LIFO(Last In First Out)原则。 压栈:栈插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈删除操作叫做出栈。出数据也在栈顶。 2.栈实现实现一般可以使用数组或者链表实现,相对而言数组结构实现更优一些。因为数组在尾上插入数据代价比较小。   0,则相当于是malloc,扩容完之后就将数据放进top这个位置,然后再将top++,这样才会使得top一直是栈顶元素下一个位置。 void STPop(ST* ps, STDataType x) { assert(ps); //空 assert(ps->top > 0); --ps->top; } 2.6栈数据个数 int

    24310编辑于 2024-01-23
  • 来自专栏zxctscl个人专栏

    数据结构】堆实现

    前言 在上一篇关于树和二叉树博客中,最后提到了堆。有小根堆和大根堆。 左边结构是我们想象出来,右边才是实际存储结构。 这次来实现堆。 2. 堆实现 用数组来实现,这里以实现小堆为例子,它特点是父节点小于子节点。 先定义一个堆结构体:为了方便扩容,加了size。 2.3.2 删除代码实现 首尾交换删除,然后将php->size--,最后向下调整。 HeapDestroy(HP* php) { assert(php); free(php->a); php->a = NULL; php->size = php->capacity = 0; } 3. HeapInit(&hp); for (int i = 0; i < sizeof(a) / sizeof(int); ++i) { HeapPush(&hp, a[i]); } /*int k = 3;

    32110编辑于 2024-01-23
  • 来自专栏气象杂货铺

    xarray | 数据结构(3)

    xarray中坐标有两种类型: 维度坐标 是名称和唯一维度名称相同1D数组(打印Dataset或 DataArray时 *号标记变量)。 转换非维度坐标变量为数据变量: >> ds.reset_coords() <xarray.Dataset> Dimensions: (time: 3, x: 2, y: 2) Coordinates 坐标变量: >> ds['temperature'].reset_coords(drop=True) <xarray.DataArray 'temperature' (x: 2, y: 2, time: 3) ,比如将其转换为 Dataset: >> ds.coords.to_dataset() <xarray.Dataset> Dimensions: (time: 3, x: 2, y: variables: *empty* >> ds.coords.merge(alt.coords) <xarray.Dataset> Dimensions: (time: 3,

    2.2K21发布于 2020-04-21
  • 来自专栏Yui编程知识

    数据结构——单链表实现

    链表概念 概念:链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表中指针链接次序实现 。 这里我来解释一下什么叫做逻辑上连续而物理上补连续。 next就起到了重要作用,我们把2地址存在1next中,把3地址存在2next中,最后把3next指向NULL就可以了,再画一个图就是这样。 我还用了一个头节点来指向第一个节点,从图上来看是不是每个节点都联系了起来,这就是有了逻辑上连续。 下面我来讲解实现链表都要哪些函数。 是不是要将3节点nest指向4节点然后把4节点next指向NULL啊,没错就是这样。为了做到这样,我们要遍历一遍链表。用到while循环。 头插函数 想要实现头部插入,我们先画图。 要想吧新节点插入头部,我们就要把,新节点nest指向第一个节点,然后把pphead指向新节点。

    26610编辑于 2024-10-15
  • 来自专栏c/c++

    数据结构——循环队列实现

    之前我们学习过数据结构栈和队列,详情可点击这里数据结构——lesson5栈和队列详解进行查看,队列是一种先进先出结构,但是我们之前讲队列都是类似于线性物理结构,这次我们所介绍队列则是一直类似于环状循环结构 1.循环队列介绍 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 rear下一个元素指向front,如果增加一个空闲位置,队列满时rear下一个位置就不再指向front; 在决定选哪种方法之前,我们先要考虑一下是使用链表来实现还是使用数组也就是顺序表来实现循环队列 ;当然这里土土会将两种方法都写下来,并和大家一起分析两种方法优劣之处,以便大家选择合适和喜欢形式(对于顺序表链表有疑问可以在土土数据结构专栏里——数据结构学习笔记 进行查看复习哦~) 3.用单链表实现循环队列 ,对应数组实现循环队列则需要front,rear不断进行取模运算以防越界; 但是链表实现需要手动将开辟节点链接在一起,数组则不一样它一开辟就是地址连续一段空间; 其他实现链表和数组都差不多;

    85110编辑于 2024-03-24
  • 来自专栏技术之路

    数据结构】栈基本实现

    之前编写了自己数组,下来基于之前基础之上实现了栈基本内容 namespace DataStructure { class Program { ///

    public class Array<E> { private E[] data; private int size; //构造函数,传入数组容量 //data = (E{ })new object[capacity]; size = 0; } //无参数构造函数,传入数组容量 获取数组元素个数 public int getSize() { return size; } //获取数组容量 } res.Append("] top"); return res.ToString(); } } } 上面是栈基本实现

    21010编辑于 2024-04-23
  • 来自专栏QT

    数据结构】-- 单链表实现

    这时我们就可以使用另一种数据结构--链表。 和顺序表一样,链表也是一种线性表。和顺序表不同是,虽然链表在逻辑上是连续,链表在物理上并不是连续。 链表中节点通过指针域相互连接,形成一个动态数据结构,可以方便地进行插入、删除等操作,而不需要像数组一样需要连续内存空间。 单链表实现 模块划分 和实现顺序表一样,分为三个文件来实现,SList..c用来实现顺序表各种方法,SList.h用来包含实现方法所需头文件和所需方法初始化。 test.c用来测试写方法是否有问题。 节点 实现链表节点需要创建两个变量,数据域用来储存数据,指针域用来存放下一个节点地址。我们用结构体来实现。 malloc(sizeof(SLTNode)); node3->data = 3; SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode)); node4

    18210编辑于 2025-12-30
  • 来自专栏Yui编程知识

    顺序表实现数据结构

    线性表是一种在实际中广泛使用数据结构,常见线性表有:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就是说是连续一条线。但是在物理结构上并不一定是连续,比如链表。 * a; int sz;//有效数据个数 int capacity;//存储空间大小 }SL; 3.模拟实现 静态顺序表只适合于确定知道要存储多少数据场景下。 下面是模拟实现: 3.1 准备工作 定义一个结构体 typedef int Datatype;//为了适用不同类型顺序表 typedef struct SeqList { Datatype* a; int sz;//有效数据个数 int capacity;//存储空间大小 }SL; 3.2 顺序表初始化与销毁 对于顺序表初始化,我的话会先给顺序表开好3个空间大小. { perror("InitSeqlist"); exit(-1); } ps->sz = 0; ps->capacity = 3; } 销毁 销毁我们直接free就可以了,任何其他值赋

    26110编辑于 2024-10-16
  • 来自专栏我的博客

    数据结构:单链表实现

    上一次我们实现了顺序表应用,但是对于顺序表还是会有以下几个问题: 1. 中间/头部插入删除,时间复杂度为O(N)。 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小消耗。 3. 单链表概念 单链表是一种链式存取数据结构,用一组地址任意存储单元存放线性表中数据元素。单链表中数据元素由一个数据域和一个指针域组成,其中指针域指向下一个数据元素。 同顺序表一样我们先创建一个SList.h头文件和一个SList.c源文件,.h文件实现函数声明,.c文件实现函数定义。 现在我们来实现尾插,如下图: 尾插很简单,我们只需要注意,循环遍历时结束条件是尾节点next指针为空,而不是尾节点为空。 代码如图: 分别运行空链表和非空链表时测试一下: 3.链表删除 1)尾删 尾删时我们链表首先不能为空,不然就是删了个寂寞,然后我们要分为一个节点和多个节点。

    21110编辑于 2025-12-22
  • 来自专栏我的博客

    数据结构:双链表实现

    上一次我们实现了单链表,也就是不带头单向不循环链表,这次我们首先双链表(带头双向循环链表)。 对于单链表来说,还是存在一些缺点,例如:查找效率低(需要从头开始遍历链表),不能随机访问。 在List.h文件中,首先创建一个结构体用来存放节点信息,这里和单链表区别是我们额外增加了一个结构体指针成员prev用来指向上一个节点指针。 接下来我们来实现双链表增删查改操作。 所以我们要养成良好编程习惯。 我们创建一个test.c文件调试一下: 2.链表尾插 双链表尾插实现就很简单了,不同于单链表还要先找到尾节点,这里phead->prev指向就是尾节点。 为了方便测试我们先将打印方法实现3.链表打印 打印就需要循环遍历一遍,注意我们条件现在不再是pcur->next != NULL,而是!= phead。 next; free(pcur); pcur = next; } //此时就剩下了哨兵位 free(phead); phead = NULL; pcur = NULL; } 到这里我们双链表实现增删查改操作就完成了

    16110编辑于 2025-12-22
  • 来自专栏Yui编程知识

    数据结构——堆实现(详解)

    1且Ki>-K2i+2)i = 1,2,3…,则称为小堆(或大堆)。 堆实现 介绍的话就到此为止,下面我们来进行堆实现。无非就是那几样。 ,没错就是顺序表,但实现起来会比顺序表更难一些哦。 函数声明 我们先把初始化,销毁,插入,删除等等要实现函数声明一下: void HpInit(HP* php); void Hppush(HP* php, HpDataType x); void Hpdestroy 我们发现下面我有写了有个函数,向上调整函数adjustup,没错上面我们讲谁小于谁交换就要通过这个函数来实现

    28511编辑于 2024-10-15
  • 来自专栏微信公众号【Java技术江湖】

    探索Redis设计与实现3:Redis内部数据结构详解——sds

    该系列博文会告诉你如何从入门到进阶,Redis基本使用方法,Redis基本数据结构,以及一些进阶使用方法,同时也需要进一步了解Redis底层数据结构,再接着,还会带来Redis主从复制、集群、分布式锁等方面的相关内容 前言 本文是《Redis内部数据结构详解》系列第二篇,讲述Redis中使用最多一个基础数据结构:sds。 不管在哪门编程语言当中,字符串都几乎是使用最多数据结构。 因此,现在字符串值变成了”tielei$zhang”。最后通过getrange取从倒数第5个字节到倒数第1个字节内容,得到”zhang”。这些命令实现,有一部分是和sds实现有关。 其中最低3个bit用来表示header类型。header类型共有5种,在sds.h中有常量定义。 _64 4 sds数据结构,我们有必要非常仔细地去解析它。

    48310发布于 2019-12-02
  • 来自专栏合集

    数据结构|栈实现

    栈满足特性是先进后出,就像货车装货物,把货物一次放进去,但是卸货时候,你得先把最外面的卸载了,才能继续卸载里层货物。 栈实现有两种形式,一种是数组,一种是链表。 ? 对于一个栈,需要至少三个属性 top:记录当前栈顶部,超过栈长度和长度小于0都应报错。 push:往栈里面存东西,当超过栈长度需要警报,当然,链表栈理论上是可以无限存东西。 pop:把栈顶部数据移除。 链表栈 链表栈实际上可以看成链表一种约束,约束了链表长度,链表插入和删除位置。 对于链表栈,需要两个变量 top:记录当前栈顶地址和位置。 链表:记录当前数据和下一个,上一个链表块地址。top永远指向了链表栈最后一个元素,记录其位置。链表栈和链表结构本质相同。 数组栈(顺序栈) 对数组进行约束,成为栈。 关于实现一个顺序栈 #include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; class Stack

    39720发布于 2020-06-04
  • 来自专栏Linux学习~

    数据结构】开卷数据结构?--堆实现超详解

    目录 前言 堆概念和结构 堆实现 接口展示 堆结构创建 堆初始化 堆销毁 入堆 数据向上调整 入堆测试 出堆 向下调整数据 出堆测试 堆顶数据获取 堆数据个数 判断空堆 堆数据打印 堆源码 ---- 前言 ---- 本章主要讲解: 数据结构知识以及实现概念和结构 ---- 概念: 将所有元素按完全二叉树顺序存储方式存储在一个一维数组中并以一定数据要求存储 堆总是一棵完全二叉树 注:在上节基础知识讲解中我们知道父节点和左右子节点编码关系,以此可以对应到数组中下标关系,这里我们主要用数组来表示和实现堆 图示:数组堆 堆实现 ---- 注:这里我们主要实现大堆,对于小堆实现与大堆只有数据调整上出入 接口展示 //堆初始化 void HeapInit(HP* hp); //堆销毁 void HeapDestroy(HP* hp) 删除后数据依旧要保持大堆特性 对于空堆无法出堆 出堆方式: 首先我们将堆顶数据也就是下标为0数据与堆尾数据交换 交换后让记录存入数据变量减减,实现删除堆顶数据 再让现在堆顶数据向下调整 参考代码

    39030编辑于 2022-11-30
  • 来自专栏全栈程序员必看

    数据结构与算法(3

    算法笔记3 一、图 public class Graph { /** * 顶点list集合 */ private ArrayList<String> vertexList ; /** * 顶点对应邻接矩阵 */ private int [][] adjacencyMatrix; /** * 边个数! .把最下面的盘从a->c System.out.println("第"+num+"个盘从"+a+"->"+c); //3.把b盘移到c divideAndConquer (num-1,b,a,c); } } 2.3动态规划 问:背包总称重4,物品不重复前提,如何保证背包装价格最高 /** * @Author: 郜宇博 * @Date: 2021/8 class DynamicProgramming { public static void main(String[] args) { int []weight = {1,4,3}

    24020编辑于 2022-07-09
领券