![](https://img-blog.csdnimg.cn/2c1e186125d04f5c858038ece78fe67b.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 79
数据结构知识的讲解【 纯C实现】
cls-evd
南风知我意,吹梦到西洲
展开
-
C++之红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 4.2.2 红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的3. 如果一个节点是红色的,则它的两个孩子结点是黑色的,但是没有连续的红节点4. 对于每个结点,从该结点到其所有后代叶结点的简单路径...原创 2022-05-23 22:03:00 · 1643 阅读 · 7 评论 -
C++之AVL树
前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是: 其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。AVL 树AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表原创 2022-05-23 21:20:30 · 773 阅读 · 0 评论 -
C++之二叉树进阶
二叉搜索树之前我们提过普通二叉树价值不大,二叉树要叠加一些性质才能变的非常有价值。二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树比如查6,比根大在右树去找,比7小在左树去找就找到了,一共三次。最多查找高度次O(logN) (这是在不极端的情况下,能做到满二叉树或完全二叉树的情况) 。eg:10亿个数原创 2022-05-08 21:10:46 · 604 阅读 · 0 评论 -
数据结构之二叉树
顺序存储:顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆之前已经讲解过。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。 链式存储二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表 中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结 点的存储地址 。链式结构又分为二叉链和三叉链,当前我..原创 2022-03-22 17:38:15 · 2684 阅读 · 7 评论 -
八大排序核心算法详解
八大排序排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。 内部排序:数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能..原创 2022-01-20 10:46:45 · 1600 阅读 · 2 评论 -
数据结构之【什么是数据结构与时间复杂度详解】
什么是数据结构数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。什么是算法算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。时间复杂度1.时间复杂度的概念时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你原创 2021-09-22 21:30:29 · 861 阅读 · 0 评论 -
数据结构之【顺序表的实现(详解)】
线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在**逻辑上是线性结构,也就说是连续的一条直线。**但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表本质就是一个数组,但它是动态增长的,并且要求里面存储的数据必须是从左往右连续的。顺序表的物理结构和逻辑结构是一致的都是连续的。顺序表存在着一定的缺陷:1.0 动态增容存在性能消原创 2021-10-06 17:45:50 · 4351 阅读 · 2 评论 -
数据结构之【单链表的实现(保姆级教学)】
链表的实现链表的逻辑结构(人为想象出来的)以下是更为具体的解释#include<stdio.h>#include<stdlib.h>typedef int SLTDataType;typedef struct SListNode{ SLTDataType data; struct SListNode* next;}SLTNode;int main(){ struct SListNode* node1 = (struct SListNode*)mallo原创 2021-10-14 22:31:08 · 270 阅读 · 4 评论 -
顺序表与链表的优缺点
顺序表的优点:1.0 可以按下标去随机访问2.0 cpu高速缓存命中率比较高顺序表的缺点:1.0 空间不够需要增容。(有一定程序的性能消耗),可能存在一定的空间浪费。2.0头部或者中间插入或者删除数据,需要挪动数据,效率比较低 时间复杂度O(N).链表的优点(双向带头循环):1.0 按需申请内存,需要存储一个数据,就申请一块内存,也不存在空间浪费。2.0任意位置O(1)时间内,插入或者删除数据链表的缺点:1.0不支持下标的随机访问总结:这两个数据结.原创 2021-10-23 13:49:36 · 447 阅读 · 0 评论 -
数据结构之[双链表的是实现]【保姆级讲解】
上篇文章我们实现了链表中两大重要链表之一无头单项非循环链表,这次我们来实现带头双向循环链表。话不多说上图:带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向 循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而 简单了,后面我们代码实现了就知道了。废话不多说我们进入正题:进行带头双向循环链表的实现根据上图我们可以看出,该链表需要存储两个指针,所以我们在定义的时候就需要一前一后俩指...原创 2021-10-23 10:28:29 · 298 阅读 · 7 评论 -
数据结构之【栈的实现(保姆级教学)】
什么是栈栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的操作叫做出栈。出数据也在栈顶。 入栈及出栈示意图:栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插....原创 2021-10-28 18:21:12 · 1676 阅读 · 6 评论 -
数据结构之【队列的实现(保姆级教学)】
队列 队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) [先进先出]入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 图示:队列的实现:队列可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。这里我们采用单链表,同时我们设置头和尾两个指针..原创 2021-10-30 14:30:10 · 281 阅读 · 1 评论 -
数据结构之【堆详解】
1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,称为根结点,根节点没有前驱结点 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归原创 2021-11-24 11:10:21 · 1045 阅读 · 6 评论 -
建堆的时间复杂度详解
接上之前堆的博客,里面我曾提过建堆的时间复杂度是O(N),那么是为什么呢?下面进行推导按照最坏情况,该堆是满二叉树,如上图又依据公式:黑色框圈住的代表的是每层有的节点的个数第一层有2^(1-1) 个,第二层又2^(2-1)个,第h-1层有2^(h-1-1)个,第h层又2^(h-1)个红色框圈住的代表的是每一层的字树最多需要向下调整的次数我们假设这个二叉树有四层,第一层需要向下调整的次数是3次,第二层是两次,第三层是1次,第四层是0次,推广到这个二叉树有h层,第...原创 2021-11-27 22:45:02 · 7710 阅读 · 3 评论 -
数据结构之【堆排序】
堆排序的问题堆排序肯定要优于直接选择排序【O(N^2)】才会有价值1.0 建堆 O(N)2.0 继续选数排升序是用大堆还是小堆?答案是建大堆。升序,为什么不能建小堆?问题在于选出最小的数字后如何选出次小的数字建堆选出最小的数,花了O(N),紧接着选择次小的数,剩下的N-1个数继续建堆,又是O(N),最终成为N^2{因为剩下数字的父子关系完全乱了,只能重新建堆,效率太低}这样建堆排序的时间复杂度就和直接排序一样没有什么实际的意义。不是不...原创 2021-11-27 22:48:14 · 224 阅读 · 4 评论 -
数据结构之【堆的实现】
通过前几次的博客我们大致了解了堆的性质,接下来我们用数据结构来封装堆首先建堆typedef int HPDataType;struct Heap{ HPDataType* a; //数组 int size; //大小 int capacity; //容量};typedef struct Heap HP;实现以下几种接口:void HeapInit(HP* php, HPDataType* a, int n); //初始化void HeapDestory(.原创 2021-11-27 22:49:56 · 360 阅读 · 4 评论