
数据结构
文章平均质量分 86
没什么..
一个可爱的人
展开
-
数据结构---B树和B+树
B树和B+树1. 基本搜索结构2. B树概念2.1 B树的插入分析3. B+树和B*树4. MyISAM5. InnoDB1. 基本搜索结构对比于二叉搜索树、AVL树和红黑树,一般用于数据内存查找。他们不适合用于数据量很大的情况,因为一次性无法加载到内存中。上面方法其实只在内存中保存了每一项数据信息中需要查找的字段以及数据在磁盘中的位置,整体的数据实际也在磁盘中(但是读取磁盘的速度相较于内存来说,那真的是慢的不行)。缺陷:树的高度比较高,查找时最差情况下要比较树的高度次数据量如果特别大时,树原创 2021-08-07 16:17:02 · 925 阅读 · 0 评论 -
LRU Cache
LRU Cache1. 什么是LRU Cache2. LRU Cache的实现1. 什么是LRU CacheLRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也原创 2021-06-28 17:45:01 · 597 阅读 · 0 评论 -
数据结构---并查集
并查集1. 并查集原理2. 并查集实现3. 并查集应用1. 并查集原理在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。一个值或者多个值可以认为是一个集合;并查集是使用一棵树来表示一个集合;并查集的本质是由多棵树构成的森林;便于理解并查集:比如:某公司今年校招全国总共招原创 2021-06-28 14:38:06 · 260 阅读 · 1 评论 -
数据结构---哈希(Hash)
哈希1. 哈希概念2. 哈希函数3. 哈希冲突3.1 闭散列3.1.1 闭散列模拟实现3.2 开散列3.2.1 开散列模拟实现4. 基于开散列实现unordered_set5. 基于开散列实现unordered_map6. 闭散列和开散列对比7. 哈希的应用7.1 位图对于set和map来说底层所使用的是红黑树,其在搜索上面已经很厉害了,为什么还需要在搞一个unordered_set和unordered_map呢?#include<iostream>#include<vector&g原创 2021-06-19 18:55:04 · 4647 阅读 · 1 评论 -
底层实现set和map
底层实现set和map1. 改进红黑树2. 对于set模拟封装3. 对于map模拟封装1. 改进红黑树通过STL可以得到,对于set和map的实现底层所使用的的都是红黑树,所以这里比较难得是对模板的使用。#pragma onceenum Color{ RED, BLACK};template<class T>struct RBTreeNode{ RBTreeNode<T>* _left; RBTreeNode<T>* _right; RBT原创 2021-06-16 19:47:00 · 362 阅读 · 0 评论 -
数据结构---红黑树
红黑树1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树的插入操作5. 红黑树的验证6. 红黑树与AVL树的比较1. 红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。2. 红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的 (不能有原创 2021-06-09 10:16:37 · 299 阅读 · 0 评论 -
数据结构---AVL树
AVL树1. AVL树的概念2. AVL树节点的定义3. AVL树的插入3.1 AVL树的旋转3.1.1 右单旋3.1.2 左单旋3.1.3 先左单旋再右单旋3.1.4 先右单旋再左单旋3.1.5 完整的AVL树插入代码4. AVL树的验证5. AVL树的性能1. AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明原创 2021-06-01 23:48:21 · 842 阅读 · 4 评论 -
二叉搜索树
二叉搜索树1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树操作1.2.1 二叉搜索树插入1.2.1 二叉搜索树查找1.2.1 二叉搜索树删除(很重要)2. 二叉搜索树实现的完整代码3. 二叉搜索树的应用1. 二叉搜索树1.1 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树1.2 二叉搜索树操作1原创 2021-05-11 15:16:44 · 787 阅读 · 2 评论 -
二叉树的深度遍历优先(前中后序遍历)
LeetCode中的前中后序遍历OJ题1. LeetCode第144题---二叉树的前序遍历2. LeetCode第94题---二叉树的中序遍历3. LeetCode第145题---二叉树的后序遍历对于二叉树部分LeetCode还有很多简单但是好的题目:LeetCode关于二叉树好的题解析一链接: link.LeetCode关于二叉树好的题解析补充链接: link.1. LeetCode第144题—二叉树的前序遍历链接: link./** * Definition for a binar原创 2021-01-31 17:47:22 · 310 阅读 · 0 评论 -
数据结构---归并排序
归并排序1. 基本思想二级目录三级目录数据结构—其他的排序(排序1)链接: link.数据结构—快速排序(排序2)链接: link.以上的排序方法适用于内存排序。但是对于归并排序来说更适用于外存(磁盘)排序,当然也可以用作内存排序1. 基本思想归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表原创 2021-01-27 21:21:29 · 3467 阅读 · 5 评论 -
数据结构---快速排序
排序21. 快速排序1.1 hoare方法(左右指针法)1.1.1 时间复杂度的分析1.1.2 三数取中(优化快排)1.1.3 完整代码1.2 挖坑法(重点解法便于理解)1.3 前后指针法1.4 快排的非递归2. 归并排序1. 快速排序快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都原创 2021-01-25 23:14:19 · 2521 阅读 · 0 评论 -
数据结构中排序算法(直接插入、希尔排序、选择排序、堆排序、冒泡排序)
排序1. 插入排序2. 希尔排序3. 选择排序4. 堆排序5. 冒泡排序1. 插入排序2. 希尔排序3. 选择排序4. 堆排序5. 冒泡排序原创 2021-01-23 17:02:40 · 996 阅读 · 1 评论 -
平衡二叉树和层序的遍历解析
基础面试题补充1. LeetCode第110题---平衡二叉树2. 牛客网---二叉树遍历1. LeetCode第110题—平衡二叉树链接: link.一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 为理解本题的重要点。这题有两种解题思路①相当于前序遍历的思想。把它分为当前树和左子树右子树,写出当前树的思路然后对左子树和右子树实现递归即可。如果当前树的左子树和右子树都不满足平衡二叉树的条件那么就直接可以返回false,然后再开始判断左子树中的每个子树是否满足平衡二叉树的定义,总之要把原创 2021-01-18 20:49:27 · 1031 阅读 · 0 评论 -
LeetCode中关于二叉树好的题解析
二叉树基础面试题1. LeetCode第144题---二叉树的前序遍历2. LeetCode第94题---二叉树的中序遍历3. LeetCode第145题---二叉树的后序遍历4. LeetCode第965题---单值二叉树5. LeetCode第104题---二叉树的最大深度6. LeetCode第226题---翻转二叉树7. LeetCode第100题---相同的树8. LeetCode第572题---另一颗树的子树9. 剑指offer第28题---对称二叉树1. LeetCode第144题—二叉树的原创 2021-01-17 20:12:05 · 292 阅读 · 1 评论 -
数据结构---二叉树链式结构的实现
二叉树链式结构的实现1. 二叉树链式结构的遍历1.1 前序/中序/后序的递归结构遍历1.2 层序遍历2. 完整代码1. 二叉树链式结构的遍历所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。1.1 前序/中序/后序的递归结构遍历所谓的前中后序是根据访问根结点操作发生位置先后命名的。为了能更加好的理解这一部分:首先你要把任意的一个二叉树都看作三个部分①原创 2021-01-14 17:20:35 · 406 阅读 · 0 评论 -
数据结构---二叉树的顺序结构及实现
反反复复原创 2021-01-13 15:31:31 · 2259 阅读 · 4 评论 -
数据结构---二叉树
二叉树1. 树的概念及结构1.1树的概念1.2 树的表示2. 二叉树的概念及结构2.1 概念2.2 数据结构中的二叉树2.3 特殊的二叉树2.4 二叉树的存储结构2.4.1 顺序存储2.4.2 练习(增强对于二叉树的结点认识)1. 树的概念及结构1.1树的概念树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合。把它叫做树是因为他看起来像一颗倒挂的树,也就是说他是根朝上,而叶朝下的。任何一颗树都可以看做是根结点和子树的概念。有时候我们会把根节点处称为深度0,那么当是空树的时候,原创 2021-01-12 16:39:38 · 2973 阅读 · 4 评论 -
数据结构---队列
队列1.1队列的概念及结构1.2 队列的实现1.3队列的完整代码1.4 LeetCode第225题---用队列实现栈1.5 LeetCode第232题---用栈实现队列1.1队列的概念及结构只允许在一端进行插入插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点。入队列:进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。说白了队列就是从队尾入数据,从队头出数据,切要保证先进先出的特点。1.2 队列的实现队列也是可以使用数组和链表的结构实现的,使用链表的结构原创 2021-01-11 20:17:35 · 336 阅读 · 0 评论 -
数据结构---栈
文章目录1.1 栈的概念及结构1.2 栈的实现1.2.1顺序表和链表实现栈不同及优缺点1.3 数组实现栈的完整代码1.4 栈的相关选择题1.5 LeetCode第20题---有效的括号1.1 栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶出栈:栈的删除操作叫做出栈,出数据也在栈顶。1.2 栈的实现栈的实现一般可以使用数组或原创 2021-01-11 17:26:58 · 1340 阅读 · 2 评论 -
牛客网---删除链表中重复的结点
的点点滴滴原创 2021-01-01 17:31:19 · 255 阅读 · 0 评论 -
LeetCode第147题---对链表进行插入排序
对链表进行插入排序提示:对于LeetCode所给出的这个动图来说,只适合数组的插入,不适合单链表的插入排序。解题思路:把第一个当做有序的结点,剩下的一次拿下来头插或者尾插或者中间插三种情况,当你拿下来的时候一定要记得保留下一个结点地址,否则你插完一个之后就找不到下一个了。/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }原创 2020-12-30 18:27:32 · 292 阅读 · 0 评论 -
LeetCode第138题---复制带随机指针的链表
复制带随机指针的链表提示:这个题算是一个复杂链表,因为它里面还有一个random的随机指针,题目要求复制这个复杂链表。解题思路:①拷贝结点链接在原结点的后面,然后将他们连接起来,②处理拷贝结点的random那么你复制的结点random就是你原结点random的后面一个,③然后拆解出你复制的链表。①拷贝结点,链接到原节点的后面 Node* cur = head; //当cur为空的时候,就不需要再继续拷贝结点了,作为结束的判断条件 while(cur) {原创 2020-12-30 14:44:46 · 438 阅读 · 1 评论 -
剑指offer中的第56题---异或的精彩使用
数组中数字出现的次数(单身狗问题)题目描述:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。这类题类似于找单身狗,单个数的问题,需要用到异或的思想,什么是异或?就是相同的数字&就会变为0,然而不同的数字&就会变为1解题思路:我让数组里面所有的数字异或,异或完剩下的最终结果就是那两个不同数字相异或所产生的结果,此时我在里面任意的32个比特位中找到一位为1,然后我通过这一位将数组分为两波原创 2020-12-29 14:54:47 · 227 阅读 · 0 评论 -
LeetCode中的链表题
第160题相交链表题目描述:编写一个程序,找到两个单链表相交的起始节点这里相交可不能用值来比较,一定要使用地址来判断,因为只有地址相同的时候,才能指向同一个结点位置解题的思路:先算出两个链表的长度,然后让长的哪一个先走两个之间差值的步数,然后在同时走(那么他们到达相交结点的长度相同)typedef struct ListNode ListNode;struct ListNode *getIntersectionNode(struct ListNode *headA, struct Li原创 2020-12-28 19:46:58 · 299 阅读 · 0 评论 -
LeetCode题库中关于寻找链表的中间结点类似问题
一.链表的中间结点题目描述:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。这是归属在一类快慢指针的解题类型中的题目。//可以定义两个指针,一个每次走两步,一个每次只走一步,你就会发现,当快指针走到结尾的时候,慢指针刚好走到中间struct ListNode* middleNode(struct ListNode* head){ struct ListNode* slow =head; struct ListNode*原创 2020-12-28 18:38:03 · 245 阅读 · 0 评论 -
Leetcode里面的题
此时定义了三个变量,一个为dst,prev和cur,那么为什么会这么向呢?int removeDuplicates(int* nums, int numsSize){ //数组在一开始的时候有可能为空,这个情况也一定要考虑进去 if (numsSize == 0) return 0; int prev = 0, cur = 1, dst = 0; while (cur < numsSize) //用cur来判断,因为他最终会越界,作为循环来结束的一个判断标志,prev指向数组.原创 2020-12-28 18:01:25 · 214 阅读 · 0 评论 -
LeetCode第141题----环形链表I和LeetCode142题----环形链表II
一. 环形链表I题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。解题的代码量很少,但是并不是说就很简单,这个题的实现思路也不是很困难,但是如果给你原创 2020-12-28 16:37:31 · 267 阅读 · 0 评论