首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏CSDN搜“看,未来”

    数据结构9)-- 跳表

    文章目录 跳表 跳表搜索 跳表插入 抛硬币 跳表删除 跳表代码实现 跳表数据结构 初始化跳表 插入节点 删除节点 销毁跳表 为什么Redis要用跳表来实现有序集合? 跳表(skip list) 对应是平衡树(AVL Tree),是一种 插入/删除/搜索 都是 O(log n) 数据结构。它最大优势是原理简单、容易实现、方便扩展、效率更高。 因此在一些热门项目里用来替代平衡树,如 redis, leveldb 等。 跳表是一个随机化数据结构,实质就是一种可以进行二分查找有序链表。 ,发现下个节点是25,大于17,那么再降低一层,从2层开始搜索,发现第2层是9,小于17,继续搜索,发现9节点下一个数是17,搜索完成。 ---- 跳表代码实现 跳表数据结构 如上图中E节点,表示是头节点,一般跳表实现,最大有多少层(MAX_LEVEL)是确定。所以e个数是固定

    50830发布于 2021-09-18
  • 来自专栏李维亮的博客

    PHPCMSV9数据结构

    v9_admin 管理员表 v9_admin_panel 快捷面板 v9_admin_role 角色表 v9_admin_role_priv 管理员权限表 v9_announce 公告表 v9_attachment _1 v9_comment_setting v9_comment_table v9_content_check 内容审核表 v9_copyfrom 来源表 v9_datacall 数据调用 v9_dbsource 数据源 v9_download v9_download_data v9_downservers 镜像服务器表 v9_favorite 用户收藏表 v9_formguide v9_formguide_fields v9_hits 访问统计 v9_ipbanned IP禁止 v9_keylink 关联链接 v9_link v9_linkage 联动菜单表 v9_log 操作日志 v9_member 会员表 v9_ v9_model_field 模型字段表 v9_module 模块表 v9_mood v9_news 文章主表 v9_news_data 文章从表 v9_page 单网页数据表 v9_pay_account

    59720发布于 2021-07-09
  • 来自专栏blog1

    数据结构9)串顺序存储结构

    顺序存储结构 鸽了很久数据结构篇,最近确实事情好多,为了申请外宿一直和导员斗智斗勇,今天来看一个串这一节,其实就串基本代码部分不是特别重要,本着复习线性表目的,我们再来看一遍。 这点倒是串新东西: 首先边界情况:就是要求子串长度大于原串长 其次就是从父串S第pos个位置依次给子串赋值即可 子串长度就是我们给定len bool SubString(SString &Sub ,反之,返回小于0值,相等就返回0 这里比大小是根据字母顺序比:例:abcab 具体步骤: 设置i从1循环到S和T较短长度值 如果发现不相同元素,就返回两者之差:差为 正数即S>T,负数即S 如果循环完发现没有不相同元素,就返回两者长度差,长度长>长度短 int StrCompare(SString S,SString T){ for(int i=1;i<=S.length& 在最后位置有一个return 0,这是视频上写,但我在实现时候发现加上return 0 最后不管找没找到都会返回0,所以给注释掉了。

    99620编辑于 2022-12-26
  • 来自专栏C语言入门到精通

    数据结构 | 每日一练(9

    数据结构 合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下 ——老子 1 每日一练 实际上数据类型是厂家提供给用户实现数据结构。“抽象数据类型(ADT)”指一个数学模型及定义在该模型上一组操作。“抽象”意义在于数据类型数学抽象特性。 抽象数据类型定义仅取决于它逻辑特性,而与其在计算机内部如何表示和实现无关。无论其内部结构如何变化,只要它数学特性不变就不影响它外部使用。抽象数据类型和数据类型实质上是一个概念。 此外,抽象数据类型范围更广,它已不再局限于机器已定义和实现数据类型,还包括用户在设计软件系统时自行定义数据类型。 使用抽象数据类型定义软件模块含定义、表示和实现三部分,封装在一起,对用户透明(提供接口),而不必了解实现细节。抽象数据类型出现使程序设计不再是“艺术”,而是向“科学”迈进了一步。

    4953129发布于 2019-06-10
  • 来自专栏合集

    数据结构|队列实现

    队列 队列特性是先进先出。每次数据出去只能队列头部,每次数据进来只能加在队列尾部。 队列实现一般有两种方式,线性队列,链表队列。 链表队列 链表队列实现可以参考单向链表。 每次删除数据,就把队列头标识移到下一个node地址。每次增加数据则就把队列尾指针指向node加上下一个node地址,同时把队列尾标识移过去即可。 线性队列 超简单,基于数组实现,每次删除数据则把数组第一个删除,把后续往前面移动,最后一个直接置空;添加数据只需要在最后继续添加即可;数组会有定长,删除和添加数据一定要检验。 return q; }; int main() { queue q; q.length = 0; q = add_num(q, 10); q = add_num(q, 9) q.length; i++) { cout << q.data[i] << endl; }; q = add_num(q, 10); q = add_num(q, 9)

    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.2.2 插入代码实现 先判断空间是否足够,不够就扩容,够就直接插入x,再将php->size++。 2.3.2 删除代码实现 首尾交换删除,然后将php->size--,最后向下调整。 php); return php->size == 0; } 3.3 test.c #include"Heap.h" int main() { int a[] = { 4,6,2,1,5,8,2,9}

    32110编辑于 2024-01-23
  • 来自专栏算法与编程之美

    使用for语句实现9*9乘法表

    1 问题 9*9乘法表数量较大,直接打印需用大量代码,如何用更简单方法实现9*9乘法表打印。 2 方法 运用for循环结构对1-9进行循环处理,以得到9*9乘法表及运算结果 3 实验结果与讨论 解决此类问题需要用到fori循环结构,以及if条件语句。 由于使用fori结构是嵌套形式,在代码编写过程中应尤其注意各个结构之间逻辑关系。 实现结果: 4结语 在编写代码时,由于没有提前理清fori结构之间关系,导致一直没有得到想要结果。 这也提醒了我们在每次编程之前对该程序算法要先理清逻辑关系,以免在编程时出错。

    47110编辑于 2023-01-03
  • 来自专栏CSDN搜“看,未来”

    数据结构9)-- 哈希表 unordered_map

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。 简单说就是一种将任意长度消息压缩到某一固定长度消息摘要函数。) 对于前面两个方法程序实现我就不说了吧,我们来看一下最后一个场景程序实现: 要实现这么一个程序,需要使用一个数组,但是这个数组需要多大呢? 那么,有没有办法在得到O(1)查找效率同时、又不付出太大空间代价呢? 有,就是本篇讲哈希表了。 很简单,我们把你车牌号看作一个8位36进制数字;为了方便,我们可以把它转换成十进制。 ---- 但是,你发现你车牌尾号和你朋友车牌尾号是一样啊,那是不是意味着,某一个车位,要停你车,还要停你朋友车? 那也不太现实,那这么办呢?

    1.4K11发布于 2021-09-18
  • 来自专栏Yui编程知识

    数据结构——单链表实现

    链表概念 概念:链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表中指针链接次序实现 。 这里我来解释一下什么叫做逻辑上连续而物理上补连续。 所谓逻辑上连续,就是指你你可以通过第一个节点找到第二个节点,就行火车一样你可以从一节车厢走到另一节车厢。 物理上不连续是指内存地址不连续,不想顺序表中数组是连续。 next就起到了重要作用,我们把2地址存在1next中,把3地址存在2next中,最后把3next指向NULL就可以了,再画一个图就是这样。 我还用了一个头节点来指向第一个节点,从图上来看是不是每个节点都联系了起来,这就是有了逻辑上连续。 下面我来讲解实现链表都要哪些函数。 头插函数 想要实现头部插入,我们先画图。 要想吧新节点插入头部,我们就要把,新节点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用来测试写方法是否有问题。 节点 实现链表节点需要创建两个变量,数据域用来储存数据,指针域用来存放下一个节点地址。我们用结构体来实现。 void SLTEraseAfter(SLTNode* pos); //销毁链表 void SListDesTroy(SLTNode** pphead); 方法实现 在SList.c中对需要方法进行实现

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

    顺序表实现数据结构

    1.线性表 线性表(linear list)是n个具有相同特性数据元素有线序列。 线性表是一种在实际中广泛使用数据结构,常见线性表有:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就是说是连续一条线。但是在物理结构上并不一定是连续,比如链表。 * a; int sz;//有效数据个数 int capacity;//存储空间大小 }SL; 3.模拟实现 静态顺序表只适合于确定知道要存储多少数据场景下。 下面是模拟实现: 3.1 准备工作 定义一个结构体 typedef int Datatype;//为了适用不同类型顺序表 typedef struct SeqList { Datatype* a; 同时还要删除该顺序表中数据也又两种情况: 1.顺序表中数据已经删完了,无法再删。 2.顺序表中数据足够删除。

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

    数据结构:单链表实现

    上一次我们实现了顺序表应用,但是对于顺序表还是会有以下几个问题: 1. 中间/头部插入删除,时间复杂度为O(N)。 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小消耗。 3. 单链表概念 单链表是一种链式存取数据结构,用一组地址任意存储单元存放线性表中数据元素。单链表中数据元素由一个数据域和一个指针域组成,其中指针域指向下一个数据元素。 注意:每次申请一块节点空间时,它和之前节点空间不一定是连续,所以要想找到这块空间就得通过地址来找。 链表一共有8种分类,如下图所示: 今天我们来实现单链表,也就是不带头单向不循环链表。 同顺序表一样我们先创建一个SList.h头文件和一个SList.c源文件,.h文件实现函数声明,.c文件实现函数定义。 现在我们来实现尾插,如下图: 尾插很简单,我们只需要注意,循环遍历时结束条件是尾节点next指针为空,而不是尾节点为空。

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

    数据结构:双链表实现

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

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

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

    实现 介绍的话就到此为止,下面我们来进行堆实现。无非就是那几样。 ,没错就是顺序表,但实现起来会比顺序表更难一些哦。 函数声明 我们先把初始化,销毁,插入,删除等等要实现函数声明一下: void HpInit(HP* php); void Hppush(HP* php, HpDataType x); void Hpdestroy 这里我们插入40,40比56小那么它应该是“父亲”,所以我们就要把他和56调换位置,但是如果我们再多想一想,我插入9呢,是不是就还要和10调换一下位置了?对,这就是小堆内涵,小永远再上面。 我们发现下面我有写了有个函数,向上调整函数adjustup,没错上面我们讲谁小于谁交换就要通过这个函数来实现

    28511编辑于 2024-10-15
  • 来自专栏合集

    数据结构|栈实现

    栈满足特性是先进后出,就像货车装货物,把货物一次放进去,但是卸货时候,你得先把最外面的卸载了,才能继续卸载里层货物。 栈实现有两种形式,一种是数组,一种是链表。 ? 对于一个栈,需要至少三个属性 top:记录当前栈顶部,超过栈长度和长度小于0都应报错。 push:往栈里面存东西,当超过栈长度需要警报,当然,链表栈理论上是可以无限存东西。 pop:把栈顶部数据移除。 链表栈 链表栈实际上可以看成链表一种约束,约束了链表长度,链表插入和删除位置。 对于链表栈,需要两个变量 top:记录当前栈顶地址和位置。 数组栈长度一定,使用top记录当前位置,比如说,array长度为10,但是我们指存储了5个数据,那么top值就是4。往栈里面加入一个数据,top变成5,当已经10个数据时,top为9。 关于实现一个顺序栈 #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
  • 来自专栏趣学算法

    数据结构9讲 数组与广义表

    数据结构9讲 数组与广义表 数组是由相同类型数据元素构成有序集合。 一维数组看一看作一个线性表,例如: ? 图1一维数组 二维数组也可以看作一个线性表,例如: ? 按行序存储,aij存储位置: ? LOC(a00)表示第一个元素存储位置,即基地址,LOC(aij)表示aij存储位置。 授人以鱼不如授人以渔,告诉你记住公式,就像送你一条鱼,不如交给你捕鱼秘籍! 存储位置计算秘籍:aij存储位置等于矩阵第一个元素存储位置,加上前面的元素个数*每个元素占空间数。 ? 按列序存储,aij存储位置: ? LOC(a00)表示第一个元素存储位置,即基地址,LOC(aij)表示aij存储位置。 需要特别注意:二维数组下标是从1开始,那么画风就变了~~~ 在很多科学工程计算问题中,经常遇到一些阶数很高矩阵,而且这些矩阵很多值是相同,有的还有很多元素是0,为了节省空间,可以对这类矩阵进行压缩存储

    1.1K20发布于 2018-09-13
领券