摘要: 在Trie树那节我们讲过,利用Trie树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。 当你在搜索框中,一不小心输错单词时,搜索引擎会非常智能地检测出你的拼写错误,并且用对应的正确单词来进行搜 阅读全文
posted @ 2022-12-30 16:15 易先讯 阅读(18) 评论(0) 推荐(0) 编辑
摘要: 上一节,我通过两个非常经典的问题,向你展示了用动态规划解决问题的过程。现在你对动态规划应该有了一个初步的认识。 今天,我主要讲动态规划的一些理论知识。学完这节内容,可以帮你解决这样几个问题:什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?贪心、分治、回溯、动态规划这四种算法 阅读全文
posted @ 2022-12-30 16:08 易先讯 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 淘宝的“双十一”购物节有各种促销活动,比如“满200元减50元”。假设你女朋友的购物车中有n个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能不能编个代码来帮她搞定呢? 阅读全文
posted @ 2022-12-30 16:08 易先讯 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 我们在第31节提到,深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单,但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。 除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后 阅读全文
posted @ 2022-12-30 16:07 易先讯 阅读(27) 评论(0) 推荐(0) 编辑
摘要: MapReduce是Google大数据处理的三驾马车之一,另外两个是GFS和Bigtable。它在倒排索引、PageRank计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个MapReduce看起来很高深,感觉跟我们遥不可及。实际上,万变不离其宗,它的本质就是我们今天要学的这种算法思 阅读全文
posted @ 2022-12-30 16:07 易先讯 阅读(18) 评论(0) 推荐(0) 编辑
摘要: 基础的数据结构和算法我们基本上学完了,接下来几节,我会讲几种更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切地说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。 贪心、分治、回溯、动态规划这4个算法思想,原理解释起来都很简单,但是要真正掌握且灵 阅读全文
posted @ 2022-12-30 16:07 易先讯 阅读(29) 评论(0) 推荐(0) 编辑
摘要: 很多支持用户发表文本内容的网站,比如BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢? 实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的 阅读全文
posted @ 2022-12-30 15:57 易先讯 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 搜索引擎的搜索关键词提示功能,我想你应该不陌生吧?为了方便快速输入,当你在搜索引擎的搜索框中,输入要搜索的文字的某一部分的时候,搜索引擎就会自动弹出下拉框,里面是各种关键词提示。你可以直接从下拉框中选择你要搜索的东西,而不用把所有内容都输入进去,一定程度上节省了我们的搜索时间。 尽管这个功能我们几乎 阅读全文
posted @ 2022-12-30 15:56 易先讯 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 上一节我们讲了BM算法,尽管它很复杂,也不好理解,但却是工程中非常常用的一种高效字符串匹配算法。有统计说,它是最高效、最常用的字符串匹配算法。不过,在所有的字符串匹配算法里,要说最知名的一种的话,那就非KMP算法莫属。很多时候,提到字符串匹配,我们首先想到的就是KMP算法。 尽管在实际的开发中,我们 阅读全文
posted @ 2022-12-30 15:56 易先讯 阅读(20) 评论(0) 推荐(0) 编辑
摘要: 文本编辑器中的查找替换功能,我想你应该不陌生吧?比如,我们在Word中把一个单词统一替换成另一个,用的就是这个功能。你有没有想过,它是怎么实现的呢? 当然,你用上一节讲的BF算法和RK算法,也可以实现这个功能,但是在某些极端情况下,BF算法性能会退化的比较严重,而RK算法需要用到哈希算法,设计一个可 阅读全文
posted @ 2022-12-30 15:55 易先讯 阅读(37) 评论(0) 推荐(0) 编辑
摘要: 从今天开始,我们来学习字符串匹配算法。字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如Java中的indexOf(),Python中的find()函数等,它们底层就是依赖接下来要讲的字符串匹配算法。 字符串匹配算法很多,我会 阅读全文
posted @ 2022-12-30 15:54 易先讯 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 上一节我们讲了图的表示方法,讲到如何用有向图、无向图来表示一个社交网络。在社交网络中,有一个六度分割理论,具体是说,你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个互不相识的人。 一个用户的一度连接用户很好理解,就是他的好友,二度连接用户就是他好友的好友,三度连 阅读全文
posted @ 2022-12-30 15:33 易先讯 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 微博、微信、LinkedIn这些社交软件我想你肯定都玩过吧。在微博中,两个人可以互相关注;在微信中,两个人可以互加好友。那你知道,如何存储微博、微信等这些社交网络的好友关系吗? 这就要用到我们今天要讲的这种数据结构:图。实际上,涉及图的算法有很多,也非常复杂,比如图的搜索、最短路径、最小生成树、二分 阅读全文
posted @ 2022-12-30 15:24 易先讯 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 搜索引擎的热门搜索排行榜功能你用过吗?你知道这个功能是如何实现的吗?实际上,它的实现并不复杂。搜索引擎每天会接收大量的用户搜索请求,它会把这些用户输入的搜索关键词记录下来,然后再离线地统计分析,得到最热门的Top 10搜索关键词。 那请你思考下,假设现在我们有一个包含10亿个搜索关键词的日志文件,如 阅读全文
posted @ 2022-12-30 15:22 易先讯 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 我们今天讲另外一种特殊的树,“堆”(HeapHeap)。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地的、时间复杂度为O(n\log n)O(nlogn)的排序算法。 前面我们学过快速排序,平均情况下,它的时间复杂度为O(n\log n)O(nlogn)。尽管这两种排序算法 阅读全文
posted @ 2022-12-30 15:22 易先讯 阅读(13) 评论(0) 推荐(0) 编辑
摘要: 今天,我们来讲这种数据结构的一种特殊应用,递归树。 我们都知道,递归代码的时间复杂度分析起来很麻烦。我们在第12节《排序(下)》那里讲过,如何利用递推公式,求解归并排序、快速排序的时间复杂度,但是,有些情况,比如快排的平均时间复杂度的分析,用递推公式的话,会涉及非常复杂的数学推导。 除了用递推公式这 阅读全文
posted @ 2022-12-30 15:21 易先讯 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 红黑树是一个让我又爱又恨的数据结构,“爱”是因为它稳定、高效的性能,“恨”是因为实现起来实在太难了。我今天讲的红黑树的实现,对于基础不太好的同学,理解起来可能会有些困难。但是,我觉得没必要去死磕它。 我为什么这么说呢?因为,即便你将左右旋背得滚瓜烂熟,我保证你过不几天就忘光了。因为,学习红黑树的代码 阅读全文
posted @ 2022-12-30 15:21 易先讯 阅读(18) 评论(0) 推荐(0) 编辑
摘要: 上两节,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。 不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于log2n的情况,从而导致各个操作的效率下降。极 阅读全文
posted @ 2022-12-30 15:20 易先讯 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是O(1)。既然有了这么高效的散列表,使用二叉树 阅读全文
posted @ 2022-12-30 15:20 易先讯 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出一道思考题:二叉树有哪几种存储方式?什么样的二叉树适合 阅读全文
posted @ 2022-12-30 15:19 易先讯 阅读(13) 评论(0) 推荐(0) 编辑