其他分享
首页 > 其他分享> > 知识的核心与外壳

知识的核心与外壳

作者:互联网

很早以前就开始意识到,很多知识是由“核心”和“外壳”两个部分组成的。

这里的“知识”可以是一个算法、一个概念或者一篇文章等。通常“核心”就是那个“灵感”、“灵机一动”或者是“新想法”。而“外壳”则是把想法运用的相关背景知识或者工具。

举个例子,生活中人们经常看一部剧看到一半被打断。当想继续看的时候需要找到上次看到的位置。这时候大多数人都知道要从中间开始找,看看有没有看过,再根据结果决定往回倒或者往前进,不断缩小范围直到找到之前中断的位置。而这和算法中的“二分查找”知识的“核心”是一样的。而学习“二分查找”的“外壳”包括了相关的计算机知识,例如线性结构和编程语言基础。

不同领域的知识或者生活经验,通常会有相同的“核心”。而“外壳”通常是获得知识的壁垒。比如大多数人知道怎么找剧的中断点,但不在计算机相关领域的人,通常不知道“二分查找”。

知识的“外壳”是一件很烦人的事。学习新知识的时候,“外壳”会让我们失去学习的耐心。“外壳”越复杂,越容易让人认为这个“知识”越“高深”,掌握的人就越少,即使它有一个非常简单的“核心”。

“外壳”对知识很重要,但是知识的“核心”才是它最有价值的部分。许多“知识”正是由于现存教材没有很好地剥离“外壳”,导致难学。很多好的文章、教程和博客,也正是因为知道如何剥离“外壳”而受到欢迎,比如我很喜欢的阮一峰、Matrix67等。

 

这里抛砖引玉,列举一些我所了解的知识和它的核心(持续更新在Notion列表,欢迎评论):

ACM的各种算法及其优化的核心:去除重复和不必要的计算。

各种搜索的核心:如何以特定顺序不重复不遗漏地扫一遍。

广度优先搜索(BFS):由近及远的顺序。

深度优先搜索(DFS):一条路走到头,走到死路再回头走另一条。

DLX:在DFS的基础上,不用“标记”来表示一条路走没走过,而是用链表来保存没走过的状态。优化的地方在于不用“看一下”是否被标记。

动态规划:以存代算,算过的结果存下来,需要的时候不用再算一遍。难点在于如何标识“这个问题已经算过”,以及计算的顺序。

Dijkstra最短路:本质上是BFS,由近及远找目标。

单调队列:干掉不可能成为答案的值,例如一个数组里想求每个数左边3个数中最大的那个,如果a[i]比a[i+1]小,那么a[i]永远不会是任何位置的答案,可以删掉。

O(nlgn)的最长不降子序列:核心就是单调队列。

KMP:重用字串自身的信息。方法是先对子串t预处理,建立一个数组存“下一跳”的信息,如果t[0...i-1]都匹配,t[i]不匹配,可以直接跳到下一个匹配位置。例如母串p是"abcdefg",字串t是"abd"。用"abc"和abd"匹配的时候,可发现c和d匹配不上,这时不需要再比较"bcd"和"abd"是否匹配,因为母串的"b"和字串的"a"必然不匹配。可以直接跳到"cde"和"abd"进行匹配。

Trie树:存很多字符串的时候合并相同前缀。

AC自动机:把KMP的思想扩展到Trie树上。

 

标签:匹配,核心,知识,外壳,字串,abd
来源: https://www.cnblogs.com/lzsz1212/p/16290987.html