![](https://img-blog.csdnimg.cn/20210725173018656.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《数据结构》
文章平均质量分 58
相关的顺序表 .二叉树 .红黑树等相关储存容器底层的理解
小羊教你来编程
有山川草木,纵横纸上,虫鱼鸟兽,飞动毫端。水到渠成,风来帆速,廿四中书考不难。
展开
-
八大排序总结---- 数据结构 (图解法) 面试必会! ! !
八大排序总结目录:一.插入排序 (InsertSort)二.希尔排序 (ShellSort)三.选择排序 (SelectSort)四.堆排序 (HeapSort)五.冒泡排序 (BubbleSort)六.快速排序 (QuickSort)1.hoare法2.挖坑法3.前后指针法七.归并排序 (MergeSort)1.递归实现2.非递归实现八.计数排序 (CountSort)目录:一.插入排序 (InsertSort)二.希尔排序 (ShellSort)三.选择排序 (SelectSort.原创 2021-07-28 12:27:31 · 1417 阅读 · 15 评论 -
什么是位图?
理解位图目录:一.位图引入1.位图概念2.位图的实现原理(1)构建方式(2)存储方式3.代码实现4.应用场景目录:一.位图引入 面试题【腾讯】 : 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 可能我们大多数人了解到的位图都是看到了腾讯的这个面试题理解到的,下面我就读于位图进行详细的讲解.1.位图概念 位图就是一种直接定址的哈希,它的效率很高,只用O(1)就可以查到对应位置是0还是12.位图的实现原理(.原创 2021-05-28 15:41:55 · 1053 阅读 · 3 评论 -
开散列的实现--哈希冲突
哈希冲突-开散列目录:一.开散列概念二.开散列原理三.哈希迭代器实现四.功能接口实现1.构造函数2.iterator begin()3.iterator end()4.insert5.Capacity6.Find7.Erase五.模拟实现Map六.模拟实现Set目录:一.开散列概念二.开散列原理三.哈希迭代器实现四.功能接口实现1.构造函数2.iterator begin()3.iterator end()4.insert5.Capacity6.Find7.Erase五.模拟实现.原创 2021-05-27 18:51:07 · 158 阅读 · 8 评论 -
线性探测-闭散列
线性探测的实现目录:一.线性探测的概念二.线性探测原理三.功能性接口1.构造2.insert3.Capacity4.Swap5.find6.erase目录:一.线性探测的概念 我们在这里讲到的线性探测是解决哈希冲突中闭散列的一种方式 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。~线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。二.线性探测原理原创 2021-05-27 14:01:45 · 1863 阅读 · 5 评论 -
教你轻松理解红黑树的实现及原理
轻松理解红黑树目录:一.红黑树的原理&性质二.红黑树的结构&节点封装1.结构理解2.节点封装三.红黑树的插入操作1.判断是否存在根节点2.将对应的节点挂到树上3.判断是否存在红色连续节点(1) 单链存在红色连续(2) 存在黑色uncle节点的红色连续(3) 左子树 和 左子树的右子树存在红色连续(4) 存在红色uncle节点的红色连续四.左旋&右旋1.左旋操作2.右旋操作五.获取_header对应的最左最右节点1.获取最左节点2.获取最右节点六.中序遍历打印值七.判断是否是红黑树.原创 2021-05-25 18:37:11 · 220 阅读 · 8 评论 -
Data Structure--数据结构总结大纲
数据结构暂时完结,接下来继续Cpp和Linux的学习!!!一起加油!!!开学了也要好好学习!!!原创 2021-02-28 03:23:19 · 110 阅读 · 0 评论 -
Data Structure--排序--归并排序(递归/非递归)--计数排序(非比较排序)
排序归并排序(递归+非递归)计数排序(非比较排序)归并排序(递归+非递归)核心函数:合并实现接口//归并排序//先将序列进行分解,不停地拆分,一直到子序列只有一个元素,然后对子序列进行合并,最终成有序序列//==================================递归//相邻子序列合并//对于空间的二分,我们只需要三个数据就可以了//begin mid end 就可以将空间分为2void merge(int* arr, int begin,原创 2021-02-28 01:59:34 · 188 阅读 · 0 评论 -
Data Structure--排序--顺序表(非递归快排) --队列(非递归快排)
非递归快排顺序表实现队列实现顺序表实现在这里利用顺序表实现快排需要包含顺序表对应的接口,具体: 点击此处//划分函数int partion(int* arr, int begin, int end){ //获取基准值位置 int mid = getMid(arr, begin, end); //把基准值放到起始位置 Swap(arr, begin, end); //首先选择基准值 int key = arr[begin]; int start = begin; while (b原创 2021-02-28 00:45:23 · 128 阅读 · 0 评论 -
Data Structure--排序--快速排序(挖坑法)--快速排序(前后指针法)
快速排序快速排序(挖坑法)快速排序(前后指针法)对于下面要讲的两种进行快排的函数来说,我们都需要利用下面的这两个函数,一个是获取中间值的接口,一个是快排的调用函数的用法,下面这两个函数都要和下面要讲的接口进行共同利用,在这里我就不写两遍了.//获取中间值的函数接口int getMid(int* arr, int begin, int end){ int mid = begin + (end - begin) / 2; //获取中间值 if (arr[begin] > arr[mid]){原创 2021-02-28 00:10:30 · 147 阅读 · 0 评论 -
Data Structure--排序--冒泡排序--快速排序(hoare)
排序冒泡排序快速排序接上一篇博客.冒泡排序上图已经详细的讲解了过程,大家仔细看就好,下来我直接讲代码.void bubbleSort(int* arr,int n){ //相邻元素进行比较 //遍历范围:0-为排序的最后一位 int end = n; while (end > 1){ //第一次冒泡排序 for (int i = 1; i < end; ++i){ if (arr[i - 1]>arr[i]){ //这里的i和i-1就相当原创 2021-02-24 02:30:09 · 192 阅读 · 0 评论 -
Data Structure--排序--插入排序----希尔排序--选择排序--堆排序
排序基本概念及分类插入排序希尔排序选择排序堆排序基本概念及分类排序:排序就是将有记录的东西,按照某个关键字进行递增的或递减的排序下来稳定性:举例说明,这里有一串数组:1 9 7 4 5 5 6,其中有两个5,在进行排序内部排序:元素全部放在内存中的排序。外部排序:元素太多,内存中放不下,排序过程的要求不能在内外存之间移动数据的排序。插入排序直接将一个数插入到有序的数组中,直接形成新的有序数组,相当于我们玩扑克牌,从小到大整理扑克牌,进行插入.void insertSort(int* ar原创 2021-02-23 03:46:47 · 241 阅读 · 0 评论 -
Data Structure--二叉树例题解析(2)--二叉树前序遍历--二叉树中序遍历--二叉树后序遍历
二叉树例题解析2二叉树前序遍历 递归二叉树前序遍历 非递归二叉树中序遍历 非递归二叉树后序遍历 非递归这里的三种遍历方法和之前讲的 遍历方法也有关,有兴趣可以回顾一下.二叉树前序遍历 递归我只写了前序遍历的递归方式,但是只要你将前序的掌握了,后面两种的递归方式也是大同小异,大家自己写哦.int getSize(struct TreeNode* root){ //求大小的函数 if (root){ return getSize(root->left) + getSize(root-&原创 2021-02-23 01:33:36 · 120 阅读 · 0 评论 -
Data Structure--二叉树例题解析(1)--单值二叉树--翻转二叉树--相同的树--另一个树的子树--对称二叉树--平衡二叉树
二叉树例题解析1.单值二叉树2.翻转二叉树3.相同的树4.另一个树的子树5.对称二叉树6.平衡二叉树1.单值二叉树如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。bool _isUnivalTree(struct TreeNode* root, int val){ if (root){ //存在时 return root->val == val //等于同一个值 && _isUnivalTree(root->left, val) //递归原创 2021-02-23 01:05:57 · 138 阅读 · 0 评论 -
Data Structure--二叉树的链式结构及实现
二叉树链式结构二叉树链式结构的遍历前序遍历(NLR)中序遍历(LNR)后序遍历(LRN)(1)链式的具体结构(2)链式的接口声明(3)链式的接口实现1.通过前序遍历的数组创建二叉树2.前序遍历3.中序遍历4.后序遍历5.求节点数6.求叶子节点数7.求第K层的节点8.查找节点9.销毁二叉树10.层序遍历11.是否为完全二叉树二叉树链式结构的遍历这里的N(根) L(左子树) R(右子树)前序遍历(NLR)访问根结点的操作发生在遍历其左右子树之前中序遍历(LNR)访问根结点的操作发生在遍历其左原创 2021-02-22 02:38:40 · 249 阅读 · 0 评论 -
Data Structure--二叉树的顺序结构及实现
二叉树的顺序结构及实现二叉树顺序存储堆(1)堆的具体结构(2)堆的接口声明(3)堆的实现1.初始化2.堆插入3.堆删除4.堆容量检查5.小堆向下调整6.大堆向下调整7.小堆向上调整8.大堆向上调整9.传出堆首10.判空11.堆排序二叉树顺序存储存储方式分为两种:完全和非完全堆当所有的元素按照完全二叉树存储在一维数组中的数据,我们就叫做堆,将根节点最大的堆叫做最大堆,根节点最小的堆叫做最小堆。堆的性质:1.堆中某个节点的值总是不大于或不小于其父节点的值;2.堆总是一棵完全二叉树。(1)堆的原创 2021-02-21 02:36:59 · 145 阅读 · 1 评论 -
Data Structure--树基本概念引入(二叉树)
树的表示基本概念关键字二叉树二叉树存储1.顺序存储2.链式存储基本概念树是一个非线性的数据结构,由有限的节点组成的由层次关系的集合,因为它的结构和我们显示现实生活中的数恰巧是倒过来的,所以被叫做树关键字比较简单的关键字:节点的度:一个节点含有的子树的个数称为该节点的度;叶节点或终端节点:度为0的节点称为叶节点;非终端节点或分支节点:度不为0的节点;双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;兄原创 2021-02-21 01:30:03 · 114 阅读 · 0 评论 -
Data Structure--栈和队列相关例题--循环队列问题
循环队列问题其中储存的方式和其他的功能是没有发生变化的,就是不需要释放空间,释放空间将不再是环形!!!循环队列的实现对于比较简单的接口部分我只进行注释,不进行过多的解释,大家肯定也会哦//对于环形结构体的定义typedef struct { int* _data; int _front; //第一个元素位置 int _rear; //最后元素的位置 int _k; //可存放元素的个数 int _size; } MyCircularQueue;//====原创 2021-02-21 00:39:32 · 113 阅读 · 0 评论 -
Data Structure--栈和队列相关例题--括号匹配问题--用队列实现栈--用栈实现队列
1.括号匹配问题给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。条件:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。//找到了左边的括号,就将其入栈,当找到了右边匹配的,则将左边的出栈,这样栈就为空,就成功匹配bool isValid(char * s){ stack st; stackInit(&st); //初始化 static char map[][2] = { { '(', ')' }, { '[',原创 2021-02-20 01:14:54 · 104 阅读 · 0 评论 -
Data Structure--队列基本接口的实现(详细)
队列队列也是比较简单的,主要理解管道式通路,注意理解先进先出队列typedef int QDataType;typedef struct QNode{ struct QNode* _next; //下一个节点的地址 QDataType _data; //数据 }QNode;typedef struct Queue{ QNode* _front; //类似于单链表的理解 QNode* _rear; //下一个指向}Queue;接口声明还是和上面的一样,对于比较简单原创 2021-02-20 00:37:08 · 176 阅读 · 0 评论 -
Data Structure--栈的接口实现(详细)
栈栈就是简单地用容器的方式来理解这一种方式,主要就是后进先出栈的基本结构typedef int STDataType;typedef struct stack{ STDataType* _data; //存放数据 int _size; //存放数量 int _capacity; //最大容量}stack;接口声明栈这里的部分接口就是我们之前讲过的,我挑重点的进行讲解,其他的直接贴代码//1.初始化void stackInit(stack* st);//2.检查容量v原创 2021-02-19 23:54:24 · 105 阅读 · 2 评论 -
Data Structure--双向循环链表大部分基本接口的实现(仔细讲解)
双向循环链表对于双向循环链表就是两个点:1.元素之间相互指向2.头结点和末尾元素互相指向只要满足这两个条件,就可以叫做双向循环链表这里又因为是双向的,所以对于双向循环链表来说,他有两个节点prev和next ,只有这样,才能进行相互指向,才能实现,很详细了,具体我来通过代码的实现来让大家具体理解.//双向带头循环链表的节点typedef struct ListNode{ LDataType _data; struct ListNode* _next; //下一个节点的起始位置 st原创 2021-02-14 01:22:11 · 96 阅读 · 0 评论 -
Data Structure--单链表相关例题(2)
单链表具体接上一篇博客1.找出两个单链表的起始节点对于这个种题目,我们就还是用两个指针,先对两个单链表进行循环遍历,然后再计算出之间的差值,在将长的那个指针先开始遍历多余的部分,然后再长短指针进行同事的遍历,再将其输出就可以了.struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { int lenA = 0, lenB = 0; struct ListNode* curA = h原创 2021-02-13 00:48:22 · 99 阅读 · 0 评论 -
Data Structure--单链表相关的具体例题
Data Structure对于这种题目我们在上一篇博客对接口的实现中大家也了解了很多,我就不多于介绍了,直接讲解执行过程,让大家理解就可以了!!!一起加油删除链表中给定val值的节点进行遍历链表,找出对应的值,对于要删除的值的位置分为两种,第一个或者是后面的,我们用一个if语句进行分开,其他的元素连接在一起就可以了,不理解的大家可以画表进行理解.struct ListNode* removeElements(struct ListNode* head, int val){ //if(head==原创 2021-02-12 01:21:21 · 82 阅读 · 0 评论 -
Data Structure--单链表大部分基本接口的实现(详细讲解)
单链表单链表,不是挨个顺序存储的数据,是互相相连的数据,按照逻辑顺序存放地数据这里重点要明白的是其中的逻辑规律,会有点绕口.单链表typedef int LDataType; //别名声明 typedef struct listNode{ //结构体用来存放数据和下一个地址 LDataType _data; struct listNode* _next; //下一个存放地址}listNode;typedef struct list{ //存储头结点的位置,也就是图中的第原创 2021-02-11 01:08:23 · 136 阅读 · 0 评论 -
Data Structure--例题(1)--数组内的元素移除--删除重复项--合并数组
Data Structure今天是针对于学习完顺序表后相关的一些例题的联系,注意对于内存的理解:数组内元素移除选择数组内的一个元素,对其一样的所有元素进行移除,并保留剩下的数据(注意对于复杂度的运用)1.指针内存检查2.创建一个新的变量idx3.将不需要删除的直接传入到这个新的下面,完了直接返回idxint removeElement(int* nums, int numsSize, int val){ if (nums == NULL || numsSize = 0)//非空检查原创 2021-02-09 23:54:43 · 92 阅读 · 0 评论 -
将顺序表的接口进行详细的实现(干货!!!!!!!!!)详细!!!!!!!
顺序表顺序表就是用一段连续的物理地址连续的存储单元存放的线性结构.动态顺序表:typedef struct seqList{ SLDataType* _data; //需要进行动态开辟的一个数组 size_t _size; //有效元素的个数 size_t _capacity; //当前我们可以存放的最大元素个数}seqList; //别名如果你对这个使用动态存储的结构体,只能看到12个字节,但是对于下面的静态就不一样了,大家可以试一下(很简单,利用sizeof实现)静态顺原创 2021-02-09 00:46:37 · 165 阅读 · 0 评论 -
Data structure--时间复杂度--空间复杂度
Data structure对于数据结构这个科目我们主要是对于内存主要的理解,因为在的时候,计算加的内存很小,我们对于代码的效率也要提升,才能用更加高效的代码来执行程序.在这里就分为时间复杂度和空间复杂度两种.时间复杂度时间复杂度:算法整体操作的执行次数,就是算法的时间复杂度对于时间复杂度的理解,我下面直接通过一个立体进行引入,否则光将知识点可能比较枯燥,不容易理解:对于这里的运算情况,我们引入大O渐进表示法简单的说就是我们对于复杂度的运算没必要那么精细,只要计算大概的就可以了:就如同上面的这个原创 2021-02-08 14:03:54 · 84 阅读 · 0 评论