算法 + 算法 = 新算法

道生一,一生二,二生三,三生万物。—道德经

我们都知道,基础的搜索算法有深搜DFS和广搜BFS。它们的搜索效率都差不多,都是O(E)。只是对于不同的搜索特点,有各自适用场合。

假如有这样一棵树,在写搜索算法之前先分析一下。

如果目标结点在叶子上的可能性非常大,那么通常用深搜。

如果希望目标结点的位置尽可能地离根结点近,那么通常用广搜。

如果目标结点与位置无关,而是每条路径都有一个权值,权值越大,则对应结点是目标结点的可能性越大,那要怎么搜呢?

道德经说:道生一,一生二,二生三,三生万物。

先来解释一下这句话,

道生一:道是事物变化发展的基本规律,气(一)是宇宙间的基本物质。

一生二:气(一)分阴阳(二),阳气上升,阴气下降。

二生三:阴阳(二)交感(三),上面的阳气与下面的地气会相互作用。

三生万物:由于阴阳交感(三),产生了无限的可能。

我的理解是,任何事物都有两个极端,但这两个极端之间不是瞬间转化的,而是会经过许多个中间步骤。转化过程中的许多步骤就是无限的可能。这些步骤中,既有这一段的影子,也有那一端的特点。

并不一定哪一端或者哪一个中间步骤是最好的,最合适的才是最好的。

回到刚才的问题,深搜和广搜看上去不同,但是它们的本质是相似的。

如果有一个容器,用于存储树的节点,每当发现有一个新的节点时,就把它放进容器。

每当当前节点处理完,就从容器中取出一个新的节点。

所谓深搜,就是用栈来实现这个容器,每次取最后放进去的节点。

而广搜,就是用队列来实现这个容器,每次取最先放进去的节点。

最后和最先是两个极端,但是我们没必要要一定要选择极端,我们选择最合适的。

怎样是最合适的,就是容器中权值最大的点。

嗯,这就是A*搜索。

这样的例子还有很多,

例如数组和链表,这是线性有序数据结构的两种物理结构。

数组存储的特点:便于读取,不便于插入删除

链表存储的特点:不便于读取,便于插入删除

考虑一个图这个数据结构,通常图中点的个数比较稳定而边的个数经常增减,

于是用数组存储点而链表存储边,于是就有了邻接表这样的数据结构。

还有插入排序和hash排序,

Hash排序:速度快,数据范围有限

插入排序:速度慢,数据范围无限

如果把这两种排序方法结合,先使用hash进行初排序,再使用插入排序进行精确排序,这不就是我们尝过的桶排序了吗?

以前总是很奇怪,为什么那些牛人们能想出这么多,这么神奇,这么精妙的算法出来。真想钻进他们的脑子里去看一看。

仔细看看这些算法,其实这些算法并不是完全凭空地被创造出来了,它们或多或少都有我们已知的某些算法的影子。只是大牛们因为深刻地理解了那些算法,才能把它们灵活应运,随意施展。用得恰到好处,令人称绝,就成了新的算法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 21:58:50

算法 + 算法 = 新算法的相关文章

php 获取优酷视频的真实地址(2014.6月新算法)

上个礼拜发现优酷改版了,各种过滤优酷广告的插件都失效了,于是我百度了一下(谷歌也不能用了)发现优酷改算法了,在ckplayer论坛发现有人在6月25号发了个php 的优酷代理文件,下载下来发现,能用但只能获取mp4格式的视频地址,而且php还加密了,没办法查看源码,后来通过微盾解密发现其中的源码,结合以前自己写的一个优酷视频解析类.... 感谢    3shi大大 具体分析请见 3shi大大的文章  优酷视频真实地址解析  (当然现在不能用了,主要看分析) ps.  新算法是从别人那里解密出来的

在weka中添加libSVM或者HMM等新算法

转:http://kasy-13.blog.163.com/blog/static/8214691420143226365887/ Weka的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),是一款免费的,非商业化(与之对应的是SPSS公司商业数据挖掘产品--Clementine )的,基于JAVA环境下开源的机器学习(machine learning)以及数据挖掘(data minining)软件.它和它的源代码可在其官方网站(h

源码方式向openssl中添加新算法完整详细步骤(示例:摘要算法SM3)【非engine方式】

openssl简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算.非对称算法密钥生成.ASN.1编解码库.证书请求(PKCS10)编解码.数字证书编解码.CRL编解码.OCSP协议.数字证书验证.PKCS7标准实现和PKCS12个人数字证书格式实现等功能. openssl采用C语言作为开发语言,这使得它具有优秀的跨平台性能.openssl支持Linux.UNIX.wi

[数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记录)的集合,将这些对象划分为多个组或者“聚簇”,从而使同组内的对象间比较相似而不同组对象间差异比较大:换言之,聚类算法就是将相似的对象放到同一个聚簇中,而将不相似的对象放到不同的聚簇中.由于在聚类过程中不使用到类别标签,所以相似性的概念要基于对象的属性进行定义.应用不同则相似性规则和聚类算法一般不太

【强连通分量】tarjan算法及kosaraju算法+例题

阅读前请确保自己知道强连通分量是什么,本文不做赘述. Tarjan算法 一.算法简介 Tarjan算法是一种由Robert Tarjan提出的求有向图强连通分量的时间复杂度为O(n)的算法. 首先我们要知道两个概念:时间戳(DFN),节点能追溯到的最早的栈中节点的时间戳(LOW).顾名思义,DFN就是在搜索中某一节点被遍历到的次序号(dfs_num),LOW就是某一节点在栈中能追溯到的最早的父亲节点的搜索次序号. Tarjan算法是基于深度优先搜索的算法.在搜索过程中把没有Tarjan过的点入栈

行为识别笔记:improved dense trajectories算法(iDT算法)(转载)

iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法,但与iDT的结果做ensemble总还是能获得一些提升.所以这几年好多论文的最优效果都是"Our method+iDT"的形式. 此前由于项目原因,对iDT算法进行了很多研究和实验,故此处对其核心思路与一些实施的细节进行总结,方便后续回顾,也希望能够在此过程中获得一些新的启发. 介绍的内

机器学习优化算法之爬山算法小结

简言 机器学习的项目,不可避免的需要补充一些优化算法,对于优化算法,爬山算法还是比较重要的.鉴于此,花了些时间仔细阅读了些爬山算法的paper.基于这些,做一些总结. 目录 1. 爬山算法简单描述  2. 爬山算法的主要算法 2.1 首选爬山算法 2.2 最陡爬山算法 2.3 随机重新开始爬山算法 2.4 模拟退火算法(也是爬山算法) 3. 实例求解 正文 爬山算法,是一种局部贪心的最优算法. 该算法的主要思想是:每次拿相邻点与当前点进行比对,取两者中较优者,作为爬坡的下一步. 举一个例子,求解

【先进的算法】Lasvegas算法3SAT问题(C++实现代码)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46469557 1.SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前.先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使得A 为真. 显然, 假设A 为真, 则 CNF 的每一个子句中必有一个命题变元为 1 (真

STL中heap算法(堆算法)

 ①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template <class RandomAccessIterator> inline void push_heap(RandomAccessIterator first,RandomAccessIterator last) { //注意,此函数被调用时,新元素应已置于底部容器的最尾端 _push_heap_au

stl_algorithm算法之变动性算法和非动性算法

七.算法:(算法头文件:<algorithm>) 所有的算法都需要iterator的支持,列如支持++,*,op=,op==,等等.. 非变动性算法: 7.1.template<class InputIterator, class UnaryPredicate> bool all_of (InputIterator first, InputIterator last, UnaryPredicate pred) //要所有的数据都是符合当前的条件才回返回TRUE,否则FALSE. {