何谓算法
❶ 深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系
1、何谓启发式搜索算法
在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是 在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确 定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。 这个寻找的过程就是状态空间搜索。
常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。这两种算法在数据结构书中都有描述,可以参看这些书得到更详细的解释。
前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。在这里就要用到启发式搜索了。
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提 到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。我们先看看估价是如何表示的。
启发中的估价是用估价函数表示的,如:
f(n) = g(n) + h(n)
其中f(n) 是节点n的估价函数,g(n)实在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。在这里主要是h(n)体现了搜 索的启发信息,因为g(n)是已知的。如果说详细点,g(n)代表了搜索的广度的优先趋势。但是当h(n) >> g(n)时,可以省略g(n),而提高效率。这些就深了,不懂也不影响啦!我们继续看看何谓A*算法。
2、初识A*算法
启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的 策略不同。象局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了 其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。最好优先就聪明多了,他在搜索时,便没有舍弃节点 (除非该节点是死节点),在每一步的估价中都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。那么 A*算法又是一种什么样的算法呢?其实A*算法也是一种最好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空 间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A* 算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值,h'(n)是n到目标的最断路经的启发值。由于这个f'(n)其实是无法预先知道 的,所以我们用前面的估价函数f(n)做近似。g(n)代替g'(n),但 g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别 的重要)。可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。哈。你懂了吗?肯定没 懂。接着看。
举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的A*算法。
再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除 的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由 于实时性的问题,h(n)的信息越多,它的计算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这 里就有一个平衡的问题。可难了,这就看你的了!
好了我的话也说得差不多了,我想你肯定是一头的雾水了,其实这是写给懂A*算法的同志看的。哈哈。你还是找一本人工智能的书仔细看看吧!我这几百字是不足以将A*算法讲清楚的。只是起到抛砖引玉的作用希望大家热情参与吗。
❷ 一起读经典《赌经》开篇
赌者,守静也。何谓守静,曰:其性如水之沉寂,其心如山之岿然也。静者,赌之根本也;守静者不败,虽未必然,然赌有算法存焉,足以道智,容有是也。故善赌者临事而专心、绝虑;无物、无我;袖领群伦,泰山崩而心不惊也。赌者,用忍也。何谓用忍也,曰:节欲也。欲不可纵,嗜欲所牵,逐物舍己焉。忍者有三,曰坚忍曰隐忍曰弗忍。莫大之利,源于须臾之忍,莫大之祸,起于须臾之弗忍焉,故善赌者必忍忍于心,唾沫自干也。
这里不专门进行符合“信、达、雅”的翻译,而对其核心进行一定的解析。
“赌”这个字,我不认同通俗的翻译,译本认为“赌”的意思是“赌博”,不甚恰当。从整本书的内容和精神实质看,“赌博”一词就不恰当了,也会引起误会。而将“赌”看作拼搏,争取,等一种向上的动作,却能够比较贴切书中的精神。
我们能够看到总纲里面有两个要点,一个是“静”,一个是“忍”。
“静”包含了三个方面:一是“算法存焉”,这个指的是冷静,理性化的处理事务;二是“临事专心绝虑,无物无我”,这是说专心致志,达到物我两忘的程度,专注于自己从事的事情;三是“泰山崩而心不惊也”,指的是处变不惊,人为了减少或者防止失败,往往会事先制定若干计划,然而,无论是什么计划,事实上都不是确保无误的,甚至有些看起来严丝合缝的计划,会因为大环境的改变,迎来全盘的失败,处变不惊,才能恢复理性。
“忍”也包含了三个方面:一是“坚忍”,坚持一件事情,或者计划的忍耐力,也就是对痛苦的忍耐力,通常称为毅力,意志力,恒心等;二是“隐忍”,也就是对于屈辱、侮辱和长期处于卑微的位置受气的忍耐力,人需要拼搏是因为卑微,而卑微的时候人微言轻,说了正确的话也看起来像是错误的,做了正确的事情好像是错误的,就要一定程度屈从于大家的意见,从而在大家的“正确”中,取得信任,获取表达正确的机会;三是“弗忍”,就是前面两者的否定了,简单的说,就是不能长久的坚持事情,不能忍受屈辱,不能以大局为重。
做到了“坚忍”和“隐忍”,一段时间后,自己会获利良多;做到了“弗忍”,一段时间后,自己会受到较大的损害,或者是灾祸,这个灾祸可能是事情和计划的失败,也可能是被所在的团体群排挤出去,开除之类。因而,善于拼搏和奋斗的人,一定事做到了前两者的,并且做的很好。
❸ 何谓数据的逻辑结构何谓数据的存储结构两者有何联系
逻辑结构指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构包括:
1、集合结构:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系。
2、线性结构:数据结构中的元素存在一对一的相互关系。
3、树形结构:数据结构中的元素存在一对多的相互关系。
4、图形结构:数据结构中的元素存在多对多的相互关系。
存储结构指数据元素连同其逻辑关系在存储器上的存放形式,主要的有四类:顺序、链接、索引、散列。一种数据结构可表示成一种或多种存储结构。
两者的关系在于:逻辑结构用于设计算法,存储结构用于算法编码实现。具体而言某种存储结构与某种逻辑结构没有必然的联系,算法的实现效率越高、解决问题越方便。
(3)何谓算法扩展阅读
数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。
数据的逻辑结构是从具体问题抽象出来的数学模型,是描述数据元素及其关系的数学特性的,有时就把逻辑结构简称为数据结构。逻辑结构是在计算机存储中的映像,形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。
根据数据元素间关系的不同特性,通常有下列四类基本的结构:集合结构、线性结构、树型结构、图形结构。
线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,或者说线性表是由同一类型的数据元素构成的线性结构。
线性表是最简单、最基本、也是最常用的一种线性结构。 它有两种存储方法:顺序存储和链式存储,它的主要基本操作是插入、删除和检索等。
数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
1、顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。
2、链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现
3、索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
4、散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。
数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。
线性结构的顺序存储结构是一种顺序存取的存储结构,线性表的链式存储结构是一种随机存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。
❹ 举例说明何谓算法,特点是什么评价一个算法的优劣,主要从哪些因素分析
评价算法优劣的四个分析因素:
1.正确性
能正确地实现预定的功能,满足具体问题的需要。处理数据使用的算法是否得当,能不能得到预想的结果。
2.易读性
易于阅读、理解和交流,便于调试、修改和扩充。写出的算法,能不能让别人看明白,能不能让别人明白算法的逻辑?如果通俗易懂,在系统调试和修改或者功能扩充的时候,使系统维护更为便捷。
3.健壮性
输入非法数据,算法也能适当地做出反应后进行处理,不会产生预料不到的运行结果。数据的形式多种多样,算法可能面临着接受各种各样的数据,当算法接收到不适合算法处理的数据,算法本身该如何处理呢?如果算法能够处理异常数据,处理能力越强,健壮性越好。
4.时空性
算法的时空性是该算法的时间性能和空间性能。主要是说算法在执行过程中的时间长短和空间占用多少问题。
算法处理数据过程中,不同的算法耗费的时间和内存空间是不同的。
(4)何谓算法扩展阅读:
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。此外,一个算法还具有下列5个重要的特性。
(1)、有穷性
一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
(2)、确定性
算法中每一条指令必须有明确的含义,读者理解时不会产生二义性。即对于相同的输入只能得到相同的输出。
(3)、可行性
一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
(4)、输入
一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
(5)、输出
一个算法有一个或多个的输出,这些输出是同输入有着某种特定关系的量。
❺ 何谓算法它与程序有何区别
人能理解的运算方法叫算法;机器能理解的运算方法叫程序。