
数据结构
文章平均质量分 72
徐狗学AI
在天赋面前,努力不值一提!
展开
-
数表排序之红黑树
文章目录1.基本概念1.1.红黑树的引进1.2.红黑树的规则1.3.红黑树的举例2.红黑树的性质3.红黑树的操作4.总结1.基本概念1.1.红黑树的引进AVL的左右子树高度差不能超过1,每次进行插入/删除操作时,为了确保AVL树的特性,几乎都需要通过旋转操作保持平衡。在频繁进行插入/删除的场景中,频繁的旋转操作使得AVL的性能大打折扣。为了解决这个问题,引进的红黑树。红黑树通过牺牲严格的平衡,换取插入/删除时少量的旋转操作,整体性能优于AVL红黑树插入时的不平衡,不超过两次旋转就可以解决。删除时的原创 2021-12-31 13:59:55 · 1311 阅读 · 1 评论 -
数表查找之平衡二叉树
文章目录1.基本概念1.1.AVL引进1.2.AVL定义1.3.AVL举例2.平衡因子3.AVL树插入时失衡与调整3.1.左旋3.2.右旋4.AVL四种调整方式4.1.LL型调整4.2.LR型调整4.3.RL型调整4.4.RR型调整5.调整总结6.删除节点总结7.参考博客1.基本概念平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。1.1.AVL引进原创 2021-12-29 13:45:32 · 808 阅读 · 0 评论 -
数表查找之二叉搜索树
文章目录1.基本思想2.算法步骤3.代码实现3.2.算法实现3.3.1.创建3.3.2.查找3.3.3.插入3.2.4.迭代3.2.5.删除3.2.测试程序4.实验结果与心得完整代码二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势,所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。1.基原创 2021-12-24 16:42:44 · 1226 阅读 · 0 评论 -
二叉树遍历代码实现
文章目录1.定义2.特点3.树的遍历准备工作线性栈实现线性队列实现3.1.先序遍历3.1.1.迭代版本3.1.2.递归版本3.2.中序遍历3.2.1.迭代版本3.2.2.递归版本3.3.后序遍历3.3.1.迭代版本3.3.2.递归版本3.4.层序遍历3.4.1.迭代版本4.测试程序5.总结1.定义二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。原创 2021-12-22 14:16:06 · 2810 阅读 · 0 评论 -
哈夫曼树的实现
文章目录1.基本概念1.1.路径和路径长度1.2.数的路径长度1.3.结点的权和带权二叉树1.4.结点的带权路径长度和树的带权路径长度1.5哈夫曼树2.算法实现3.存储结构4.代码实现4.1.算法实现4.2.测试程序5.实现结果1.基本概念1.1.路径和路径长度若在一棵树中存在着一个结点序列k1,k2,k3,kj,使得ki是kj的双亲( 1≤i<j),则称此结点序列是从k1~kj的路径。因树中每个结点只有一个双亲结点,所以它也是这两个结点之间的唯一路径。从k1~kj,所经过的分支数称为这两点原创 2021-12-17 12:55:08 · 2972 阅读 · 0 评论 -
七大查找之哈希查找
文章目录1.基本思想2.算法步骤3.代码实现3.1.算法实现3.2.测试程序4.程序结果1.基本思想哈希查找算法又称散列查找算法,是一种借助哈希表(散列表)查找目标元素的方法,查找效率最高时对应的时间复杂度为 O(1)。哈希查找算法适用于大多数场景,既支持在有序序列中查找目标元素,也支持在无序序列中查找目标元素。讲解哈希查找算法之前,我们首先要搞清楚什么是哈希表。哈希表(Hash table)又称散列表,是一种存储结构,通常用来存储多个元素。和其它存储结构(线性表、树等)相比,哈希表查找目标元素的原创 2021-12-15 15:28:25 · 7697 阅读 · 1 评论 -
七大查找之斐波那契查找
文章目录1.基本思想2.算法步骤3.代码实现3.1.算法实现3.2.测试程序4.实验结果1.基本思想斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术。斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。(mid的关系式不同)斐波那契查找同样是查找算法家族中的一员,它要求数据是有序的(升序或降序)。斐波那契查找采用和二分查找/插值查找相似的区间分割策略,都是通过不断的分割区间缩小搜索的范围 。(分治法)斐波那契数列(Fibonacci sequ原创 2021-12-15 15:05:24 · 3754 阅读 · 2 评论 -
七大查找之分块查找
文章目录1.基本思想2.算法步骤3.代码实现3.1.算法实现3.2.测试程序4.实验结果1.基本思想分块查找,也叫索引顺序查找,算法实现除了需要查找表本身之外,还需要根据查找表建立一个索引表。例如上图中,待查找表中共 18 个查找关键字,将其平均分为 3 个子表,对每个子表建立一个索引,索引中包含中两部分内容:该子表部分中最大的关键字以及第一个关键字在总表中的位置,即该子表的起始位置。建立的索引表要求按照关键字进行升序排序,查找表要么整体有序,要么分块有序。分块有序指的是子表中所有关键字都原创 2021-12-15 14:22:47 · 3864 阅读 · 1 评论 -
七大查找之插值查找
文章目录1.基本思想2.算法步骤3.代码实现3.1.算法实现3.1.1.迭代法3.1.2.递归法3.2.测试程序4.程序细节5.实验结果1.基本思想回顾一下二分查找法的优缺点,二分查找相比于顺序查找效率提高不少(前提待排序的数组是顺序的),但对于有目的性的查找,比如想在一个字典中想查找banana,这个时候你还会选择二分查找吗?因为b这个字母在字典中的位置前列。换句话说,针对于不同的单词,结合我们的先验知识,自适应地翻到响应的页码。经过以上分析,折半查找这种查找方式,不是自适应的(也就是说是傻瓜式的)原创 2021-12-15 13:28:50 · 532 阅读 · 0 评论 -
七大查找之二分查找
二分查找1.基本思想2.算法步骤3.代码实现3.1.算法实现3.1.1.迭代法3.1.2.递归法3.2.测试程序4.代码细节4.1.迭代和递归终止条件4.2.递归终止条件奇异原因5.实验结果1.基本思想说明:元素必须是有序的,如果是无序的则要先进行排序操作。二分查找也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表(是左还是右),这样递归进行,直到查找到或查找结束发原创 2021-12-10 14:10:33 · 996 阅读 · 0 评论 -
七大查找之顺序查找
顺序查找1.什么是查找2.基本思想3.代码实现3.1.算法实现3.2.测试程序4.实验结果1.什么是查找查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本系列博文将简单概括性的介绍了常见的七种查找算法查找定义:根据给定的某个值,在查找表中确定一个其关键字(数值)等于给定值的数据元素。查找算法分类:静态查找和动态查找静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。无序查找和有序查找。原创 2021-12-10 10:41:37 · 793 阅读 · 0 评论 -
十大排序之桶排序
桶排序桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。桶排序的思想就是和分治法是一样的!!!1. 算法步骤设置一个定量的数组当作空桶子。寻访序列,并且把数组元素一个一个放到对应的桶子去。对每个不是空的桶子进行排序。从不是空的桶子里把数组元素再放回原来的序列中。2. 动图演示[原创 2021-12-08 14:49:18 · 1193 阅读 · 0 评论 -
十大排序之基数排序
文章目录基数排序基数排序 vs 计数排序 vs 桶排序1. 算法步骤2. 动图演示3. 代码实现3.1. 算法实现3.2. 测试程序4.实验结果基数排序基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数,字符串等也可以用基数排序。基数排序 vs 计数排序 vs 桶排序基数排序有两种方法:这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:基数排原创 2021-12-07 21:16:01 · 1200 阅读 · 0 评论 -
十大排序之计数排序
计数排序计数排序1. 算法步骤2. 动图演示3.代码实现4.实验结果计数排序计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序。计数排序要求输入的数据必须是有确定范围的整数,该范围是已知的。当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(待排序数组的长度要大于待排序的数组元素),这使得计数排序对于数据范围很大原创 2021-12-07 11:20:09 · 473 阅读 · 0 评论 -
十大排序之堆排序
堆排序1.概念1.1. 堆的性质1.2. 堆的存储1.3. 堆的操作1.4. 排序思想2.算法步骤3.动图演示4.代码实现4.1. 最大堆排序4.1.1 算法实现4.1.2 测试程序4.2. 最小堆排序4.2.1 算法实现4.2.2 测试程序5.代码解释1.概念堆一般指的是二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二叉树。堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点原创 2021-12-03 20:57:18 · 692 阅读 · 3 评论 -
十大排序之快速排序
快速排序快速排序1.算法步骤2.动图演示3.代码实现3.1.首元素作为基准数3.2.尾元素作为基准数3.3.测试程序4.归纳总结快速排序快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为原创 2021-12-01 19:23:31 · 7079 阅读 · 0 评论 -
十大排序之归并排序
归并排序1.算法步骤1.1.递归法1.2.迭代法2.动图演示3.代码实现3.1.递归实现3.1.1.算法实现3.1.2.测试程序3.1.3.疑问3.1.4.现象3.1.5.解释3.1.6.验证3.1.6.1.左递归先开始3.1.6.1.右递归先开始3.1.7.总结3.2.迭代法3.2.1.算法实现3.2.2.测试程序3.2.3.理解4.总结归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。作为一种典型的原创 2021-11-30 21:45:50 · 10893 阅读 · 2 评论 -
十大排序之希尔排序
希尔排序希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序。希尔排序是非稳定排序算法。希尔排序因DL.Shell于1959年提出而得名。希尔排序是将待排序的数组元素按下标的一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。1. 算法步骤确定增量分组次数每一次增量中遍历一个分组中所有的元素不同分组之间的元素进行插入排序count=⌊len原创 2021-11-28 21:30:23 · 4562 阅读 · 0 评论 -
十大排序之插入排序
插入排序插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。1. 算法步骤将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果原创 2021-11-27 22:00:30 · 104 阅读 · 0 评论 -
十大排序之选择排序
选择排序选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。1. 算法步骤首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。2. 动图演示3.代码实现void swap(int* a, int* b)//该函数的作用是进行交换,针对int类型的变原创 2021-11-27 11:34:41 · 119 阅读 · 0 评论 -
十大排序之冒泡排序
冒泡排序冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明原创 2021-11-26 21:23:41 · 207 阅读 · 0 评论 -
全网最简单的cJSON教程(一看必会)
全网最简单的cJSON教程1. JSON与cJSONJSON —— 轻量级的数据格式JSON语法规则cJSON2. cJSON数据结构和设计思想3. JSON数据封装封装方法输出JSON数据封装数据和打印数据示例4. cJSON数据解析解析方法解析示例注意事项5. cJSON使用过程中的内存问题内存及时释放内存钩子1. JSON与cJSONJSON —— 轻量级的数据格式JSON 全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的数据格式。它采用完全独立于编转载 2020-12-26 14:36:08 · 6081 阅读 · 1 评论 -
共用体详解
共用体详解1.含义2.一般类型3.关键知识点3.13.23.33.43.53.63.73.83.94.总结1.含义在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。2.一般类型定义共用体类型变量的一般形式为:union 共用体名{ 成员表列}变量表列;3.关键知识点例如:union Data{int原创 2020-09-19 20:51:32 · 16019 阅读 · 4 评论 -
结构体内存对齐规则
结构体内存对齐规则1.疑问2.答案1.疑问声明一个结构体类型,它所占字节为所有成员的字节的总和?2.答案显然是错误的原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。比如此例,首先系统会将字符型变量a存入第0个字节(相对地址,指内存开辟的首地址);然后在存放整形变量b时,会以4个字节为单位进行存原创 2020-09-18 12:00:05 · 751 阅读 · 0 评论 -
哈希算法原理和实现
哈希算法原理和实现前言当我们在编程过程中,往往需要对线性表进行查找操作。在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i;在有序表中查找时,我们经常使用的是二分查找,通过比较key与a[i]的大小来折半查找,直到相等时才返回索引i。最终通过索引找到我们要找的元素。 但是,这两种方法的效率都依赖于查找中比较的次数。我们有一种想法,能不能不经过比较,而是直接通过关键字key一次得到所要的结果呢?这时,就有了散列表查找(哈希表)。1、什么是哈希表要说哈原创 2020-09-13 10:32:32 · 15797 阅读 · 0 评论 -
位域最详细的剖析
位域的剖析1.定义2.性质3.例子4.无名位域5.实现6.含位域结构体的sizeof7.位域的压缩(SIZEOF)7.1.位域类型相同7.2.位域类型不同7.3.赋值方式,排列方式8.总结1.定义位域,又称位段。C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用0或1表示,只需1位即可。在计算原创 2020-08-29 15:09:02 · 5533 阅读 · 0 评论 -
手把手教你学双链表
由于上上一篇博文讲解了单链表,双链表也就不难了,但由于上上一篇博文立下了一个flag,所以转载了一篇比较不错的博文。(doge)当然,单链表存在一定的弊端,就是查找数据和删除数据的时候比较麻烦,而双链表的出现就是为了解决它的弊端:双链表的引入是为了解决单链表的不足:(1)双链表可以往前遍历,也可以往后遍历,具有两个方向双链表的节点 = 有效数据 + 两个指针(分别指向前一个节点和后一个节点)双向链表的图形结构描述:struct double_list转载 2020-08-03 19:44:10 · 265 阅读 · 0 评论 -
手把手教你学单链表
本文用到的图片来自csdn中优秀的博主。为什么我们要学习链表呢?链表到底有什么好处。链表主要有以下几大好处:1、解决数组无法存储多种数据类型的问题。2、解决数组中,元素个数无法改变的限制。3、数组插入和移动元素的过程中,要对元素进行大范围的移动,很耗时间,效率也不高。而链表却可以很好地弥补数组不足的缺点。从这幅图我们得出以下信息:这个简单链表的构成:头指针(Header),若干个节点(节点包括了数据域和指针域),最后一个节点要指向空。实现原理:头指针指向链表的第一个节点,然后第一个节点原创 2020-08-01 20:31:07 · 481 阅读 · 0 评论