数据结构及算法
呼延十
呼延
展开
-
Redis系列(八)底层数据结构之紧凑列表
前言定义总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中底层的 listpack(紧凑列表) 的实现方法。 它是 Redis 的 Stream 用到的数据结构之一...原创 2020-01-20 08:59:06 · 301 阅读 · 0 评论 -
Redis系列(七)底层数据结构之跳跃表
前言定义层级问题顺序问题排名问题总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中底层的 skiplist(跳跃表) 的实现方法。 它是 Redis 中有序集...原创 2020-01-19 09:09:14 · 390 阅读 · 0 评论 -
Redis系列(六)底层数据结构之字典
前言定义字典哈希表哈希算法哈希冲突扩容与缩容渐进式 hash原理小应用思考问题:为什么缩容不用考虑 bgsave?总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来...原创 2020-01-17 08:55:20 · 509 阅读 · 0 评论 -
Redis系列(五)底层数据结构之整数集合
前言定义整数集合的升级整数集合分级的好处不支持降级总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中底层的 intset(整数集合) 的实现方法。 它是...原创 2020-01-16 09:21:21 · 168 阅读 · 1 评论 -
Redis系列(四)底层数据结构之快速列表
前言定义优劣ziplist 切割大小压缩深度总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中底层的 quicklist(快速列表) 的实现方法。 它是 Re...原创 2020-01-15 09:35:04 · 424 阅读 · 0 评论 -
Redis系列(三)底层数据结构之压缩列表
前言定义压缩列表的定义压缩列表节点的定义新增节点问题:级联更新总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中底层的 ziplist(压缩列表) 的...原创 2020-01-14 10:47:57 · 258 阅读 · 0 评论 -
Redis系列(二)底层数据结构之双端链表
前言定义优劣双向链表无环链表带有头指针和尾指针带有长度计数器总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中最基础的 linkedlist(双端链...原创 2020-01-13 08:58:54 · 421 阅读 · 0 评论 -
Redis系列(一)底层数据结构之简单动态字
前言定义优劣高性能获取字符串长度杜绝缓冲区溢出减少修改字符串产生的内存分配次数,提高修改字符串性能二进制安全兼容部分 C 语言的库函数总结SDS 限制为512M问题参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将...原创 2020-01-07 11:06:45 · 401 阅读 · 0 评论 -
后缀数组(Suffix Array)在字符串匹配中的应用
前言首先抛出一个问题: 给定300w字符串A, 之后给定80w字符串B, 需要求出 B中的每一个字符串, 是否是A中某一个字符串的子串. 也就是拿到80w个bool值.当然, 直观的看上去, 有一个暴力的解法, 那就是 双重循环, 再调用字符串德contains方法, 想法很美好, 现实很残酷. 如果你真的这么实现了(是的, 我做了.), 就会发现,效率低到无法接受.具体的效率测评在后文给出...原创 2020-01-01 21:27:19 · 916 阅读 · 0 评论 -
Trie树的基本原理及应用
前言理论知识[什么是 Trie 树](#什么是 trie 树)[Trie 的优劣势](#trie 的优劣势)[Trie 的应用场景](#trie 的应用场景)编码实现参考文章联系我前言在做用户 query 理解的过程中,有许多需要使用词典来"识别"的过程。在此期间,就避免不了使用 Trie 树这一数据结构。因此今天我们来深入的学习一下 Trie 树相关的理论知识,并且...原创 2019-12-17 21:54:36 · 771 阅读 · 0 评论 -
二分法查找及有重复值的二分法
前言最近也在进行一些面试嘛,也见识到了很多各种各样的题目,其中就有一些和二分查找相关的.二分查找,在有序的数组中快速找到目标值.这个算法在上学的时候学过,之后就没有看过了,因为比较"简单"嘛~.然而在面试过程中,我在二分查找及类似题目上栽了三次…所以今天做一个总结.注意:下文的代码中没有进行参数校验,实际使用时需要进行参数校验普通写一个二分查找class Solution: ...原创 2019-03-18 00:15:36 · 7718 阅读 · 4 评论 -
[随缘一题]实现交易计算盈利
来源:根据先进先出原则实现交易.例如:buy 100 share(s) at $20 eachbuy 20 share(s) at $24 eachbuy 200 share(s) at $36 eachsell 150 share(s) at $30 each得出计算结果 940.优先卖掉持有时间最长的.解题思路直接使用Arraylist保存,卖出时从第一个开始即可.当然...原创 2019-02-24 16:52:54 · 173 阅读 · 0 评论 -
[随缘一题]后缀表达式(逆波兰表达式)转换
来源:维基百科-后缀表达式目标将中缀表达式转换为后缀表达式,比如((5+2) * (8-3))/4 转换为5 2 + 8 3 - * 4 /.解题思路将表达式的字符逐一处理,如果是数字(变量)则直接输出,如果是字符入栈,并按以下规则进行处理.+/-: 低优先级,所以将栈中的所有运算符出栈,之后将自己入栈.*or/:高优先级,将栈中的其他乘除运算符出栈,之后将自己入栈.(: 左括号则...原创 2019-02-24 16:50:20 · 339 阅读 · 0 评论 -
[随缘一题]回溯法解决N皇后问题
来源:维基百科-N皇后问题解题思路采用回溯法,即逐一位置放置,然后放置下一行,如果下一行没有合法位置,则回溯到上一行,调整位置,直到得到所有值.实现代码/** * solve the N-Queen problem */public class NQueen { //the number of chess board,example 8 private static fi...原创 2019-02-24 16:46:22 · 239 阅读 · 0 评论 -
TOP-K问题
前言TOP-K问题是面试中的常见题型,具体表现为:海量数据求最大(最小)的K个值.比如:给定1亿个乱序的整数,求其中最大的1000个今天一步一步来分析这种题目的解决办法,以及用到的算法思想.依赖此文中会依赖到快速排序,堆排序等排序算法,以及数据结构堆.如果你对上述两者的原理有所了解,可以继续往下看.如果不了解,可以点击链接先看一下基础~.好,进入正题.(以给定1亿个乱序的整数...原创 2019-01-16 23:25:49 · 3519 阅读 · 1 评论 -
数据结构-堆
介绍堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。定义堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称...原创 2019-01-16 01:49:44 · 222 阅读 · 0 评论 -
面试常用排序算法总结
layout: postcategory: [算法,排序,面试]tags:算法面试排序前言面试的死亡高发区是什么?手写快排.其他的排序算法也经常会问到,虽然在工作中,我们很少有需要自己手写排序算法的机会,但是这种入门级的算法却是证明我们能力的一种简单方法.因此要熟悉掌握.这篇文章,详细记录常用的一些排序算法,留以备忘.本文所有代码可在github上下载查看.传送门为了...原创 2019-01-14 15:49:06 · 468 阅读 · 0 评论 -
[随缘一题]-实现栈
来源:lintcode-495.实现栈描述实现一个栈,可以使用除了栈之外的数据结构解题思路这个题真的是…皮.用ArrayList试试.import java.util.ArrayList;/** * created by huyanshi on 2019/1/17 */public class Stack { private ArrayList<Integer&...原创 2019-01-18 00:10:28 · 206 阅读 · 0 评论 -
[随缘一题]-LintCode-用栈实现队列
来源lintcode-用栈实现队列描述正如标题所述,你需要使用两个栈来实现队列的一些操作。队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。pop和top方法都应该返回第一个元素的值。样例比如push(1), pop(), push(2), push(3), top(), pop(),你应该返回1,2和2挑战仅使用...原创 2019-01-03 00:06:02 · 389 阅读 · 0 评论 -
[随缘一题]-LintCode-平面列表
来源来源:lintcode-平面列表描述给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。样例给定 [1,2,[1,2]],返回 [1,2,1,2]。给定 [4,[3,[2,[1]]]],返回 [4,3,2,1]。挑战请用非递归方法尝试解答这道题。解题思路这道题一看就是用递归解决啦~,好,那我们就用递归.啥玩意你不让用???那...原创 2018-12-26 10:59:43 · 776 阅读 · 0 评论 -
[每日一题]-LintCode-投资结果
来源:lintcode-投资结果描述给定一个列表funds表示投资人每次的投资额。现在有三个公司A, B, C,它们的初始资金分别为a,b,c。投资人每次投资时会对当前资金最少的公司进行投资(当有多个公司资金相同时,投资人会对编号最小的公司进行投资)。返回A, B, C三家公司最后的资金。样例给定funds=[1,2,1,3,1,1],a=1,b=2,c=1, 返回[4,5,4]第...原创 2018-11-28 23:29:52 · 1056 阅读 · 0 评论 -
[每日一题]-LintCode-链表翻转题解
来源:lintcode-翻转链表描述翻转一个链表样例给出一个链表1-&amp;amp;gt;2-&amp;amp;gt;3-&amp;amp;gt;null,这个翻转后的链表为3-&amp;amp;gt;2-&amp;amp;gt;1-&amp;amp;gt;null挑战在原地一次翻转完成翻转链表是一个很基础的题,同时也是面试中开场常问的题,那么他的难点在哪呢?解题思路我们都知道单链表的数据结原创 2018-11-27 20:41:54 · 1148 阅读 · 0 评论 -
[每日一题]-LintCode-最少划分子串题解
来源:lintcode-最少划分子串描述给定一个包含n个小写字母的字符串s,要求将字符串划分成若干个连续子串,子串中的字母类型相同,同时子串的字母个数不超过k,输出最少划分的子串数量。样例给定 s = “aabbbc”, k = 2, 返回4 解释: 划分成 &quot;aa&quot;, &quot;bb&quot;, &quot;b&quot;, &quot;c&原创 2018-11-28 00:05:13 · 1414 阅读 · 0 评论 -
[每日一题]-LintCode-机器人能否返回原点
来源:lintcode-机器人能否返回原点描述最初,机器人位于(0, 0)处。 给定一系列动作,判断该机器人的移动轨迹是否是一个环,这意味着它最终会回到原来的位置。移动的顺序由字符串表示。 每个动作都由一个字符表示。 有效的机器人移动是R(右),L(左),U(上)和D(下)。 输出应该为true或false,表示机器人是否回到原点。样例样例1:输入: "UD"输出: true样...原创 2018-12-05 20:18:51 · 1264 阅读 · 0 评论 -
[每日一题]-LintCode-寻找树中最左下节点的值
来源lintcode-寻找树中最左下节点的值描述给定一棵二叉树,找到这棵树最中最后一行中最左边的值。样例输入:[2,1,3]输出:1输人:[1,2,3,4,5,6,#,#,7]输出:7解题思路首先这道题一看就是层次遍历,这里帮大家回顾下二叉树的层次遍历.二叉树介绍及其前中后遍历实现.然后这里要求得最左边的值,那么怎么才能知道当前拿到的节点是不是最后一个节点呢?再想一下,...原创 2018-12-20 00:31:00 · 1353 阅读 · 0 评论 -
[每日一题]-LintCode-最常公共前缀
来源:lintcode-最常公共前缀描述给k个字符串,求出他们的最长公共前缀(LCP)样例在 "ABCD" "ABEF" 和 "ACEF" 中, LCP 为 "A"在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为原创 2018-12-09 17:57:01 · 1035 阅读 · 0 评论 -
[每日一题]-LintCode-回文排列
来源:lintcode-回文排列描述给定一个字符串,判断字符串是否存在一个排列是回文排列。样例给定s = "code", 返回 False.给定s = "aab", 返回 True.给定s = "carerac", 返回 True.解题思路:千万不要走到用各种数据结构的误区里面去,直接数个数就好.实现代码/** * 回文排列 */public boolean canP...原创 2018-12-10 20:56:14 · 1863 阅读 · 0 评论 -
[随缘一题]-LintCode-有效三角形
来源来源:lintcode-有效的三角形描述给出三个整数 a, b, c, 如果它们可以构成三角形,返回 true.样例给定 a = 2, b = 3, c = 4返回 true给定 a = 1, b = 2, c = 3返回 false解题思路不说了…实现代码public boolean isValidTriangle(int a, int b, int c) {...原创 2018-12-27 22:17:45 · 576 阅读 · 0 评论 -
[随缘一题]-LintCode-螺旋矩阵
PS本题代码来源于九章算法.来源lintcode-螺旋矩阵描述给出整数 n, 返回一个大小为 n * n 的螺旋矩阵样例给出 n = 3则螺旋矩阵为:[[1,2,3][8,9,4][7,6,5]]给出 n = 5则螺旋矩阵为:[ [1,2,3,4,5] [16,17,18,19,6] [15,24,25,20,7] [14,23,22,21,8] [...原创 2018-12-27 23:24:05 · 607 阅读 · 0 评论 -
[每日一题]-全排列问题Java实现
来源:经典的全排列问题描述给定一个字符串,输出他的全排列。样例给定"ABC"输出:ABCACBBCABACCABCBA解题思路:这道题是数学中的全排列问题,输出结果的个数为n!.那么怎么获得具体的所有排列呢?对于ABC来说,排列的第一位有三种可能:ABC,当第一位确定之后,第二位有两种可能,第三位只有一种可能.首先确定第一位,可能是3种,分别计算.A---...原创 2018-12-11 14:16:10 · 1488 阅读 · 0 评论 -
[每日一题]-LintCode-回文排列2
来源:lintcode-回文排列2描述给定一个字符串s,返回所有回文排列(不重复)。如果没有回文排列,则返回空列表。样例给定s = "aabb", 返回 ["abba","baab"].给定s = "abc", 返回 [].解题思路:这道题在我看来就是回文排列及全排列的组合题.首先,对每个出现的字符计数,判断当前字符传可以是回文序列吗?然后获取回文序列的左半部分(回文序列是对...原创 2018-12-11 14:27:45 · 1579 阅读 · 0 评论 -
[每日一题]-LintCode-勒索信
来源lintcode-勒索信描述给定一个任意的表示勒索信内容的字符串,和另一个字符串,表示能从杂志中获取到的所有字符,写一个方法判断能否通过剪下杂志中的字符来构造出这封勒索信,若可以,返回 true;否则返回 false。杂志字符串中的每一个字符仅能在勒索信中使用一次。你可以认为两个字符串都只包含小写字母。样例canConstruct(“a”, “b”) -> falseca...原创 2018-12-18 23:58:02 · 1012 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)的原理及在推荐去重中的应用
遇到的问题在业务中,我需要给每个用户保存1w条浏览记录,之后每一次的返回值都要和历史记录做一个去重,即保证用户不会重复看到同一篇文章.这个需求有两个比较麻烦的地方:1.空间问题每个用户1w条,10w用户就是10亿条数据,应该保存在哪里呢?Redis?哪里有那么大内存给你用.Hbase?Hbase我不太了解具体原理,据说每次全量查询有点慢啊(后来听大佬说这点数据无压力的).Mysql?...原创 2018-12-19 00:51:12 · 3487 阅读 · 1 评论 -
[随缘一题]-LintCode-雷达监测
来源lintcode-雷达监测描述一个2D平面上有一堆雷达(雷达有x, y坐标,以及能探测到的范围r半径)。现在有一辆小车要从y = 0和y = 1的区间里面通过并且不能被雷达探测到。若被检测到,输出YES,否则输出NO。(可以认为,小车是一条长度为1的线段,沿直线从x = 0 向右前进)雷达数量为n,n <= 1000。雷达的坐标x为非负整数,y为整数,r为正整数。样例给...原创 2019-01-03 23:51:20 · 460 阅读 · 0 评论 -
[随缘一题]-LintCode-删除排序链表中的重复元素
来源lintcode-删除排序链表中的重复元素描述给定一个排序链表,删除所有重复的元素每个元素只留下一个。样例给出 1->1->2->null,返回 1->2->null给出 1->1->2->3->3->null,返回 1->2->3->null解题思路简单题.如果当前节点的值和下一节点的值相等,...原创 2019-01-04 00:21:16 · 373 阅读 · 0 评论 -
[随缘一题]-LintCode-合并两个排序链表
来源:lintcode-165. 合并两个排序链表描述将两个排序链表合并为一个新的排序链表样例给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。解题思路这道题的重点在于链表是已排序的.那么其实可以比较两个链表当前节点的值,哪个值小,就把...原创 2019-01-05 17:45:11 · 744 阅读 · 2 评论 -
[随缘一题]-LintCode-合并排序数组II
来源lintcode-6.合并排序数组 II描述合并两个排序的整数数组A和B变成一个新的数组。样例给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]解题思路用两个指针指向两个数组,每次取较小的放入结果数组.在某个数组全部加入结果后,将另一个数组的值全部加入结果数组.实现代码public int[] mergeSortedArray(...原创 2019-01-05 18:24:21 · 386 阅读 · 0 评论 -
二叉树介绍及其前中后序遍历实现
本文示例代码已上传github,可直接点击查看前言前一阵子在学习HashMap的时候,知道了在java8之后的HashMap使用数组+链表+红黑树的结构来实现,看代码的时候百思不得其解。因此想要学一下”树”这个数据结构,为学习红黑树打下基础,同时,二叉树的一些相关算法也是面试过程中的常问题目,提前学习以备不时之需。本文主要写一些二叉树通用的操作,如遍历,求高度等,添加及删除节点等操作依赖于...原创 2018-11-04 21:43:16 · 1930 阅读 · 0 评论