数据结构和算法 - 极客时间 王争
文章平均质量分 68
tobebetter9527
这个作者很懒,什么都没留下…
展开
-
不定期福利第二期讲王争:羁绊前行的,不是肆虐的狂风,而是内心的迷茫
never give up原创 2022-10-05 11:42:04 · 139 阅读 · 1 评论 -
不定期福利第一期讲数据结构与算法学习书单
数据结构与算法书单原创 2022-10-05 10:35:18 · 277 阅读 · 0 评论 -
54.讲算法实战(三):剖析高性能队列Disruptor背后的数据结构和算法
Disruptor是如何做到如此高性能的?其底层依赖了哪些数据结构和算法?原创 2022-10-05 10:00:17 · 567 阅读 · 0 评论 -
53.讲算法实战(二):剖析搜索引擎背后的经典数据结构和算法
搜集、分析、索引、查询。搜集,就是我们常说的利用爬虫爬取网页。分析,主要负责网页内容抽取、分词,构建临时索引,计算PageRank值这几部分工作。索引,主要负责通过分析阶段得到的临时索引,构建倒排索引。查询,主要负责响应用户的请求,根据倒排索引获取相关网页,计算网页排名,返回查询结果给用户。原创 2022-10-04 11:35:55 · 975 阅读 · 0 评论 -
52.讲算法实战(一):剖析Redis常用数据类型对应的数据结构
Redis是一种键值(Key-Value)的非关系型数据库。只能通过“键”来查询“值”,因为简单的存储结构,让Redis的读写效率非常高。Redis主要是作为内存数据库来使用,也可以将数据存储在硬盘。原创 2022-10-04 10:32:01 · 541 阅读 · 0 评论 -
51.讲并行算法:如何利用并行处理提高算法的执行效率
如何借助并行计算的处理思想对算法进行改造?原创 2022-10-03 23:26:19 · 558 阅读 · 0 评论 -
50.索引:如何在海量数据中快速查找某个数据
数据是格式化数据还是非格式化数据?要构建索引的原始数据,类型有很多。我把它分为两类,一类是结构化数据,比如,MySQL中的数据;另一类是非结构化数据,比如搜索引擎中网页。对于非结构化数据,我们一般需要做预处理,提取出查询关键词,对关键词构建索引。数据是静态数据还是动态数据?如果原始数据是一组静态数据,也就是说,不会有数据的增加、删除、更新操作,所以,我们在构建索引的时候,只需要考虑查询效率就可以了。这样,索引的构建就相对简单些。原创 2022-10-03 22:57:31 · 695 阅读 · 0 评论 -
49.搜索:如何用A*搜索算法实现游戏中的寻路功能
当人物处于游戏地图中的某个位置的时候,我们用鼠标点击另外一个相对较远的位置,人物就会自动地绕过障碍物走过去。玩过这么多游戏,不知你是否思考过,这个功能是怎么实现的呢?原创 2022-10-03 17:21:07 · 926 阅读 · 0 评论 -
48.讲B+树:MySQL数据库索引是如何实现的
如何定义清楚问题呢?除了对问题进行详细的调研,还可以对一些模糊的需求进行假设,来限定要解决的问题的范围。根据某个值查找数据,比如select * from user where id=1234;根据区间值来查找某些数据,比如select * from user where id > 1234 and id < 2345。另外这里只考虑性能问题:包括执行效率和存储空间,我们希望索引执行效率尽可能高,同时存储尽可能小。今天,我们讲解了数据库索引实现,依赖的底层数据结构,B+树。原创 2022-10-03 12:07:13 · 947 阅读 · 0 评论 -
47.向量空间:如何实现一个简单的音乐推荐系统
音乐app推荐歌曲为什么符合你的口味?原创 2022-10-03 10:33:47 · 620 阅读 · 0 评论 -
46.概率统计:如何利用朴素贝叶斯算法过滤垃圾短信
问题:实现一个简单的垃圾短信过滤功能以及骚扰电话拦截功能,该用什么样的数据结构和算法实现呢?原创 2022-10-03 10:08:05 · 874 阅读 · 1 评论 -
45.讲位图:如何实现网页爬虫中的URL去重功能
布隆过滤器非常适合这种不需要100%准确的、允许存在小概率误判的大规模判重场景。无法事先知道要判重的数据个数的情况,需要支持自动扩容的功能。数据个数与位图大小的比例超过某个阈值,重新申请一个新的位图,执行效率降低一些。原创 2022-10-01 16:11:30 · 431 阅读 · 0 评论 -
44.讲最短路径:地图软件是如何计算出最优出行路径的
问题:地图软件的最优路线是如何计算出来的吗?底层依赖了什么算法呢?把每个岔路口看作一个顶点,岔路口与岔路口之间的路看作一条边,路的长度就是边的权重。如果路是单行道,就在两个顶点之间画一条有向边;如果路是双行道,就在两个顶点之间画两条方向不同的边。这样,整个地图就被抽象成一个有向有权图。代码表达:1.2 最短路径算法Dijkstra在刚刚的代码实现中,最复杂就是while循环嵌套for循环那部分代码了。while循环最多会执行V次(V表示顶点的个数),而内部的for循环的执行次数不确定,跟每个顶点的相邻原创 2022-10-02 11:13:27 · 1153 阅读 · 0 评论 -
43.讲拓扑排序:如何确定代码源文件的编译依赖关系
拓扑排序可以用来检测图中环的存在。https。原创 2022-07-17 10:02:45 · 242 阅读 · 0 评论 -
41.讲动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题
1.状态转移表法2.状态转移方程法。原创 2022-09-30 20:07:24 · 172 阅读 · 0 评论 -
40.讲初识动态规划:如何巧妙解决“双十一”购物时的凑单问题
问题: 满200元减50元”。购物车中有n个(n>100)想买的商品,希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200元),如何解决?原创 2022-09-30 19:18:11 · 890 阅读 · 0 评论 -
39.回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
回溯算法解决,比如数独、八皇后、0-1背包、图的着色、旅行商问题、全排列等问题。原创 2022-09-30 15:51:16 · 123 阅读 · 0 评论 -
38.分治算法:谈一谈大规模计算框架MapReduce中的分治思想
例子n个数据,期望数据从小到大排列,那完全有序的数据的有序度就是n(n-1)/2,逆序度等于0;相反,倒序排列的数据的有序度就是0,逆序度是n(n-1)/2。,将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。笨方法拿一个数与其后面的数比较,简单,但时间复杂度O(n^2).与递归区别分治算法是一种处理问题的思想,递归是一种编程技巧。例子给10GB的订单排序。...原创 2022-07-18 20:29:11 · 250 阅读 · 0 评论 -
37.讲贪心算法:如何用贪心算法实现Huffman压缩编码
问题:霍夫曼编码是如何利用贪心算法来实现对数据压缩编码,有效节省数据存储空间的。例子:容纳100kg物品的背包,如何装价值最大的豆子。自然的想法:依次装单价从高到低的豆子。贪心问题解决思路:局部最优,不代表全局最优。例子:1000个字符,每个8bits,就要8000bits。如果字符只有6中不同字符,分别是a、b、c、d、e、f,可以用3个bits存储,只要3000bits存储空间。是否有更有效的存储方式:霍夫曼编码,一般压缩率20%~90%。贪心是一种思想,主要是需要更多的练习。...原创 2022-07-05 21:42:22 · 189 阅读 · 0 评论 -
36.AC自动机:如何用多模式串匹配实现敏感词过滤功能
多模式串匹配算法: 那如何才能实现一个高性能的敏感词过滤系统呢?原创 2022-09-30 10:54:23 · 445 阅读 · 0 评论 -
35.Trie树:如何实现搜索引擎的搜索关键词提示功能
问题:搜索引擎的关键词的联想词是如何实现的?Trie树,也叫“字典树”。Trie树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。有6个字符串,它们分别是:how,hi,her,hello,so,see。构造成如下图形:Trie树是多叉树。代码表示:时间复杂度:构建时间复杂度是O(n)(n表示所有字符串的长度和),查收是O(k), k是字符串长度。比较耗内存。Trie树有极其严苛的要求:一般从字符串中查询字符串,用哈希表或红黑树。Trie树不适合精确匹配以he为前缀的hello、her展示原创 2022-07-05 21:12:27 · 394 阅读 · 0 评论 -
34.字符串匹配基础(下):如何借助BM算法轻松理解KMP算法
有统计说,它是最高效、最常用的字符串匹配算法。要说最知名的一种的话,那就非KMP算法莫属。问题:如何借助上一节BM算法的讲解思路,让你能更好地理解KMP算法?原创 2022-09-26 22:14:05 · 257 阅读 · 0 评论 -
33.讲字符串匹配基础(中):如何实现文本编辑器中的查找功能
问题:对于查找功能是重要功能的软件来说,比如一些文本编辑器,它们的查找功能都是用哪种算法来实现的呢?有没有比BF算法和RK算法更加高效的字符串匹配算法呢?原创 2022-09-24 23:33:03 · 625 阅读 · 0 评论 -
32.讲字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配
问题: RK算法是如何借助哈希算法来实现高效字符串匹配的呢?原创 2022-09-24 11:11:52 · 403 阅读 · 0 评论 -
31.深度和广度优先搜索:如何找出社交网络中的三度好友关系
图的代码表示:1.1 广度优先搜索(BFS)Breadth-First-Search:一种“地毯式”层层推进的搜索策略,由近到远。visited是用来记录已经被访问的顶点,用来避免顶点被重复访问。queue是一个队列,用来存储已经被访问、但相连的顶点还没有被访问的顶点。prev用来记录搜索路径。时间复杂度是O(V+E),其中,V表示顶点的个数,E表示边的个数。间复杂度是O(V)。Depth-First-Search:时间复杂度是O(E),E表示边的个数。总的空间复杂度就是O(V)。原创 2022-07-10 15:53:37 · 286 阅读 · 0 评论 -
30.讲图的表示:如何存储微博、微信等社交网络中的好友关系
图的表示原创 2022-07-10 11:40:03 · 315 阅读 · 0 评论 -
29.讲堆的应用:如何快速获取到Top10最热门的搜索关键词
问题:假设现在我们有一个包含10亿个搜索关键词的日志文件,如何能快速获取到热门榜Top 10的搜索关键词呢?堆应用:优先级队列、求Top K和求中位数。往优先级队列中插入一个元素,就相当于往堆中插入一个元素;从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素。100个小文件,每个100m,每个小文件都是存储有序的字符串。分别取一个字符串,构建大小为100的小顶堆,取出堆顶元素放入新文件,假设堆顶字符串从13.txt文件取的,就再从13.txt中取字符串,再建堆,再取值放入大文件中。重复执行,知道所有的原创 2022-06-19 12:00:09 · 422 阅读 · 0 评论 -
28.讲堆和堆排序:为什么说堆排序没有快速排序快
堆排序是原地,时间复杂度为O(nlogn)。快速排序也是如此,为什么实际软件开发快速排序性能要比堆排序要好?特点:完全二叉树可以用数组实现堆,比较省内存,因为不用存指针,直接根据索引计算。节点索引i,其左节点为2i+1,右节点为2i+2。插入一个新元素后,需要继续满足堆的两个要求,为此需要堆化(heapify),堆化有上到下,下到上两种方法。案例:过程:我的版本:............原创 2022-06-18 22:19:18 · 641 阅读 · 0 评论 -
24.讲二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树
又名:二叉搜索树,特点:左子树都小于节点值,右子树都大于节点值。从根节点开始,等于直接返回,比它小查左子树,比它大查右子树。以此类推。1.2 插入1.3 删除三种情况:1.4 二叉查找树的其他操作快速地查找最大节点和最小节点、前驱节点和后继节点.重要特性:中序遍历二叉查找树,可以输出有序的数据序列,时间复杂度是O(n),非常高效。两种处理方法:...原创 2022-06-27 22:29:51 · 279 阅读 · 0 评论 -
23.二叉树基础(上):什么样的二叉树适合用数组来存储
问题: 二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储?三个相似概念:满二叉树:除了叶子节点,其他节点都有左右两个子节点。完成二叉树:叶子节点只出现在最后两层,最后一层叶子节点都靠左,其他层的节点数要达到最大。为什么特意拎出完成二叉树:如何存储二叉树?前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然原创 2022-06-27 21:10:08 · 302 阅读 · 0 评论 -
22.讲哈希算法(下):哈希算法在分布式系统中有哪些应用
问题:哈希算法是如何解决这些分布式问题的?原创 2022-09-22 22:25:26 · 308 阅读 · 0 评论 -
21.讲哈希算法(上):如何防止数据库中的用户信息被脱库
哈希算法的定义和原理: 将任意长度的二进制值串映射为固定长度的二进制值串。从哈希值不能反向推导出原始数据对输入数据敏感,哪怕改一个bit,得到的哈希值也大不相同;散列冲突的概率要很小;算法执行要高效。原创 2022-09-22 22:08:01 · 382 阅读 · 0 评论 -
20.散列表(下):为什么散列表和链表经常会一起使用
问题:为什么散列表和链表会经常放到一块使用?原创 2022-09-22 21:44:20 · 423 阅读 · 0 评论 -
19.讲散列表(中):如何打造一个工业级水平的散列表
散列表碰撞攻击的基本原理: 构造特定的数据,使得数据都映射到同一个槽,使得查询时间复杂度从O(1)变成O(n),大量消耗CPU或线程资源。如何设计一个可以应对各种异常情况的工业级散列表,来避免在散列冲突的情况下,散列表性能的急剧下降,并且能抵抗散列碰撞攻击?原创 2022-09-21 21:33:08 · 269 阅读 · 0 评论 -
18散列表(上):Word文档中的单词拼写检查功能是如何实现的
问题:Word的这个单词拼写检查功能是如何实现的?原创 2022-09-21 20:54:02 · 395 阅读 · 0 评论 -
17.讲跳表:为什么Redis一定要用跳表来实现有序集合
问题:那Redis为什么会选择用跳表来实现有序集合呢?为什么不用红黑树呢?原创 2022-08-13 16:50:54 · 710 阅读 · 0 评论 -
16.讲二分查找(下):如何快速定位IP对应的省份地址
问题:通过IP地址来查找IP归属地的功能。如何找到第一个8?3. 变体二:查找最后一个值等于给定值的元素4.变体三:查找第一个大于等于给定值的元素比如:数组中存储的这样一个序列:3,4,6,7,10。如果查找第一个大于等于5的元素,那就是6。5.变体四:查找最后一个小于等于给定值的元素6.课后思考我们今天讲的都是非常规的二分查找问题,今天的思考题也是一个非常规的二分查找问题。如果有序数组是一个循环有序数组,比如4,5,6,1,2,3。针对这种情况,如何实现一个求“值等于给定值”的二分查找算原创 2022-06-05 11:25:54 · 356 阅读 · 0 评论 -
15.讲二分查找(上):如何用最省内存的方式实现快速查找功能
问题:假设我们有1000万个整数数据,每个数据占8个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这1000万数据中? 我们希望这个功能不要占用太多的内存空间,最多不要超过100MB,你会怎么做呢?时间复杂度:O(logn)。容易出错的地方:2. 二分查找应用场景的局限性首先,二分查找依赖的是顺序表结构,简单点说就是数组。其次,二分查找针对的是有序数据。二分查找只能用在插入、删除操作不频繁,一次排序多次查找的场景中。再次,数据量太小不适合二分查找。数据量很小,二分查询不一定比顺序遍历好原创 2022-06-05 10:19:34 · 105 阅读 · 0 评论 -
14.讲排序优化:如何实现一个通用的、高性能的排序函数
小规模可以使用O(n^2),大规模使用O(nlogn)。 一般选用O(nlogn)。如果数据有序或者接近有序,每次选择最后一个作pivot,就会是时间复杂度退化到O(n^2)。最理想的分区点是:被分区点分开的两个分区中,数据的数量差不多。如何处理?Glibc中的qsort()函数举例。...原创 2022-06-18 20:35:53 · 106 阅读 · 0 评论 -
13.讲线性排序:如何根据年龄给100万用户数据排序
问题: 如何根据年龄给100万用户排序?把要排序的数据分到几个有序的桶,每个桶里的数据再单独进行排序,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。时间复杂度:O(n)n个数据,均分到m个桶,每个桶k=n/m个元素。 每个桶用快速排序,时间复杂度为O(k * logk)。m个桶排序的时间复杂度就是O(m * k * logk)。因为k=n/m,所以桶排序的时间复杂度就是O(n*log(n/m)),当m接近n时,接近O(n)。否。外部排序:内存有限,无法装载全部数据。比如:订单数据有10个原创 2022-06-17 22:32:43 · 176 阅读 · 0 评论