算法 + 算法 = 新算法
道生一,一生二,二生三,三生万物。—道德经
我们都知道,基础的搜索算法有深搜DFS和广搜BFS。它们的搜索效率都差不多,都是O(E)。只是对于不同的搜索特点,有各自适用场合。 这里写图片描述 假如有这样一棵树,在写搜索算法之前先分析一下。 如果目标结点在叶子上的可能性非常大,那么通常用深搜。 如果希望目标结点的位置尽可能地离根结点近,那么通常用广搜。 如果目标结点与位置无关,而是每条路径都有一个权值,权值越大,则对应结点是目标结点的可能性越大,那要怎么搜呢?
道德经说:道生一,一生二,二生三,三生万物。 先来解释一下这句话, 道生一:道是事物变化发展的基本规律,气(一)是宇宙间的基本物质。 一生二:气(一)分阴阳(二),阳气上升,阴气下降。 二生三:阴阳(二)交感(三),上面的阳气与下面的地气会相互作用。 三生万物:由于阴阳交感(三),产生了无限的可能。
我的理解是,任何事物都有两个极端,但这两个极端之间不是瞬间转化的,而是会经过许多个中间步骤。转化过程中的许多步骤就是无限的可能。这些步骤中,既有这一段的影子,也有那一端的特点。 并不一定哪一端或者哪一个中间步骤是最好的,最合适的才是最好的。
回到刚才的问题,深搜和广搜看上去不同,但是它们的本质是相似的。
如果有一个容器,用于存储树的节点,每当发现有一个新的节点时,就把它放进容器。 每当当前节点处理完,就从容器中取出一个新的节点。 所谓深搜,就是用栈来实现这个容器,每次取最后放进去的节点。 而广搜,就是用队列来实现这个容器,每次取最先放进去的节点。 最后和最先是两个极端,但是我们没必要要一定要选择极端,我们选择最合适的。 怎样是最合适的,就是容器中权值最大的点。 嗯,这就是A*搜索。
这样的例子还有很多, 例如数组和链表,这是线性有序数据结构的两种物理结构。 数组存储的特点:便于读取,不便于插入删除 链表存储的特点:不便于读取,便于插入删除 考虑一个图这个数据结构,通常图中点的个数比较稳定而边的个数经常增减, 于是用数组存储点而链表存储边,于是就有了邻接表这样的数据结构。
还有插入排序和hash排序, Hash排序:速度快,数据范围有限 插入排序:速度慢,数据范围无限 如果把这两种排序方法结合,先使用hash进行初排序,再使用插入排序进行精确排序,这不就是我们尝过的桶排序了吗?
以前总是很奇怪,为什么那些牛人们能想出这么多,这么神奇,这么精妙的算法出来。真想钻进他们的脑子里去看一看。 仔细看看这些算法,其实这些算法并不是完全凭空地被创造出来了,它们或多或少都有我们已知的某些算法的影子。只是大牛们因为深刻地理解了那些算法,才能把它们灵活应运,随意施展。用得恰到好处,令人称绝,就成了新的算法。