![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
jeff-y
所有文章用于个人记录,仅供参考,有错误的地方还请指出错误。
展开
-
获取不连续数字中缺的数字
背景最近项目需求需要做一个档案管理系统,其中一个功能就是判断凭证是否断号。且将断号的号码找出来。需求分析凭证的短号规则,也就是这个凭证是通过怎么一个规则来判断短号的。最后和产品了解每个公司都有自己的规则。不一定是纯数字,也有可能标记有横杠特殊字符等。砍需求,由于我们在年底进行开发的版本是POC版本,并且时间非常的紧急(以至于我们每天都要搞到11点)。所以说不用很复杂的业务需求,所以最后讨论下来先做为写死的纯数字校验。所以有了今天这篇文章。CODOING其实有很多同学看到这个一串数字断号校原创 2021-01-30 22:56:35 · 491 阅读 · 0 评论 -
如何使用MySQL关系型数据库存储树结构
背景需求存储一个组织结构或者档案仓库,看到这个需求我们的第一个反应肯定就是树状结构,并且是一个多层多节点无限级树状机构。我们目前使用的是mysql关系型数据库。那我们应该如何来实现这个结构关系呢?有3种存储的方式:到目前为止我在实战中曾使用过三种方式来实现这种hierarchical-data:Adjacency list (邻接表)Closure table (闭包表)Path enumeration (路径枚举)基于个人需要这里主要了解闭包表。Closure table原创 2020-12-13 18:37:27 · 837 阅读 · 0 评论 -
细品数据结构之BitMap
背景有10G的数据,查找其中是否有包含某个数据。但是内存只有2G。如何在10G数据中查看这条数据是否存在。也许有同学立马会想到bloom filter,是的布隆过滤器是由位图思想演化来的一个更高级的数据结构。这篇文章主要还是讲一下位图的的原理和思想。BitMap(位图)简介用一个bit来表示某个值,也就是通过存储位置来代表这个数据。位图没有存储具体的值,而只是存储了这个值在应用中的数据指纹(可以指数组下标,也可以指的是hash后的值所映射的数组下标)。位图是不可以重复的,且是有序的(具体还是根据原创 2020-10-09 21:39:17 · 347 阅读 · 0 评论 -
稀疏索引和稠密索引你了解吗?
背景最近参加了一个面试,面试官先问了mysql的数据库的索引的底层数据接口,我回答了:平时都用的是innodb引擎,所以其底层的索引数据类型是B+树。面试官问我用没用过稀疏索引。当时就懵了,聚集索引,非聚集索引,主键索引,覆盖索引等等,我也没听过什么是稀疏索引。我反问了一下 面试官这个索引类型是mysql新出的吗,我不太了解也没有怎么用过,面试官模糊的给我回答了一下:一个占用空间小查询效率相对低,一个查询效率高,存储空间比较大,用法是在创建索引的时候进行设置参数。我坦白道:不清楚,下去了解一下。稠密索引原创 2020-10-02 19:10:04 · 1066 阅读 · 1 评论 -
细品服务并发限流+Redis-cell的使用
背景今天热搜“海底捞的排号系统挂掉了”,也许是今天情人节,各位情侣去海底捞约会,进入排号系统的流量猛增,导致服务支撑不住,直接挂掉,在这里只是猜测(大胆猜测,小心求证)。那我们应该如何防止因为流量突然猛增而导致服务挂掉的问题呢?那就是限流了。那我们通过redis 来设计限流策略。服务限流简介通过压测我们可以压出我们服务接口可以承受最大的QPS或者TPS,但是我们压测的话只是单压并不知道在生产环境所能承受的最大流量。如果说其他业务接口也在跑,那这就很难把控这个接口在生产环境可以定多大的QPS或TP原创 2020-08-30 18:59:24 · 2266 阅读 · 1 评论 -
布隆过滤器与缓存击穿
背景公司用户中心,有大量的用户请求,为防止缓存击穿,需要设计一个缓存策略 ,将恶意请求过滤掉。什么是缓存击穿得搞清楚。就是有人恶意传入本来数据库就不存在的用户ID,然后大量请求数据库导致数据库挂掉(这里的缓存使用redis)需求设计redis没有拦住,那肯定是没有拦住的呀。因为redis中没有这个数据,一般策略就是去数据库中读,如果读到了就返回且更新到缓存中(且设置一个过期时间),没有读到就进行回填空值到reids中防止同一个数据库中不存在userId多次请求。但是这里的userId是不同的且不原创 2020-08-20 21:47:27 · 2541 阅读 · 8 评论 -
细品Reids的HyperLogLog数据结构
背景实现一个统计页面的UV数据,每个网页的用户访问量(同一个用户多次请求只算一次)。那这个功能我们怎么去实现呢?也许有同学就会说了,我们都用的是growingIO,不用自己实现成本太高,直接用别人的。这样也挺好。今天我们来看一下我们自己如何实现这个需求并且可以抗击较高的TPS服务呢?设计方案既然是页面用户量的统计是不重复的那我们选择一个数据结构那就是SET集合进行存储。将用户的ID进行存储,如果是没有登录的用户随机生成一个(使用时间戳等),存入set。为了快那就基于内存来搞?但是不可能用自身服务原创 2020-08-18 23:51:15 · 268 阅读 · 0 评论 -
redis高性能数据结构之有序集
背景已经讲了两个数据结构了,今天我们来讲一下在redis中最具有特色的数据结构zset(有序列表)ZSET简介zset有序列表,显而易见意思就是一个有序且是不重复上的数据结构,它类似于Java中的sortset和hashmap的结合体,但是在redis中是通过两种底层数据结构实现的。一种是ziplist压缩列表,另一种就是redis中最经典的数据结构skipList跳跃表。底层数据结构的选择第一次插入数据结构的选择在使用ZDD 命令添加第一个元素到空key时,程序通过检查输入的第一个元素来决原创 2020-08-16 19:05:42 · 1031 阅读 · 0 评论 -
细品Redis高性能数据结构之hash对象
背景上一节讲Redis的高性能字符串结构SDS,今天我们来看一下redis的hash对象。Hash对象简介redis的hash对象有两种编码(底层实现)方式,字典编码和压缩列表编码。在使用字典编码的时候程序就是将hash表的key存为字典的键,hash的value作为字典的值,字典的键值都是用的是字符串类型。在哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节和哈希对象保存的键值对数量小于 512 个使用的是ziplist,不能满足这个的使用的是hashtable(字典编码)深度原创 2020-08-12 01:37:51 · 1456 阅读 · 0 评论 -
【LeetCode】把字符串 s 中的每个空格替换成““%20””day02
题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1:输入:s = "We are happy."输出:"We%20are%20happy."解答过程当我看到这道题的第一个思路是:将这个String按空格Split开。然后重新拼接的时候加上需要替换的字符串。(我也不知道这是什么脑回路);最后还是一道错题。/** * 第一次的解答。 * 为多个孔空字符串就会出现err * * @param s * @原创 2020-06-16 00:04:23 · 522 阅读 · 0 评论 -
数据结构与算法之哈希表
看到数据库里的索引数据模型哈希表,所以这个是将原来云笔记总结同步上来一. 什么是哈希表?哈希表也叫散列表。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值k...原创 2019-08-09 00:53:31 · 203 阅读 · 0 评论 -
B+树
一、为什么要有B树?学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢? 这个要从几个方面来说了:(1)计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。(2)所以当你用红黑树的时候,你一次只能得到一个键值的信息,而用B树,可以得到最多M-1个键值的信息。这样来说B树当然更好了。(3)另外一方面,同样的数据,红黑...原创 2019-08-14 10:08:08 · 332 阅读 · 0 评论 -
hashMap源码分析即hashTable和 hashMAp的区别
1. hashmap概述数据结构来看它是由数组和单向链表组成(jdk1.8之前) 继承Map接口实现,hashmap是以键值对的形式存在,并且key值可以为null,还有就是key只不能重复,每次重复都会将原来的value值覆盖2. hashmap继承hashMap主要是继承Map接口源码如下: public class HashMap<K,V>extends Abstr...原创 2019-08-12 09:12:51 · 130 阅读 · 0 评论 -
数据结构之数组
数组 :线性结构线性结构也就是一列数据,相互串联起来,除了此处说的数组外还有队列,栈,链表,而非线性结构的数据那就是二叉树还有就是图结构连续的存储空间,相同类型的数据数组的连续的存储空间让数组有了我们常说的特性,随机访问。 它可以根据其数组下标来直接访问其数据所在位置对应的值,不得不想想他是怎么直接去访问的呢? 于是我们就想想底层,当我们创建一个数组对象的时候,则计算机则会给他分配一个...原创 2019-08-30 23:57:57 · 124 阅读 · 0 评论 -
数据结构之链表
在写这篇文章的时候我想到的第一个词就是,什么是链表? (不只这篇文章,好想其他的都是)内存中是以不连续的存储方式存在的为什么要这样存储呢? 想想之前的数组是以连续的存储空间存储的然后造就了自己可以直接找出存储的位置,那么这种随意存储的怎么寻找自己的位置呢 ? 既然是随意存储那么肯定不会有规律可循那肯定不会一下子被找得到, 那么就只能用最笨的办法了那就只能通过遍历去查找了,在遍历过程中做然是分...原创 2019-09-01 01:07:19 · 221 阅读 · 0 评论 -
Vector、ArrayList、LinkedList有何区别?
Vector、ArrayList、LinkedList均为线型的数据结构,但是从实现方式与应用场景中又存在差别。1 底层实现方式ArrayList内部用动态数组来实现;LinkedList内部采用双向链表实现;Vector内部用是 Java 早期提供的线程安全的动态数组实现。2 读写机制ArrayList在执行插入元素是超过当前数组预定义的最大值时,数组需要扩容,扩容过程需要调用底层Sys...原创 2019-10-05 14:30:10 · 176 阅读 · 0 评论 -
红黑树
https://www.jianshu.com/p/e136ec79235c本文将通过图文的方式讲解红黑树的知识点,并且不会涉及到任何代码,相信我,在懂得红黑树实现原理前,看代码会一头雾水的,当原理懂了,代码也就按部就班写而已,没任何难度。阅读本文你需具备知识点:二叉查找树:根部节点开始,左子节点小于父结点。右子节点大于父结点,完美平衡二叉树事不宜迟,让我们进入正题吧。正文红黑树...转载 2019-10-07 00:10:45 · 134 阅读 · 0 评论 -
简单二分法查找(binary search)
有一个面试题是对一个1000万的数字进行快速查找,并且使用内存不能查过100M答: 现在有1000个数字 每个数子大小为8Kb(为long基本类型) 那么现在占据用的内存 为800M 我们进行算法设计 ,将这个数据进行有序排列,组成为一个数组, 进而进行 折中查找,每一次在查找的时候取中间位置的数据,如下图(图片来源极客时间):// 二分查找的递归实现public int bsearc...原创 2019-10-08 09:50:42 · 488 阅读 · 0 评论 -
数据结构与算法之二叉搜索树
由于今天在看数据库的索引的时候看到了数据库索引模型中的其中之一的二叉搜索树模型,学习记录一下二叉搜索树:什么是二叉搜索树,首先它是一个二叉树在二叉树数据结构加了一个算法于是就变为了二叉搜索树,那么这个算法是什么呢? 那就是在二叉树的进行排序的时候他的父节点大于他的左儿子小于他的右儿子的方式进行构建这个二叉树还有就是有自己的查找算法删除算法更新算法。二叉树的查找操作:首先和根结点比较等值就返...原创 2019-09-01 23:31:32 · 201 阅读 · 0 评论