Ⅰ 绠楁硶镄勬湰璐ㄦ槸浠涔
鐩稿悓镣癸细镞犺轰綍绉嶈В棰樻柟寮,鍦ㄨВ鍐虫煇涓瀹为檯闂棰樻椂,閮藉簲璇ユg‘镄勭悊瑙i梾棰樼殑棰樻剰,浠庣湅浼煎嶆潅镄勯梾棰树腑鏁寸悊鍑轰竴涓澶寸华,铹跺悗阃氲繃绠楁硶锛埚嵆瑙e喅闂棰樼殑涓涓涓涓姝ラわ级鎻忚堪鍑烘煇涓闂棰樼殑瑙e喅杩囩▼,杩涜屼竴瀹氶噺镄勮$畻,链钖庨兘蹇呴’楠岃瘉璁$畻缁撴灉.
銆銆涓嶅悓镣癸细褰撹$畻閲忚缉澶ф椂,浜哄伐瑙i桦氨链夌偣锷涗笉浠庡绩浜,钥岃$畻链烘疮绉掍笂浜挎$殑璁$畻阃熷害鍗翠笉鍦ㄨ瘽涓,骞朵笖鍙瑕佺畻娉曟g‘,缂栫▼璇鍙ユ棤璇镄勮瘽,浣跨敤璁$畻链虹紪鍐欑殑瑙i樼▼搴忓彲浠ュ弽澶崭娇鐢.渚嫔傦细sum=1+2+3+4+5钬︹+锛坣-1锛+n杩欐牱镄勯梾棰.
Ⅱ 什么叫算法
算法,对应的英文单词是algorithm,这是一个很古老的概念,最早来自数学领域,是用于解决某一类问题的公式和思想。
计算机科学领域的算法,本质是一系列程序指令,用于解答特定的运算和逻辑问题。一般运用时间复杂度和空间复杂度来衡量算法好坏。
算法的应用领域多种多样:
运算,例如计算两个数的最大公约数。
查找,例如使用谷歌、网络搜索某一关键词得出数据和信息。
排序:例如浏览电商网站时,商品按价格从低到高进行排序。
最优决策:例如游戏中让AI角色找到迷宫的最佳路线。
参考资料:魏梦舒(@程序员小灰),《漫画算法:小灰的算法之旅》:电子工业出版社,2019-05
Ⅲ 迪杰斯特拉算法的本质是贪心还是动态规划
贪心是一种特殊的动态规划,动态规划的本质是独立的子问题,而贪心则是每次可以找到最优的独立子问题。
贪心和动归不是互斥的,而是包含的,贪心更快,但约束更强,适应范围更小。
动归和bfs的关系也是一样的。
展开一点讲,在求解最优化问题时,有多个解。而求解的过程类似一个树,我们称之为求解树。
一般的求解树真的是一棵树,所以我们只能用bfs来搜索,顶多剪枝。
有些特殊的求解树,中间很多结点是重合的,结点个数比所有搜索分支的个数少很多个数量级。这类问题较特殊,我们可以保存中间的搜索过程。而记忆化搜索和动态规划本质上就是一个东西,快就快在可以不用重复计算很多中间结果(所谓的最优子问题)。
还有一些特殊的求解树,更特殊,它们不止有很多重复结点,而且每次选择分支的时候,我们可以证明只要选择一个分支,这个分支的解就一定比其他选择更优。这类问题就是贪心了,
所以bfs,dp,贪心三个方法都是解决最优化问题的方法,根据问题的不同,约束越大的问题可以用越快的方法,越慢的方法可以解决的问题越普适。
动态规划的状态转移函数,可以抽象成这样一种函数:
f(x)=g(f(x1), f(x2), f(x3), ... f(xn))
其中f就是我们说的独立问题,每个f都有一个唯一值,也就是没有后效性。
贪心也是这个函数,但可以证明:
f(xi) >= f(x1|x2|...|xn)
那么我们就不用再去计算除了f(xi)以外的任何子状态了,所以就更快
而标准的bfs,虽然也有
f(x)=g(f(x1), f(x2), f(x3), ... f(xn))
但是因为对于任意的f(x),它的子问题f(xi)的输入状态xi都不同(换一种思路也可以说f(xi)在不同的路径下值都不同,本质上是我们怎么定义xi,到底是狭义的参数还是广义的状态),所以无法使用内存去换取时间,就只能去遍历所有状态了。
Ⅳ 贪心算法的本质
1. 贪心法(Greedy Algorithm)定义
求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择;
贪心法就是这样的算法:它在每个决策点作出在当时看来最佳的选择,即总是遵循某种规则,做出局部最优的选择,以推导出全局最优解(局部最优解->全局最优解)
2. 对贪心法的深入理解
(1)原理:一种启发式策略,在每个决策点作出在当时看来最佳的选择
(2)求解最优化问题的两个关键要素:贪心选择性质+最优子结构
①贪心选择性质:进行选择时,直接做出在当前问题中看来最优的选择,而不必考虑子问题的解;
②最优子结构:如果一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质
(3)解题关键:贪心策略的选择
贪心算法不是对所有问题都能得到整体最优解的,因此选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
(4)一般步骤:
①建立数学模型来描述最优化问题;
②把求解的最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题需要求解;
③证明做出贪心选择后:
1°原问题总是存在全局最优解,即贪心选择始终安全;
2°剩余子问题的局部最优解与贪心选择组合,即可得到原问题的全局最优解。
并完成2°
3. 贪心法与动态规划
最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。而贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。
Ⅳ 机器学习的算法和普通《算法导论》里的算法有什么本质上的异同
作者:董可人
链接:http://www.hu.com/question/24976006/answer/29682806
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
算法导论里的算法本质上是对有精确解的问题,如何更有效率地求得这个解。这个效率可以是计算时间更短,也可以是计算过程所需要的空间更少。
一个简单的例子是,给定一个乱序数组,如何快速的将其按从小到大的顺序重新排列,或者找到其中的中位数。这些问题都有确定且唯一的答案,一般都会有一个笨方法(穷举或遍历),只要一步一步来就可以解,所谓算法只是如何精简步骤,更快更省事地找到这个解。这些算法处理的数据也都是结构简洁且干净的类型,比如数组,二叉树,图之类的数据结构。数据规模对于这些算法而言,影响的是计算所需的时间和空间,不会因为规模改变而影响算法本身的逻辑以及计算的结果。
机器学习要解决的问题一般没有精确解,也不能用穷举或遍历这种步骤明确的方法找到解,而且需要强调的是“学习”这个属性,即希望算法本身能够根据给定的数据或计算环境的改变而动态的发现新的规律,甚至改变算法程序的逻辑和行为。
举例来说,可以是把一千份文档归类到不同的几个类别里。最简单的可以是给定几个类别,比如新闻,小说,诗歌等,算法来根据文章内容自动划分到对应的类别里。这里可以看出这个问题即使让人做,也有很多模糊不能确定的地方,比如一篇法制晚报上的犯罪纪实是应该划到新闻,还是小说呢?或者说一篇长诗比如荷马史诗是应该归在小说还是诗歌呢?机器学习算法想要解决的,就是根据从文章内容里找到的规律,来自动的给出一个划分。而不同算法可以给出不同的解,这些解都可以是“正确”的,所以一般还需要人为设计一个评判标准来决定孰优孰劣。
也可以不事先给定类别,而是让算法自己去发现文章中的规律,把相似度高的文章划分到一起。这样不同的算法可能给出不同数量的类别划分,可能是三个,四个,或者五个,也都可以是“正确”的划分。甚至什么是“相似度”,不同算法也可以给出不同解释,可以是名词动词形容词的词频及比例,也可以是句子的语法结构等。
更进一步的,你可能还希望这个算法能够用来判断一份新的文档的类别。而输入的新文档越多,也会进一步扩大初始数据集的规模,规模变大以后,原来数据中不明显的规律可能就变明显了。比如说原来一千份文档中只有一篇议论文,可能大多算法都无法把它单独划出一个类别,但当你持续输入一百份议论文后,数据中议论文的比例就变成了101/1100,差不多10%,这时候算法就应该划分出单独的议论文类别。在这个意义上,数据本身也对算法有很大的影响,这也是和算法导论中的算法的一个本质区别。
技术上说,算法导论中的算法关注点在数据结构和计算复杂度,属于离散数学的一个分支,不涉及微积分等高等数学概念。机器学习的算法本身是基于概率,统计和优化(optimization)等理论和技术,从这个角度上说给人感觉更“数学”一点。
在具体的实现细节上,机器学习的算法会大量应用算法导论中的技术来改进计算效率。但需要强调这仅仅是对底层实现来说,在算法本身的逻辑上,二者没有太多联系。换句话说,算法导论中的技术可以帮助你写出更快的程序来运行机器学习算法,但是这对机器学习要解决的问题本身是没有什么帮助的。熟练使用二叉树散列表,准确估算一个图算法的复杂度,都没有任何可能帮助你猜到在女朋友过生日时送什么礼物最好(使用了机器学习算法的淘宝君却很可能知道!)。因此不要把它们看成是搭积木拼构件的关系。
最后,如果以上解释仍然让你费解,那么还有一个更通俗的解释:算法导论是教你如何数数,而机器学习基本上相当于星座算命。一个很机械,一个靠忽悠,差不多就是这样吧。
具体分析见链接:http://www.hu.com/question/24976006
Ⅵ 算法的本质是什么
算法的本质是解决问题的方法,是思想
在早期的时候,人们遇到新问题,必须要去解决它,经过“冥思苦想”,“反复探索尝试”, 最后总结归纳。这才形成了今天我们学习的各种算法。如果无法领会到解决问题的思想,无法总结归纳,此衫就会有:“学算法有什么用?”。不知道为什么学,自然会认为学了没意义,没有用处。
2.一个算法应该具有以下五个重要的特征:
①有穷性: 算法的有穷性是指算法必须能在执行有限个步骤之后终止,换句话说就是一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内完成。
②确定性:算法中的每条指令必须有确切的定义,不会产生二义性,并且对于相同的输入只能得出相同的输出。
③可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
④输入: 一个算森亩腔法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件,这些输入取自于某个特定的对象集合。
⑤输出:一个算法有一个或多个的输出,这些输出是同输入有着特定关系的量,没有输出的算法是毫无意义的。
算法总是要解决特定的问题,问题来源就是算法的输入,期望的结果就是算法的输出,没有输入输出的算法是无意义的。
3.算法设计的5个要求:
①正确性:最基本要求,算法必须能解决某个问题的需求。
②可读性:算法的可读性有助于人的阅读与交流,容易调试和修改。
③健壮性:当输入的数据非法时,算法能适当做出反应或进行处理,而不会产生莫名其妙的输出结果。
④效率性:算法是为了解决大规模问题,因此需要运行效率足够快。
⑤存储性:算法在执行过程中,所需要的最大存储空间,应该尽可能的占用小。
效率性与存储性都与问题规模有关,求100人的耐携平均分与求1000人的平均分,同一个算法的所花费的执行时间与存储空间显然是不一样的。
正确性,可读性,健壮性不仅仅是算法设计的要求,而是贯穿整个软件设计层次。单对于算法本身来说,我们最关注的层面是效率性。千万不能死板的认为,算法就是计算机程序。算法是一切解决问题的思想,语言描述,伪代码,流程图,各种符号或者控制表格同样是算法。