数据结构与算法
文章平均质量分 93
个人数据结构学习笔记
凌桓丶
现腾讯边缘存储研发工程师,前字节跳动流式计算研发工程师、CSDN博客专家。
展开
-
高级数据结构与算法 | 布谷鸟过滤器(Cuckoo Filter):原理、实现、LSM Tree 优化
布谷鸟过滤器(Cuckoo Filter)是一种节省内存空间的概率数据结构,基于布谷鸟哈希算法实现的过滤器,和布隆过滤器一样,用于检测指定元素是否存在于某个集合中原创 2024-02-08 22:28:19 · 3487 阅读 · 0 评论 -
高级数据结构与算法 | 自适应基数树(Adaptive Radix Tree)
Adaptive Radix Tree(ART)是由 Phil Bagwell 在 2000 年提出的一种基于 Trie Tree 实现的数据结构,旨在解决 Trie Tree 在空间效率和查找性能方面存在的问题。与其他基于 Trie 的数据结构(如 Radix Tree、Digital Search Tree)相比,其引入了自适应节点,高度压缩等特性,具有更好的空间效率和更快的查找速度。原创 2023-04-16 14:00:00 · 2493 阅读 · 1 评论 -
高级数据结构与算法 | 基数树(Radix Tree)
Radix Tree是一种基于 Trie(字典树)的数据结构,旨在解决字符串搜索和匹配的问题。它最早由 Fredkin 在 1960 年提出,并在之后被广泛应用于各种应用领域。其最大的特点就是在 Trie 的基础上,加入了路径压缩的逻辑,通*合并前缀的方式大大的减少了 Trie 中的节点冗余问题,不仅提高了查询效率,还减少了存储空间的使用。原创 2023-04-14 10:00:00 · 2214 阅读 · 0 评论 -
高级数据结构与算法 | 三元搜索树(Ternary Search Tree)
Ternary Search Tree(三元搜索树),它是由 Bentley 和 Sedgewick 在 1997 年提出的一种基于 Trie 的思想改良的一种数据结构,其目的在于优化 Trie 在大规模数据集下的时间、空间开销。原创 2023-04-13 10:00:00 · 1274 阅读 · 0 评论 -
现代的缓存设计方案:Window-TinyLFU
现代的缓存设计方案:Window-TinyLFu原创 2022-03-27 21:30:30 · 2428 阅读 · 3 评论 -
为什么大部分NOSQL数据库选择使用LSM树而非B+树?
LSM树的架构介绍与核心执行流程原创 2021-08-24 20:27:46 · 1466 阅读 · 1 评论 -
高级数据结构与算法 | LFU缓存机制(Least Frequently Used)
文章目录LFUCache的原理结构设计LFUCache的实现LFUCache的原理结构设计LFUCache的实现class LFUNode{public: LFUNode(int key, int value, int freq) : _key(key) , _value(value) , _freq(freq) {} int _key; int _value; int _freq; //访问次数原创 2020-11-20 10:11:34 · 1352 阅读 · 1 评论 -
AC自动机:如何实现敏感词过滤?
文章目录原创 2020-10-22 20:15:50 · 2831 阅读 · 5 评论 -
字符串匹配算法(三):KMP(KnuthMorrisPratt)算法
单模式字符串匹配算法KMP算法的原理以及实现原创 2020-10-20 15:43:41 · 536 阅读 · 1 评论 -
字符串匹配算法(二):BM(BoyerMoore)算法、坏字符规则,好后缀规则
BM算法的全程叫做Boyer-Moore,是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP 算法的 3 到 4 倍。下面就讨论一下BM算法的原理以及如何实现原创 2020-10-19 20:06:07 · 2986 阅读 · 0 评论 -
字符串匹配算法(一):BF(BruteForce)算法和RK(RabinKarp)算法
字符串匹配算法中的BF和RK算法原创 2020-10-18 15:05:23 · 705 阅读 · 0 评论 -
什么是基数排序?
文章目录什么是基数排序稳定的计数排序基数排序的实现什么是基数排序稳定的计数排序数据结构与算法 | 计数排序计数排序的基本思路在这里就不多进行介绍了,如果不了解的可以看看我以前写的博客。void countSort(vector<int>& arr){ int max = arr[0], min = arr[0]; //找出最大值和最小值,缩减范围 for(int i = 1; i < arr.size(); i++) {原创 2020-10-17 19:58:43 · 12964 阅读 · 6 评论 -
Trie(字典树) : 如何实现搜索引擎的关键词提示功能?
文章目录搜索中的关键词提示Trie树的介绍Trie树的实现Trie树的优缺点搜索中的关键词提示当我们在搜索引擎中进行搜索时,有时仅仅输入了搜索内容的一部分,搜索引擎就会提示我们可能的一些选择,这样我们就不再需要将查询词完整的输入,大大节约了我们的时间。而实现这一功能的基石,正是Trie树Trie树的介绍Trie树又叫做字典树、前缀树。顾名思义,它是一个用于处理多模式字符串匹配的多叉树,用来在一组字符串中快速的找到某个字符串。其本质就是共享字符串的公共前缀,即利用字符串之间的公共前缀,将重复的原创 2020-10-16 19:35:43 · 1192 阅读 · 0 评论 -
高级数据结构与算法 | 深度遍历搜索(DFS)与广度遍历搜索(BFS)
文章目录深度优先搜索(DFS)员工的重要性图像渲染岛屿的周长被围绕的区域岛屿数量岛屿的最大面积广度优先搜索(BFS)N叉树的层序遍历腐烂的橘子单词接龙最小基因变化打开转盘锁深度优先搜索(DFS)深度优先搜索的核心思想就是一条道走到黑,其实就和二叉树的前、中、后序遍历一样,都会先一直沿着一个方向走,当走不通了再往回找其他的路。//模板DFS(当前这一步的处理逻辑) { 1. 判断边界,是否已经一条道走到黑了:向上回退 2. 尝试当下的每一种可能 3. 确定一种可能之后,继续下一步 Dfs(原创 2020-10-02 23:05:37 · 756 阅读 · 0 评论 -
高级数据结构与算法 | 回溯算法(Back Tracking Method)
文章目录回溯电话号码的字母组合二进制手表组合总数全排列活字印刷N皇后N皇后II回溯回溯是一种通过穷举所有可能情况来找到所有解的算法。如果一个候选解最后被发现并不是可行解,回溯算法会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。当探索到某一步时,发现原先选择并不优或 达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。也可以称为剪枝点,所谓的剪枝,指的是把不会找到目标,或者不必要的路径裁剪掉。从上面看出,回溯其实就是选优搜索原创 2020-10-04 21:31:15 · 650 阅读 · 0 评论 -
数据结构与算法 | 用队列实现栈
上一章实现了用栈来实现队列,这一次我们试试用队列来实现栈。因为栈的特性是先进后出,队列是先进先出。所以我们可以想到用两个队列,一个空队列,一个放数据,当我们入队的时候将数据直接放入非空队列,出队的时候将非空队列中除队尾外的所有元素放到空队列中,再出队尾即可。如下图如数据1,2,3,4全部入队模拟出栈先将除队尾全部放到原来的空队列中再进行出队,即可实现栈的特性先进后出下面开...原创 2020-02-21 17:01:54 · 950 阅读 · 0 评论 -
海量数据处理(二) :常见海量数据处理方法
文章目录位图对于常见的海量数据处理方法,通常为以下几种,下面的题解也会围绕这几种解法展开位图 / 布隆过滤器字典树 / 倒排索引外部排序分治 / 哈希切割 + 堆 / 排序位图1. 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。当我们看到这样一个题目时,脑海中可能第一时间想到的就是排序 + 二分,但是要知道40亿个无符号整数所占据的内存空间达到了16G,这样的数据是无法放进内存中进行计算的,所以上面的方法无法实现。我们需要用位图来原创 2020-09-21 20:23:14 · 964 阅读 · 0 评论 -
高级数据结构与算法 | 跳跃表(Skip List)
文章目录区间查询时链表与顺序表的局限跳表=链表+索引跳表的原理晋升插入删除跳表的实现跳表VS红黑树区间查询时链表与顺序表的局限假设有这样一个情景, 此时需要设计一个拍卖系统,对于商品的展示需要支持按照价格、销量、好评、拍卖人编号等方式进行排序,并且还需要支持按照名字的精确查询以及不需要名字的全量查询。拍卖行商品的列表是线性的,那么首选的数据结构应该就是线性结构中的链表和顺序表。假设此时是一个按照价格进行排序的集合如果此时使用的是一个顺序表,当有商品插入时首先就要确认其插入的位置,因为顺序表支持下原创 2020-09-09 22:04:38 · 1160 阅读 · 0 评论 -
高级数据结构与算法 | B树、B+树、B*树
文章目录搜索结构B树B+树B*树搜索结构如果我们有大量的数据需要永久存储,就需要存储到硬盘之中,但是硬盘的访问速度远远小于内存,并且由于数据量过大,无法一次性加载到内存中。此时,就可以考虑将数据存储在硬盘中,而数据的地址则加载到内存中,通过某种搜索结构进行存储,使用时只需要通过该结构查找到地址,在通过地址去找到对应的数据即可。之前我博客中介绍了几种搜索结构:二叉搜索树、AVL树、红黑树、哈希、位图、布隆过滤器。考虑到查找性能以及内存消耗,其中适合这种场景的只有平衡二叉搜索树(AVL、红黑树)。原创 2020-08-21 00:23:54 · 764 阅读 · 0 评论 -
高级数据结构与算法 | LRU缓存机制(Least Recently Used)
文章目录LRUCache的原理LRUCache的实现LRUCache的原理LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘原创 2020-08-08 12:23:26 · 778 阅读 · 0 评论 -
高级数据结构与算法 | 并查集(Union-Find)
文章目录并查集的原理并查集的实现例题并查集的原理在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)。并查集底层通常常用数组存储,并且存在以下特性:数组的下标对应集合中元素的编号数组中如果为负数,负号代表根,数字代表该集合中元素个数数组中如果为非负数,代表该元素双亲在数组原创 2020-08-07 19:17:43 · 876 阅读 · 0 评论 -
海量数据处理(一) :位图与布隆过滤器的概念以及实现
目录位图位图概念位图的实现思路setresettest完整代码布隆过滤器布隆过滤器概念布隆过滤器的实现思路插入查找删除完整代码位图位图概念位图其实就是哈希的变形,他同样通过映射来处理数据,只不过位图本身并不存储数据,而是存储标记。通过一个比特位来标记这个数据是否存在,1代表存在,0代表不存在。位图通常情况下用在数据量庞大,且数据不重复的情景下判断某个数据是否存在。例如下面这道十分经典的题目给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。原创 2020-07-15 17:21:20 · 1519 阅读 · 2 评论 -
高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶
#pragma once#include<vector>#include<string>namespace lee{ //算法科学家总结出的一个增容质数表,按照这样增容的效率更高 const int PRIMECOUNT = 28; const size_t primeList[PRIMECOUNT] = { 53ul, 97ul, 193ul, 389ul, 769ul, 1543ul, 3079ul, 6151ul, 12289ul, 24593ul,原创 2020-07-12 21:20:19 · 1607 阅读 · 1 评论 -
高级数据结构与算法 | 红黑树(Red-Black Tree)
文章目录红黑树红黑树的概念红黑树的性质红黑树与AVL树红黑树的实现红黑树的节点红黑树的插入红黑树的查找红黑树的验证完整代码红黑树红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是红色或者黑色。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个节点不是红色就是黑色根节点必须为黑节点如果一个节点是红的,则他的两个孩子是黑的(不存在连续的红结点)从某一节点出发到其所有原创 2020-07-08 17:41:31 · 1410 阅读 · 0 评论 -
高级数据结构与算法 | AVL树 (高度平衡树)
文章目录AVL树实现思路数据结构查找平衡因子旋转右旋左旋右左双旋左右双旋插入删除AVL树的验证中序遍历平衡判断AVL树的性能完整代码实现AVL树AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-Velsky和E. M. LandisAVL树其实就是在二叉搜索树的基础上,引入了平衡因子的概念,通过旋转来调整平衡因子,使得二叉树始原创 2020-06-28 18:54:44 · 3532 阅读 · 4 评论 -
高级数据结构与算法 | 二叉搜索树(Binary Search Tree)
文章目录二叉搜索树的概念二叉搜索树的作用排序查找实现思路查找插入删除删除、拷贝等代码实现K模型KV模型二叉搜索树的概念二叉搜索树又叫做二叉排序树,他是一个具有以下特性的二叉树。1. 二叉搜索树的左孩子比父节点小,右孩子比父节点大。2. 二叉搜索树的左子树的全部节点都小于根节点,右子树的全部节点都大于根节点。3. 所有节点的左右子树都为二叉搜索树4. 键值是唯一的,所以二叉搜索树不能有相同的键值。例如以下数据int arr[] = { 5, 3, 7, 9, 1, 4 };按照上面的规则原创 2020-06-15 18:33:25 · 985 阅读 · 0 评论 -
数据结构与算法 | 计数排序
之前的几篇讲解了所有常用的比较排序,这次就来讲一讲非比较排序的计数排序。计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。和其他排序不一样,计数排序并不是通过比较元素的大小来实现的,而是通过统计所有相同元素出现的次数来进行排序,思路与其他的排序大有区别。例如:int arr[] = {2, 5, 3, 0, 2, 3, 0, 3}我们利用哈希表的直接定址法, 如果某个元素出现过一次...原创 2020-03-30 22:11:36 · 771 阅读 · 0 评论 -
数据结构与算法 | 归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。归并排序的核心思路就是不断将数据拆分成左右两部分子序列,直到所有子序列有序,然后将有序的子序列不断合并成有序的序列, 最后整体有序它和快速排序一样都呈树状结构...原创 2020-03-28 21:36:02 · 533 阅读 · 0 评论 -
数据结构与算法 | 快速排序:Hoare法, 挖坑法,双指针法,非递归, 优化
前两章讲解了排序中的选择排序和插入排序,这次就来讲一讲交换排序中的快速排序。快速排序时间复杂度:平均 O(nlogn) 最坏 O(n2)快速排序,顾名思义,它的排序的效率是非常高的,在数据十分杂乱的时候他的效率甚至能远远超过希尔排序和堆排序。而这个排序的核心思想就是以交换为核心的划分还是以前的方法,首先讲解单趟的思路。快速排序单趟的思路,就是先选定某个枢轴,以这个枢轴为基准,展开划分,划分...原创 2020-03-26 08:05:29 · 1078 阅读 · 0 评论 -
数据结构与算法 | 直接插入排序、希尔排序
前几章讲了选择排序中的直直接选择排序、双向选择排序、堆排序,这次来讲讲利用‘插入’为核心来实现的插入排序算法。插入排序把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。其实在我们的生活中,插入排序是随处可见的例如打扑克牌时我们将发来的卡牌一张一张的插入进排序好的手牌中。...原创 2020-03-21 18:14:55 · 668 阅读 · 0 评论 -
数据结构与算法 | 直接选择排序、双向选择排序
前几章讲了交换排序中较为复杂切高效的堆排序,这次就来讲讲选择排序中最简单的直接选择排序及其改进双向选择排序。选择排序:顾名思义,就是主要通过选择来完成的排序,每一趟从待排数据中选择一个最大或者最小的数据,将其放到序列的起始,直到全部数据排完。直接选择排序的思路是这样的:例如我们要排升序,我们就假设第一个数据为最小值,将它的下标存入变量min中,如果后面存在比第一个数据还要小的数据,则将那个数...原创 2020-03-19 20:36:25 · 2441 阅读 · 1 评论 -
数据结构与算法 | 二叉树的实现
前几章实现了二叉树的顺序结构和二叉树的几种遍历,这次就来实现二叉树的链式结构数据结构typedef char BTDataType;typedef struct BTNode{ BTDataType data; struct BTNode* left; struct BTNode* right;}BTNode;实现的接口// 通过前序遍历的数组构建二叉树BTNode* B...原创 2020-03-17 16:08:09 · 631 阅读 · 0 评论 -
数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)
二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次。而一般有四种遍历方法:前序、中序、后序、层序,下面就分别讲一下四个遍历的思路以及代码实现例如我们以下面这个字符串用先序遍历来建树char str[] = "ABD##E##CF##G##";因为这里主要讲解的是四种遍历,所以建树以及其他的操作会放到下节构成的树如下:前序遍历前序...原创 2020-03-16 02:44:43 · 862 阅读 · 0 评论 -
数据结构与算法 | 堆排序
堆排序在上一章节里我们完成了堆的实现和基本操作:https://blog.csdn.net/qq_35423154/article/details/104598702这里就顺带讲一讲堆排序堆排序是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。通过堆来进行数据选择时间复杂度: O (N*logN)空间复杂度: O (1)稳定性:不稳定下面来讲一下具体思路如...原创 2020-03-04 16:38:13 · 459 阅读 · 0 评论 -
数据结构与算法 | 堆
二叉树的顺序结构堆的概念及结构堆的实现 二叉树的顺序结构普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储完全二叉树的顺序存储非完全二叉树的顺序存储可以看到,这样是一种对空间的浪费,所以普通的二叉树不适合用数组来存储 堆的概念及结构如果有一个关键码的集合K...原创 2020-03-02 10:07:33 · 618 阅读 · 1 评论 -
数据结构与算法 | 树与二叉树
树的概念二叉树的概念树的概念和结构树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,如图所示有一个特殊的结点,称为根节点,根节点没有前驱结点除根节点外,其余结点被分成M个互不相交的集合T1、T2、、、、、Tm, 其中每一个集合Ti又是一棵结构与树类似的子树。每棵子树的根节点有且只有一个前驱,可以有0个或多个后驱结点...原创 2020-02-29 21:40:45 · 497 阅读 · 1 评论 -
数据结构与算法 | 循环队列
循环队列实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数据的空间用作缓冲,这部分不用于存数据,用于防止溢出,当数组访问到这一部分时就将他归零,实现循环的结构。每次入数据通过队尾指针入,出数据通过队首指针出,和队列的操作方法差不多,每一步骤的具体实现思路...原创 2020-02-24 20:53:23 · 780 阅读 · 0 评论 -
数据结构与算法 | 斐波那契查找
要想能够理解这一算法,需要先了解1.二分查找https://blog.csdn.net/qq_35423154/article/details/1013835182.斐波那契数https://blog.csdn.net/qq_35423154/article/details/101684466黄金分割具有严格的比例性、艺术性、和谐性,蕴藏着丰富的美学价值,这一比值能够引起人们的美感,被认...原创 2019-10-30 22:02:04 · 521 阅读 · 0 评论 -
数据结构与算法 | 插值查找
折半查找法:https://blog.csdn.net/qq_35423154/article/details/101383518当我们在使用折半查找法的时候,都会有个疑问,为什么一定要用折半,为什么不能折三分之一,四分之一呢?为什么我们不能根据我们查找的数值的不同而制定不同的比例来查找呢?于是,经过算法科学家的努力,插值查找法(按比例查找)诞生了。这个方法的实现非常简单,它仅仅修改了折半查找...原创 2019-10-29 13:37:14 · 412 阅读 · 0 评论 -
数据结构与算法 | 二分查找
假如我们在图书馆中整理书记,书按照序号有序排序,序号不连续,当我们需要从书堆中找到特定序号的书时,如果一本一本查找的话,我们可能需要查找N次。但如果我们先找到中间的书,将书分成两堆,与待查书对比,待查书序号较大的时候从序号大的一堆中在分成两堆继续对比,书号小时从小的那堆继续对比,直到找到对应书号,这样只需查找log2(n)次。这就是二分查找法。例如我们有一个被排序好的数组int a[10] ...原创 2019-09-25 21:08:36 · 414 阅读 · 0 评论