
数据结构和算法
文章平均质量分 95
强化个人数据结构和算法能力,为高效代码做铺垫
z_stand
远离颠倒梦想,究竟涅槃
展开
-
关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
二月的最后一篇水文…想写一些有意思的东西。图计算或者存储场景中的 好友关系拓扑分布式事务场景中冲突环中的 死锁检测部分原创 2022-02-27 13:54:10 · 2207 阅读 · 2 评论 -
单机 “5千万以上“ 工业级 LRU cache 实现
Rocksdb 单机 五千万 qps 工业级 LRU-Cache的实现设计原创 2021-07-18 17:40:30 · 2716 阅读 · 2 评论 -
从BloomFilter到Counter BloomFilter
Traditional bloomfilter实现 以及 动态增加/删除 字符串的counter bloomfilter实现。原创 2021-03-18 00:06:29 · 362 阅读 · 0 评论 -
贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码
1. 贪心算法概览贪心算法是一种算法思想。希望能够满足限制的情况下将期望值最大化。比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下找到最优的解决问题的方式。...原创 2021-02-16 15:06:18 · 616 阅读 · 0 评论 -
字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
基于Trie树的高效敏感词过滤算法,interesting!和单模式串的KMP算法相似。原创 2021-02-10 14:50:37 · 1460 阅读 · 0 评论 -
字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现
BM和KMP 算法设计细节及其实现差异,欢迎一起烧脑。原创 2021-02-04 01:56:04 · 2601 阅读 · 0 评论 -
数据结构 -- 图与图存储
我们在使用像QQ ,微信,微博,快手,抖音等社交软件的过程中经常需要添加好友,关注好友和被好友关注。这个过程中 这样的社交网络中的好友关系就需要被存储下来,存储在各个公司的后台服务器之上,都会作为每个公司的数据资产来进行自己核心业务的开发(视频推荐、好友推荐。。。)这个用来保存好友关系的数据结构就是 图,接下来探索一下这个非线性数据结构的基本实现。图的一些基本概念如上导图,已经描述的很清楚了,这里重点说的是图的图存储方式。基本的存储方式有两种:邻接矩阵邻接表邻接矩阵的底层依赖一个二维数组。原创 2020-08-24 01:06:22 · 525 阅读 · 0 评论 -
数据结构 -- 散列表
散列表作为一种能够提供高效插入,查找,删除 以及遍历的数据结构,被应用在很多不同的存储组件之中。就像rocksdb中的hashskiplist,redis的有序集合,java的 LinkedHashMap 等 都是一些非常有特色的核心数据结构,来提供线上高效的数据操作能力。本节对工业级散列表的基本实现 探索一番,希望加深自己对存储产品设计理念的理解。工业级的散列表需要具有如下能力:初始大小散列表的初始大小,刚开始的时候需要拥有一定量的存储空间,根据实际应用情况可以通过设置散列表的初始大小,从原创 2020-08-23 14:27:54 · 361 阅读 · 1 评论 -
skiplist跳表的 实现
文章目录前言跳表结构时间复杂度空间复杂度高效的动态插入和删除跳表索引的动态更新总结详细实现前言rocksdb 的memtable中默认使用跳表数据结构对有序数据进行的管理,为什么呢?同时redis 也用跳表作为管理自己有序集合的数据结构,为什么他们不选择用红黑树来管理(同样能够提供高效的插入,查找,删除操作,而且各种语言都已经封装好了很多轮子),就选择跳表来实现?今天就来仔细探讨一下这个数据结构。跳表结构对于一个单链表来说,即使链表中存储的数据结构是有序的,想要查找一个元素也需要从头到尾进行查找原创 2020-05-31 20:44:18 · 547 阅读 · 0 评论 -
栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
我们使用浏览器的时候经常会用到前进、后退功能依次访问完一串页面 a – b – c之后点击后退功能,则能够依次看到c – b – a的页面。但是这个过程中,如果后退到了页面b,点击了新的页面d,则再点击前进无法回到页面c。这个过程的实现就是我们 “栈”数据在其中起作用了。实现栈的基本实现有如下两种:顺序栈 – 基于数组的实现链式栈 – 基于链表的实现顺序栈实现#include <iostream>#include <assert.h>using nam原创 2020-05-10 17:41:16 · 692 阅读 · 0 评论 -
数据结构和算法 -- 学习导图
数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步。以下为今后持续学习精进的导图概览:...原创 2020-04-27 23:21:02 · 439 阅读 · 0 评论 -
LRU算法 -- 链表 完整实现
LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统。属于 我们操作系统设计中的 时间局部性原理,最长时间未被访问的数据优先淘汰,当内存中已存在的数据再次被访问时,则进行热度的提升。本文为了巩固数据结构相关知识,特 使用链表数据结构方式完整实现LRU链表...原创 2020-04-27 22:43:39 · 827 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像输入描述:二叉树的镜像定义:源二叉树8/ 6 10/ \ / 5 7 9 11镜像二叉树8/ 10 6/ \ / 11 9 7 5从描述中我们可以看到,镜像的过程就是将二叉树的左右子数交换的过程,直到叶子节点。方法一:递归void Mirror(TreeNode *pRoot) { if...原创 2020-02-13 09:33:54 · 252 阅读 · 1 评论 -
计数排序 算法
算法思路统计待排序数列中每个数字出现的次数入数据结构的过程其实就是排序的过程最后再按照统计结果覆盖原序列就行了PS: 前提条件是知道排序元素的范围算法实现void count(vector<int> &arr, int range) { vector<int> count(range+1,0); for (int i = 0;i < arr...原创 2020-02-11 20:11:12 · 190 阅读 · 0 评论 -
归并排序 算法
算法思路将一个数列不断拆分为子序列,直到只剩下0或者1个元素再将子序列按顺序合并为原来数列的大小,完成排序代码实现//合并两个有序数组vector<int> merge_two_sort(vector<int> &arr1, vector<int> &arr2) { vector<int> result; int i...原创 2020-02-11 14:59:13 · 221 阅读 · 0 评论 -
堆排序 算法
算法思路待排序元素按照大小,在二叉树位置上排列构造最大堆(最小堆)跟节点元素为所有元素最大的一个每次取构造最大堆完成的根节点,并重新构造最大堆重复以上步骤,直到堆中只剩下一个元素则排序完成算法实现void max_heap(vector<int> &arr, int beg, int end) { int dad = beg; //因为数组下标从0开始,所以s...原创 2020-02-11 14:39:57 · 219 阅读 · 0 评论 -
选择排序 算法
算法思路维护一段有序数列,同时遍历待排序数列,找到最小的元素插入有序数列中重复,直到待排序数列没有剩余元素代码实现void select_sort(vector<int> &arr) { for (int i = 0;i < arr.size(); ++i) { int temp = arr[i]; int index = i; for (int...原创 2020-02-11 14:11:23 · 209 阅读 · 0 评论 -
希尔排序 算法
算法思路插入排序的改进版,选择插入距离远的元素选择一个间距,将序列分成很多子序列并行插入排序降低间距,并重复插入元素,直到间距将为1,完成排序。算法实现void shell_sort(vector<int> &arr, int beg, int gap) {//gap为1时即直接插入排序 for (int i = beg + gap; i< arr.siz...原创 2020-02-11 13:52:48 · 251 阅读 · 0 评论 -
插入排序 算法
算法思路维护一段有序数列同时遍历待排序数列,在有序数列中找到合适的位置插入元素基本代码实现如下:void insertion(vector<int>& arr){ for(int i=1;i<arr.size();i++){ int temp=i; for(int j=i-1;j>=0;j--){//有序序列不断得增加 if(arr[t...原创 2020-02-11 13:28:27 · 169 阅读 · 0 评论 -
快速排序 算法
算法思路序列终任意选择一个数,把序列分为比这个数大和比这个数小的两个子序列不断重复以上步骤(递归)代码实现void partition(vector<int> &arr, int begin , int end) { int ret = arr[begin]; int index = begin + 1;}...原创 2020-02-11 10:52:44 · 179 阅读 · 0 评论 -
冒泡排序 算法
算法思路:从第一个元素开始遍历,比较当前元素和下一个元素的大小不符合,则交换结束最后一个元素,则重新遍历实现:void bubble_sort(vector<int> &arr) { for (int i = 0;i < arr.size() - 1; ++i) {//交换size - 1次 for (int j = 0;j < arr.size...原创 2020-02-10 19:38:41 · 535 阅读 · 0 评论 -
十大排序算法 导图总结
以下为我们经常用到的十大典型排序算法导图,很多设计以及优化的思想值得去参考学习因为代码较多,所以都添加到对应的实现注释中了,相关代码可以从Mind-mapping获取xmind源文件参考文档:基数排序堆排序希尔排序https://blog.youkuaiyun.com/real_lisa/article/details/82685407...原创 2020-01-11 21:22:58 · 292 阅读 · 0 评论 -
搜索:广搜 词语阶梯
问题描述以及解决过程如下导图广搜实现如下#include <iostream>#include <algorithm>#include <vector>#include <string>#include <queue>#include <set>#include <map>using nam...原创 2019-12-01 19:47:07 · 218 阅读 · 0 评论 -
搜索:深搜/广搜 获取岛屿数量
题目描述:用一个二维数组代表一张地图,这张地图由字符“0”与字符“1”组 成,其中“0”字符代表水域,“1”字符代表小岛土地,小岛“1”被 水“0”所包围,当小岛土地“1”在水平和垂直方向相连接时,认 为是同一块土地。求这张地图中小岛的数量解决导图如下:代码如下:#include <iostream>#include <algorithm>#include &...原创 2019-12-01 18:13:13 · 414 阅读 · 0 评论 -
哈希表的分类,创建,查找 以及相关问题解决
总体的hash学习导图如下:文章目录定义分类字符hash排序hash链式hash(解决hash冲突)创建链式hash查找指定数值STL map(hash)哈希分类 完整测试代码应用(常见题目)1. 回文字符串(Longest Palindrome)2. 词语模式(Word Pattern)3. 同字符词语分组(Group Anagrams)定义需要拥有关键字 key维护一个key和va...原创 2019-11-24 17:15:24 · 569 阅读 · 0 评论 -
二分法:查找区间search for a range
问题描述:给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端点],如果target在nums里未出现,则返回[-1, -1]。例如:arr = [2,3,4,4,4],target = 4,最终结果为[2,4]arr = [2,3,4,5,6],target = 4,最终结果为...原创 2019-11-14 21:46:57 · 915 阅读 · 0 评论 -
二分法:search insert position 插入位置
问题描述:给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里 出现,则返回target所在下标,如果target在nums里未出现,则返回target应该 插入位置的数组下标,使得将target插入数组nums后,数组仍有序。例如:数组 arr = [2,3,4,6]target = 1时, 插入位置应为 index = 0target = 5时,...原创 2019-11-14 21:23:47 · 281 阅读 · 0 评论 -
二分法:二分查找(递归+非递归)实现
二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较:如果两者相等,则查找成功;否则利用中间位置将表分成前、后两个子表:1)如果中间位置的关键字大于查找关键字,则进一步查找前一子表2)否则进一步查找后一子表 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。例如:target = 200arr = [-1...原创 2019-11-13 21:39:57 · 517 阅读 · 0 评论 -
递归/归并:count of smaller numbers求逆序数
已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数。例如:nums = [5, 2, 6, 1], count = [2, 1, 1, 0];nums = [6, 6, 6, 1, 1, 1], count = [3, 3, 3, 0, 0, 0];nums = [5, -7, 9, 1, 3, 5, -2, 1], count...原创 2019-11-10 21:16:54 · 250 阅读 · 0 评论 -
递归/分治:归并排序
前言分治算法:将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出 子问题的解后进行合并,就可得到原问题的解。步骤如下:分解,将要解决的问题划分成若 干规模较小的同类问题;求解,当子问题划分得足够小时 ,用较简单的方法解决;合并,按原问题的要求,将子问题 的解逐层合并构成原问题的解。归并排序在描述归并排序之前,我们先来看看如何合并两个有序数...原创 2019-11-10 20:51:34 · 236 阅读 · 0 评论 -
递归/回溯:八皇后问题N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题。将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放方式具体是怎样的?8皇后即 8*8的棋盘中,将8个皇后放置在棋盘上,且皇后之间无法俩俩攻击到对方。关于国际象棋中皇后的实力:国际象棋棋局中实力最强的一种棋子,也是最容易被吃掉的棋子。后可横直斜走,...原创 2019-11-10 16:25:29 · 431 阅读 · 0 评论 -
递归/回溯:Generate Parentheses生成合法括号
已知n组括号,开发一个程序,生成这n组括号所有的合法的组合可能。 例如:n = 3结果为: ["((()))", “(()())”, “(())()”, “()(())”, “()()()”]首先思考如何生成所有的括号组合的可能性,即例如2组括号,总共4个符号组合的可能型,那么每个位置就有两种括号的可能性,要么左括号,要么右括号,此时可以写出如代码:void generate(string ...原创 2019-11-10 13:34:57 · 250 阅读 · 0 评论 -
递归/回溯:Combination Sum II数组之和
问题如下:已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子 集中的各个元素和为整数target的子集,结果中无重复的子集。例如: nums[] = [10, 1, 2, 7, 6, 1, 5], target = 8结果为: [[1, 7], [1, 2, 5], [2, 6], [1, 1, 6]]同样之前有类似的相关的问题递归/回溯:Subsets II求子集(有重复元素...原创 2019-11-10 12:04:44 · 286 阅读 · 0 评论 -
递归/回溯:Subsets II求子集(有重复元素)
上一篇描述了针对数组中没有重复元素进行子集的求取过程递归/回溯:subsets求子集但是当出现如下数组时:例如: nums[] = [2, 1, 2, 2]结果为: [[], [1], [1,2], [1,2,2], [1,2,2,2], [2], [2,2], [2,2,2]]注意: [2,1,2]与[1,2,2]是重复的集合,则不满足集合的要求。思考:同样的递归回溯方式,即每一个元...原创 2019-11-10 11:42:01 · 486 阅读 · 0 评论 -
递归/回溯:subsets求子集
前言回溯法又称为试探法,但当探索到某一步时,发现原先选择达不到 目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。已知一组数(其中无重复元素),求这组数可以组成的所有子集。 结果中不可有无重复的子集。例如: nums[] = [1, 2, 3]结果为: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]以上的初始数组...原创 2019-11-10 11:28:59 · 600 阅读 · 0 评论 -
贪心:expedition 最优加油方法
int cmp(pair<int,int> a,pair<int,int> b) { return a.first > b.first;}int get_least_expedition(int L, int P,vector<pair<int,int>> &stop) { priority_queue<in...原创 2019-11-08 09:21:40 · 368 阅读 · 0 评论 -
贪心:Burst Balloons 最少次数完成射击气球
已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓箭手,将全部气球打爆?例如: 四个气球 : [[10,16], [2,8], [1,6], [7,12]],至少需要2个弓箭手。如下过程在射击的过程中想要安排最少的弓箭手保证能够完成所有气球的...原创 2019-11-08 09:05:19 · 450 阅读 · 0 评论 -
贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数以及跳跃过程的路径(以数组下标标识)例如:nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4; 最少跳跃次数为2,跳跃路径为[0...原创 2019-11-06 13:30:15 · 901 阅读 · 0 评论 -
贪心:Jump Game 跳跃游戏
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数例如:nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4;nums = [3, 2, 1, 0, 4] ,不可以从nums[0...原创 2019-11-06 00:22:50 · 482 阅读 · 0 评论 -
贪心:remove K digits移除K个数字
问题描述:已知一个使用字符串表示的非负整数num,将num中的k个数字移 除,求移除k个数字后,可以获得的最小的可能的新数字。例如:num = “1432219” , k = 3在去掉3个数字后得到的很多很多可能里,如1432、4322、2219、1219、1229…; 去掉数字4、3、2得到的1219最小!贪心规律:根据以上举例,移除三个数的过程中每一次我们移除一个数的时候,想...原创 2019-11-05 23:25:11 · 351 阅读 · 0 评论