随笔分类 - 数据结构与算法
摘要:最近研究一个算法表示很有收获,加深了对二分法的运用,记录如下: 原题 解法一 点击查看代码 //丑陋的实现,但时间复杂度 O((m+n)/2);空间复杂度O(1) private static double getAns1(int[] nums1, int[] nums2) { int length
阅读全文
摘要:主从 单线程高并发 epoll 丰富类型(string,hashtable,list,set,sortdeset) 计算向数据移动:与memcached相比,支持类型,意味着可在服务器端根据类型做各种计算操作 bitmap操作 统计用户一年内任意区间登录天数: 用key存储用户id,46字节(368
阅读全文
摘要:session 服务器为客户端的一次请求开辟的一段内存空间,存储Session对象,内部结构为ConcurrentHashMap 弥补HTTP的无状态特性 判断同一会话: 第一次请求生成SessionId,通过HTTP响应头 SetCookie: JSESSIONID=xxx 指令要求客户端设置Co
阅读全文
摘要:HashMap 内部结构:数组、链表、红黑树 链树互转条件:长度超8转链转树,小6树转链 初始化数组大小默认16,负载因子0.75 扩容:原大小 2 hash函数 原理:key的hashcode高低16位异或 作用: 1. 保留数据高低位特征,增加随机性,降低散列冲突 2. 降低索引范围,方便与le
阅读全文
摘要:实现一个短网址系统 短网址服务 把一个长的网址转化成一个短的网址,访问这个短网址,就相当于访问原始的网址 原始网址:https://github.com/wangzheng0822/ratelimiter4j 短网址:http://t.cn/EtR9QEG 上面第二个网址是通过新浪提供的短网址服务生
阅读全文
摘要:微服务鉴权限流剖析 微服务 把复杂的大应用,解耦拆分成几个小的应用。 有利于团队组织架构的拆分,毕竟团队越大协作的难度越大; 每个应用都可以独立运维,独立扩容,独立上线,各个应用之间互不影响。 有利就有弊: 大应用拆分成微服务之后,服务之间的调用关系变得更复杂,平台的整体复杂熵升高,出错的概率、de
阅读全文
摘要:Disruptor 消息队列 定义 内存消息队列 用于线程之间的消息传递 应用于Apache Storm、Camel、Log4j 2 等知名应用 基于循环队列的“生产者 - 消费者模型” 实现一个最简单的“生产者 - 消费者模型” 对于生产者和消费者之间操作的同步,并没有用到线程相关的操作。 当队列
阅读全文
摘要:实现一个小型搜索引擎 麻雀虽小,五脏俱全,跟大型搜索引擎相比,实现一个小型搜索引擎所用到的理论基础是相通的。 四个部分:搜集、分析、索引、查询 概述流程 搜集 爬虫爬取网页数据 分析 抽取网页文本信息 分词并创建临时索引 索引 将临时索引构建为倒排索引:关键词被哪些网页包含 查询 先对关键词做分词处
阅读全文
摘要:Redis常用数据类型对应的数据结构 Redis数据库 Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),也被叫作非关系型数据库。 常用的数据类型: 字符串、列表、字典、集合、有序集合。 列表(list) 支持存储一组数据。两种实现方法: 压缩列表(zipl
阅读全文
摘要:哈希算法 定义 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。 而通过原始数据映射之后得到的二进制值串就是哈希值。 特点 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法); 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同
阅读全文
摘要:红黑树 平衡二叉树 定义:二叉树中任意一个节点的左右子树的高度相差不能大于 1。 完全二叉树、满二叉树其实都是平衡二叉树,非完全二叉树也有可能是平衡二叉树。 平衡二叉查找树 任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。 符合二叉查找树的特点:左子节点小于父节点,右子节点大于父节
阅读全文
摘要:AC自动机 一样的不太好理解,有时间再啃 敏感词过滤 单模式字符串匹配算法:(BF,RK,BM,KMP)每次取敏感词字典中一个敏感语做为模式串在用户输入的主串中进行匹配,效率较低 多模式字符串匹配算法:(Trie树,AC自动机) Trie树:把用户输入的内容作为主串,从第一个字符(假设是字符 C)开
阅读全文
摘要:KMP算法 比较难理解,准备有时间专门啃一下。 核心思想与BM算法一样:假设主串是 a,模式串是 b。在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后多滑动几位,跳过那些肯定不会匹配的情况。 不同的是:在模式串和主串匹配的过程中,把不能匹配的那个字符仍然
阅读全文
摘要:字符串匹配BM算法 回顾BF和RK算法 BF:拿模式串与主串中是所有子串匹配,看是否有能匹配的子串。时间复杂度也比较高,是 O(n*m),n、m 表示主串和模式串的长度 RK:借助哈希算法对 BF 算法进行改造,即对每个子串分别求哈希值,然后拿子串的哈希值与模式串的哈希值比较,减少了比较的时间,时间
阅读全文
摘要:位图 问题 问题1:如何实现网页爬虫中url去重功能? 分析 传统数据结构散列表、红黑树、跳表这些动态数据结构,都能支持快速地插入、查找数据。 但通常爬虫爬取的网页数量级都比较大,假设为10亿个网页,估算一下散列表存储所需的内存: 为了判重,我们把这 10 亿网页链接存储在散列表中。 假设一个 UR
阅读全文
摘要:B+树 争哥的课程都会我们解决问题的思路和过程比结果更重要 此节就以这样的思路来分析MYSQL的索引底层数据结构B+树是如何一步一步演化的 解决问题的前提是定义清楚问题 对一些模糊的需求进行假设,来限定要解决的问题的范围: 分析mysql数据库的需求 功能性需求 假定只有以下两个需求: 根据某个值查
阅读全文
摘要:A*算法 问题 实现游戏地图中自动寻路功能 分析 可使用Dijkstra算法计算最短路径,让游戏角色按路径行走; 但Dijkstra算法是BFS的思想,会有盲目计算,效率低; 寻路不用非得走最短路径,可走次短即可 鉴于平衡效率与效果,使用优化版Dijkstra算法:A*算法 A*算法 优化版Dijk
阅读全文
摘要:最短路径算法(Shortest Path Algorithm) 地图寻路最优路径 距离最短 红灯最少 速度最快 建模 使用有向有权图(graph)表示:岔口为顶点,岔口相连为边,单行线建立单向边,双行线建立双向边,岔口之间的距离为边的权重。 public class Graph { // 有向有权图
阅读全文
摘要:拓扑排序 问题 一个完整的项目往往会包含很多代码源文件。编译器在编译整个项目的时候,需要按照依赖关系,依次编译每个源文件。比如,A.cpp 依赖 B.cpp,那在编译的时候,编译器需要先编译 B.cpp,才能编译 A.cpp。 解析 解决思路与“图”这种数据结构的一个经典算法“拓扑排序算法”有关 拓
阅读全文
摘要:跳表 基于链表 提取节点,建立多级索引 跳表会否浪费内存 实际的软件开发中,原始链表中存储的有可能是很大的对象,而索引结点只需要存储关键值和几个指针,并不需要存储对象,所以当对象比索引结点大很多时,那索引占用的额外空间就可以忽略了。 高效的动态插入和删除 跳表支持查找,及高效的动态的插入、删除操作,
阅读全文
浙公网安备 33010602011771号