随笔分类 - 数据结构与算法
数据结构与算法
摘要:1. DP专题 适用问题 回溯适用的问题:穷举; 动态规划:回溯+存在重复子问题; 案例1 0-1背包问题 0-1背包问题:对于一组不同重量的物品,选择其中一些物品装入背包,在不超过背包最大重量限制的前提下,背包中可装物品总重量的最大值是多少? 物品重量:{2, 2, 4, 6, 3} 背包最大承重
阅读全文
摘要:海量数据处理 存储(内存和外存)、计算资源(CPU)这是海量数据处理面对的两个问题: 1.一台机器的内存存不下; 2.一台机器处理起来太慢; 海量数据处理的核心思想:分治 1.单机: 利用外存,分批加入内存处理; (先在内存中处理一部分,放入外存,再处理下一部分...依次类推把文件处理完...) 2
阅读全文
摘要:有向有权图 图的两种搜索算法,深度优先搜索和广度优先搜索。这两种算法主要是针对无权图的搜索算法。 针对有权图,也就是图中的每条边都有一个权重,该如何计算两点之间的最短路径(经过的边的权重和最小)呢?常用的最短路径算法(Shortest Path Algorithm)。 地图软件的最优路线是如何计算出
阅读全文
摘要:动态规划 Dynamic Programming 1. “Simplifying a complicated problem by breaking it down into simpler sub-problems” (in a recursive manner) 2. Divide & Conq
阅读全文
摘要:Redis Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),Redis 也被叫作非关系型数据库。 像 MySQL 这样的关系型数据库,表的结构比较复杂,会包含很多字段,可以通过 SQL 语句,来实现非常复杂的查询需求。而 Redis 中只包含“键”和“值”
阅读全文
摘要:1. B+树 为了加速数据库中数据的查找速度,常用的处理思路是,对表中数据创建索引。数据库索引是如何实现的呢?底层使用的是什么数据结构和算法呢? 数据库查询需求: 根据某个值查找数据,比如 select * from user where id=1234; 根据区间值来查找某些数据,比如 selec
阅读全文
摘要:1. 链表和散列表的组合使用 散列表和链表,经常会被放在一起使用; 用链表来实现 LRU 缓存淘汰算法,时间复杂度是 O(n),通过散列表可以将这个时间复杂度降低到 O(1)。 跳表,Redis的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。当时我们也提到,Redis 有序集合不仅使用了
阅读全文
摘要:2011 年 CSDN 的“脱库”事件,当时,CSDN 网站被黑客攻击,超过 600 万用户的注册邮箱和密码明文被泄露,如果你是 CSDN 的一名工程师,你会如何存储用户密码这么重要的数据?仅仅 MD5 加密一下存储就够了吗? 要想搞清楚这个问题,就要先弄明白哈希算法。 哈希算法历史悠久,业界著名的
阅读全文
摘要:1. 散列碰撞攻击 散列表的查询效率并不能笼统地说成是 O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到
阅读全文
摘要:BBS等文本内容网站,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。 实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用“***”把它替代掉。
阅读全文
摘要:1. BF和 RK算法 2. BM(Boyer-Moore)算法 对于工业级的软件开发来说,我们希望算法尽可能的高效,并且在极端情况下,性能也不要退化 的太严重。那么,对于查找功能是重要功能的软件来说,比如一些文本编辑器,它们的查找功能 都是用哪种算法 来实现的呢? 有没有比 BF 算法和 RK 算
阅读全文
摘要:1. Cache缓存 ①.记忆 ②.钱包-储物柜 ③.代码模块 一个经典的链表应用场景,那就是 LRU 缓存淘汰算法。 缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。 缓存的大小有限,当缓存被用满时,哪些数据应该被
阅读全文
摘要:0. 复杂度分析 0.时间空间复杂度 1. 数据结构 1.1 数组 1.2 链表 1.3 跳表 1.4 栈、队列 1.5 散列表、映射、集合 1.6 树、二叉树、二叉搜索树 AVL树、红黑树 字典树、并查集 1.7 堆 1.8 图 2. 算法 2.1 递归 2.2 分治和回溯 2.3 DFS、BFS
阅读全文
摘要:1. 字符串概念 • Python: x = ‘abbc’ x = “abbc”• Java: String x = “abbc”; Python和Java中的string 都是不可变数据类型, immutable:https://lemire.me/blog/2017/07/07/are-your
阅读全文
摘要:1. 分治 + 回溯 + 递归 + 动态规划 它的本质即将一个复杂的问题,分解成各种子问题,寻找它的重复性。动态规划和分治、回溯、递归并没有很大的本质区别,只是小细节上的不同。 递归 代码模板 public void recur(int level, int param) { // 1.termin
阅读全文
摘要:1. Greedy 贪心算法(greedy algorithm)。贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生成树算法、还有 Dijkstra 单源最短路径算法。最小生成树算法和最短路径算法, 霍夫曼编码,看看它是如何利用贪心算法来实
阅读全文
摘要:1. 概述 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 假设有 1000 条订单数据,已经按照订单金额从小到
阅读全文
摘要:1. 堆概念 二叉堆的性能有很大的问题,现实中很大高级的堆用的是斐波拉契堆和加的堆。 https://www.cnblogs.com/skywang12345/p/3610187.html#a1 https://en.wikipedia.org/wiki/Binary_heap 堆是一种特殊的树。只
阅读全文
摘要:字典树Trie 1. 字典树的数据结构2. 字典树的核心思想3. 字典树的基本性质 1. 树Tree 按层次打印一颗二叉树, 在树中深度优先搜索:ABDH I EJ CFG 广度优先搜索:A BC DEFG HIJ 2. 二叉搜索树 二叉搜索树是子树之间的关系,并不是儿子和父亲的关系。 任何一个节点
阅读全文
摘要:位图 BitMap 存储结构,位图(BitMap)。布隆过滤器本身就是基于位图的,是对位图的一种改进。 有 1 千万个整数,整数的范 围在 1 到 1 亿之间。如何快速查找某个整数是否在这 1 千万个整数中? 当然,这个问题还是可以用散列表来解决。不过,我们可以使用一种比较“特殊”的散列表,那就是位
阅读全文