当前位置:首页 » 操作系统 » 算法导论如何

算法导论如何

发布时间: 2023-08-17 10:21:37

‘壹’ 有哪些好的c/c++算法的书

能推荐的书籍:算法导论(原书第3版) 这一本书的思路和我很类似,都是以伪代码的思路展开,但是与我相比,欠缺的是如何转为实际代码。算法(第4版) 这一本书各种图例,很浅显易懂,但是是Java。数据结构与程序设计 C++语言编写,我以前的大学教材,习题很值得一做。Data Structures & Algorithm Analysis in C++ (9780132847377): Mark A. Weiss: Books C++11编写,若你想要C++11编写的数据结构教材,可以参看这本书。HackerRank 练习Data Structures 与 Algorithms版块,题目难度循循渐进。着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。若是算法的话,我个人认为是不应该局限于C/C++的,只是目前很多书籍会以 算法 ---- XXXX 语言实现 来作为讲解,其中一个原因是目标读者熟悉这种语言。而在推荐书籍前,我想给你我认为一种学习算法的方式,然后你再看书籍时按照这样的方法学,或许会好一点点。不过这是我的一言,若你觉得适合你就采用,若觉得不好,也可以再摸索出适合自己的方式,适合自己的才是最好的。我认为我们若初学算法,可以分为两步,第一步,思考清楚算法,你可以使用自己最舒服的表达方式来记录你的思考流程。我举一个例子,如 bubble sort ,你不必最开始就想着如何用 C/C++来写,你可以考虑清楚bubble sort到底是什么,然后流程方法是什么,然后记录下来。那么,我来回答这个问题会是类似这样,bubble sort是一种排序的方法,它可以把给入的元素序列进行排序。

‘贰’ 《算法导论》三种解递归式的方法

代入法可以用来确定一个递归式的上界或下界。这种方法很有效,但只能用于解的形式很容易猜的情形。

例如,我们需要确定下面递归式的上界:

该递归式与归并排序相似,我们可以猜测其解为

代入法要求证明,恰当选择常数 c>0,可有 T(n)≤cn lgn。首先假设此上界对所有正数 m<n 都成立,特别是对于 m=n/2,有 T(n/2)≤c(n/2)lg(n/2)。将其代入递归式,得到:

其中,只要 c≥1,最后一步都会成立。

并不存在通用的方法来猜测递归式的正确解,但总有一些试探法可以帮助做出好的猜测:

如果某个递归式与先前见过的类似,则可猜测该递归式有类似的解。如,递归式

看起来比较难解,因为右式 T 的自变量中加了 17,但我们可以猜测这个多出来的项对解的影响不大,因为当 n 很大时, 与 之间的差别并不大,两者都将 n 分成均匀的两半。

另一种方法是先证明递归式的较松的上下界,然后再缩小不确定性区间。例如,对递归式 ,因为递归式中有 n,而我们可以证明初始上界为 。然后,逐步降低其上界,提高其下界,直到达到正确的渐近确界 。

有时,我们或许能够猜出递归式解的渐近界,但却会在归纳证明时出现一些问题。通常,问题出在归纳假设不够强,无法证明其准确的界,遇到这种情况时,可以去掉一个低阶项来修改所猜测的界,以使证明顺利进行。如下面的递归式:

可以猜测其解为 ,即要证明对适当选择的 c,有 。有所猜测的界对递归式做替换,得到

由此无法得到 ,无论 c 的值如何。如果猜测一个更大的界,如 ,虽然这确实是上界,但事实上,所猜测的解 却是正确的。为了证明这一点,要做一个更强的归纳假设。

从直觉上说,猜测 几乎是正确的,只是差了一个常数 1,即一个低阶项,然而,就因为差了一项,数学归纳法就无法证明出期望的结果。从所作的猜测中减去一个低阶项,即 是个常数。现在有

只要 b≥ 1。这里,c 要选的足够大,以便能处理边界条件。

你可能会觉得从所作的猜测中减去一项有点儿与直觉不符。为什么不是增加一项来解决问题呢?关键在于要理解我们是在用数学归纳法:通过对更小的值作更强的假设,就可以证明对某个给定值的更强的结论。

在运用渐近表示时很容易出错。例如,对递归式 ,由假设 ,并证明

就是错误的,因为 c 是常数,因而错误地证明了 。错误在于没有证明归纳假设的准确形式,即 。

有时,对一个陌生的递归式作一些简单的代数变换,就会使之变成读者较熟悉的形式。如下例子:

这个式子看上去比较难,但可以对它进行简化,方法是改动变量。为了方便起见,不考虑数的截取整数问题,如将 化为整数。设 ,得

再设 ,得到新的递归式

这个式子看起来与 就非常像了,这个新的递归式的界是: 。将 带回 ,有 。

有时候,画出一个递归树是一种得到好猜测的直接方法。在递归树中,每一个节点都代表递归函数调用集合中一个子问题的代价。将树中每一层内的代价相加得到一个每层代价的集合,再将每层的代价相加,得到的结果是所有层次的总代价。当用递归式表示分治算法的运行时间时,递归树的方法尤其有用。

递归树最适合用来产生好的猜测,然后用代入法加以验证。但使用递归树产生好的猜测时,通常可以容忍小量的“不良量”,因为稍后就会证明所做的猜测。如果画递归树时非常地仔细,并且将代价都加了起来,那么就可以直接用递归树作为递归式的解的证明。

在讲述例子之前,我们先来看一个几何级数公式

对于实数 x≠1,式

是一个几何级数(或称指数级数),其值为

当和是无限的且 |x|<1 时,有无限递减几何级数

我们以递归式

为例来看一下如何用递归树生成一个好的猜测。首先关注如何寻找解的一个上界,因为我们知道舍入对求解递归式通常没有影响(此处即是我们需要忍受不精确的一个例子),因此可以为递归式

创建一颗递归树,其中已将渐近符号改写为隐含的常数系数 c>0。

构造的递归树如下:

求所有层次的代价之和,确定整棵树的代价:

最后的这个公式看起来不够整洁,但我们可以再次充分利用一定程度的不精确,并利用无限递减几何级数作为上界。回退一步,得到:

此时,我们得到了递归式的一个猜测,在上面的例子里, 系数形成了一个递减的等比级数,可知这些系数的总和的上界是常数 。由于树根所需的代价为 ,所以根部的代价占总代价的一个常数部分。换句话说,整棵树的总代价是由根部的代价所决定的。

事实上,如果 确实是此递归式的上界,那么它一定是确界,为什么呢?第一个递归调用所需要的代价是 ,所以 一定是此递归式的下界。

现在我们可以使用代换法来验证猜测的正确性, 是递归式 的一个上界。只需要证明,当某常数 d>0, 成立。适用与前面相同的常数 c>0,有

只要 d≥ ,最后一步都会成立。

上图是递归式

对应的递归树。我们还是使用 c 来代表 项常数因子。当将递归树内各层的数值加起来时,可以得到每一层的 cn 值。从根部到叶子的最长路径是 。因为当 时, ,所以树的深度是 。

直觉上,我们预期递归式的解至多是层数乘以每层的代价,也就是 。总代价被均匀地分布到递归树内的每一层上。这里还有一个复杂点:我们还没有考虑叶子的代价。如果这棵树是高度为 的完整二叉树,那么有 个叶子节点。由于叶子代价是常数,因此所有叶子代价的总和为 ,或者说 。然而,这棵递归树并不是完整的二叉树,少于 个叶子,而且从树根往下的过程中,越来越多的内部结点在消失。因此,并不是所有层次都刚好需要 cn 代价;越靠近底层,需要的代价越少。我们可以计算出准确的总代价,但记住我们只是想要找出一个猜测来使用到代入法中。让我们容忍这些误差,而来证明上界为 的猜测是正确的。

事实上,可以用代入法来证明 是递归式解的上界。下面证明 ,当 d 是一个合适的正值常数,则

上式成立的条件是 。因此,没有必要去更准确地计算递归树中的代价。

主方法给出了求解递归式的“食谱”方法,即将规模为 n 的问题划分为 a 个子问题的算法的运行时间,每个子问题规模为 ,a 和 b 是正常数。a 个子问题被分别递归地解决,时间各为 。划分原问题和合并答案的代价由函数 描述。

从技术正确性角度来看,递归式实际上没有得到很好的定义,因为 可能不是一个整数。但用 向上取整或向下取整来代替 a 项 并不影响递归式的渐近行为,因而,在写分治算法时略去向下取整和向上取整函数会带给很大的方便。

其中我们将 n/b 解释为 n 除以 b 的向下取整或向上取整。那么 T(n) 有如下渐近界:

在使用主定理之前,我们需要花一点时间尝试理解它的含义。对于三种情况的每一种,将函数 f(n) 与函数 进行比较。直觉上,两个函数较大者决定了递归式的解。若函数 更大,如情况 1,则解为 T(n)= ( )。若函数 f(n) 更大,如情况 3,则解为 T(n)= (f(n))。若两个函数大小相当,如情况 2,则乘上一个对数因子,解为 T(n)= ( )= ( )。

另外还有一些技术问题需要加以理解。在第一种情况下,不仅要有 小于 ,还必须是多项式地小于,也就是说, 必须渐近小于 ,要相差一个因子 ,其中 是大于 0 的常数。在第三种情况下,不是 大于 就够了,而是要多项式意义上的大于,而且还要满足“正则”条件 。

注意:三种情况并没有覆盖所有可能的 f(n)。当 f(n) 只是小于 但不是多项式地小于时,在第一种情况和第二种情况之间就存在一条“沟”。类似情况下,当 f(n) 大于 ,但不是多项式地大于时,第二种情况和第三种情况之间就会存在一条“沟”。如果 f(n) 落在任一条“沟”中,或是第三种情况种规则性条件不成立,则主方法就不能用于解递归式。

使用主方法很简单,首先确定主定理的哪种情况成立,即可得到解。

例如:

对于这个递归式,我们有 a=9,b=3,f(n)=n,因此 = = 。由于 f(n) = ,其中 , 因此可以应用于主定理的情况 1,从而得到解 T(n) = Θ( ) 。

现在考虑

其中,a = 1, b = 3/2, f(n) = 1,因此 = = = 1 。由于 f(n) = = Θ(1) ,因此可应用于情况2,从而得到解 T(n) = Θ( ) 。

对于递归式

我们有 a = 3,b = 4,f(n) = nlgn,因此 = =O( )。由于 当 n,其中 ,因此,如果可以证明正则条件成立,即应用于情况 3。当 n 足够大时,对于 , ,因此,由情况 3,递归式的解为 T(n)= ( )。

主方法不能用于如下递归式:

虽然这个递归式看起来有恰当的形式:a=2,b=2, ,以及 。你可能错误地认为应该应用情况 3,因为 渐近大于 。问题出现在它并不是多项式意义上的大于。对任意正常数 ,比值 都渐近小于 。因此,递归式落入了情况 2 和情况 3 之间的间隙。

证明分为两部分。第一部分分析“主”递归式 ,并作了简化假设 仅定义在 b>1 的整数幂上,即 , , ,…。这部分从直觉上说明该定理为什么是正确的。第二部分说明如何将分析扩展至对所有的正整数 n 都成立,主要是应用数学技巧来解决向下取整函数和向上取整函数的处理问题。

取正合幂时的证明

对于递归式

此时的假设是 n 为 b>1 的正合幂,且 b 不必是整数。分析可分成三个引理说明,第一个引理是将解原递归式的问题归约为对一个含和式的求值的问题。第二个引理决定含和式的界,第三个引理把前两个合在一起,证明当 n 为 b 的正合幂时主定理成立。

引理一 :设 a≥1,b>1 为常数,f(n) 为定义在 b 的正合幂上的非负函数。定义 如下:

其中 i 是正整数,则有

证明:如下图。根节点代价为 f(n),它有 a 个子女,每个代价是 。(为方便起见可将 a 视为整数,但这对数学推导没什么影响。)每个子女又各有 a 个子女,代价为 。这样就有 个结点离根的距离为 2。一般地,距根为 j 的结点有 个,每一个的代价为 。每一个叶结点的代价为 ,每一个都距根 ,因为 。树中共有 个叶结点。

可以将树中各层上的代价加起来而得到方程 ,第 j 层上内部结点的代价为 ,故各层内部结点的总代价和为

在其所基于的分治算法中,这个和值表示了将问题分解成为子问题并将子问题的解合并时所花的代价,所有叶子的代价(即解 个规模为 1 的子问题的代价)为 。

根据递归树,主定理的三种情况对应于树中总代价的三种情况:1、由所有叶子节点的代价决定;2、均匀分布在各层上;3、由根结点的代价决定。

引理二 :设 a≥1,b≥1 为常数, 为定义在 b 的整数幂上的非负函数。函数 由下式定义

对 b 的整数幂,该函数可被渐近限界为:

证明:对情况 1,有 ,这隐含着 。用它对方程 做代换,得

对 O 标记内的式子限界,方法是提出不变项并作简化,得到一个上升几何级数:

因为 b 与 都是常数,最后的表达式可化简为 。用此表达式对 作替换,得

情况 1 得以验证。

为证情况 2,假设 ,有 。用此式对方程 作替换,得

对 记号中的式子做类似情况 1 中的限界,但所得并非是几何级数,而是每项都是相同的:

用此方程对 中的和式做替换,有

则情况 2 得以验证。情况 3 也可以用类似的方式证明。

引理三 :设 a≥1,b>1 是常量, 是定义在 b 的整数幂上的非负函数。定义 T(n) 如下:

其中 i 是正整数。对于 b 的整数幂,T(n) 可有如下渐近界:

证明:用引理二给出的界来对引理一中的式 求值。对情况 1 有

对情况 2 有

对情况 3 有

‘叁’ 最近打算看算法导论,在如何看方面有什么好的建议

算法导论,不适合入门,建议有数据结构和高等数学基础再读
这书上面有些内容太难了,刚开始不适合全看,挑些自己能看懂的来学。
很适合算法初学者体会算法的魅力.这本书讲解的很全面.算法都用伪码实现.对编程语言要求不高.书的前几章是一些数学和概率基础和算法分析的一些说明.后面几章是一些算法的描述.对NP问题感兴趣的话.可以看看这本书的VII部分中的NP-Completeness.我觉得这本书比较好的一部分是它的附录部分.对前面的一些背景知识公式进行了详细的阐述和证明以及一些专有名词进行了索引方便检索.这本书在国内目前只有英文版的.但南大有个中文版的(不过他们太无耻了居然说是他们自己编着)我看了那个版本的.其实是第一版的中文翻译叫<现代计算机常用数据结构和算法>.其他的我想我不需要多说了.有兴趣的可以去体会一下,

‘肆’ 《算法导论》与《算法设计》选择哪本更好

总的来说,两本各有所长,建议可以都涉及涉及一下,然后根据自己重点学习哪个。另外我觉得想自学算法,我认为吧,就是看学写无数算法,然后就可以信手拈来的自己去写。同时如果自学算法,我的建议是最好是多思考多动手(可以结合现实当中的各种程序算法,想一下他们怎么用算法写出来的,就比如饭堂里刷卡算钱等等。。如何用算法做到的。。),这样自学就很有意义了。

‘伍’ 问下,算法导论是看英文版还是中文版的好如果英文版的话哪里能买到,亚马逊和京东似乎都没有

建议读中文的。
分析:
1.《算法导论》是一本可谓“面面俱到”的书,其中对算法的证明占了很大的比重,这在一般的算法书中并不多见,也是它严谨性的体现。中英文在理解上的区别也就在于如何引出这个算法、算法为什么正确上。但是这些证明虽然有重要意义,但是在实用价值上一般比不上算法本身。我自己在学习算法的时候都是先了解算法思想,再了解算法执行过程,再记住代码,然后做题,最后再来回顾导引和证明,即先知其然,再知其所以然。不能光知其然,那样无法掌握思想,思想才是精髓;而一上来就直奔证明,又缺乏学习效率。(也可能这只是我个人的特点)就算法执行过程本身,中英文都一样,而且由于伪代码本身并无区别,所以先读中文,以掌握算法。
2.当参加国际比赛的时候,题目都是用英文描述;当对算法的研究再上一个层次的时候,国内的译材已经不能够满足学习需要了。要想进步,达到高层次的领域,实现“出色”和“领先”,就一定要大量研读外国文献。这要求英语必须要好。
综上,我的建议是:读中文版《算法导论》,掌握算法,再看解释,理解它,才能更好地运用。学好英语,为达到更高的层次做准备。《算法导论》内容非常丰富,应该读好几遍,到时候再看英文的也不迟。

‘陆’ 学习数据结构,有哪些值得推荐的好书

作者:向小刚
链接:https://www.hu.com/question/19987046/answer/13945644
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1. CLRS 算法导论
算法网络全书,只做了前面十几章的习题,便感觉受益无穷。
2. Algorithms 算法概论
短小精悍,别据一格,准经典之作。一个坏消息: 同算法导论,该书没有习题答案。好消息:习题很经典,难度也适中,只需花点点时间自己也都能做出来。不好也不坏的消息:我正在写习题的答案,已完成前三章,还剩九章约二百道题,顺利的话二个月之后发布。另有中文版名《算法概论》,我没看过,不知道翻译得怎么样。如果有心的话,还是尽量看原版吧,其实看原版与看中文版花费时间不会相差很大,因为大部分时间其实都花费在做习题上了。
dr. dobb's essential books on Algorithm and daba structure
3. Algorithm Design 算法设计
很经典的一本书,很久之前看的,遗憾的是现在除了就记得它很经典之外其它都忘光了。
4. SICP 计算机程序的构造和解释
六星之书无需多言,虽然这不是一本讲算法的书,但看完此书有助于你更深入的理解什么是递归。我一直很强调习题,看完此书后你至少应该做完前四章的太部分习题。否则那是你的遗憾,也是作者的遗憾。
5. Concrete Mathematics 具体数学
有人说看TAOCP之前应该先弄清楚这本书的内容,要真是如此的话那我恐怕是看不到TAOCP了。零零碎碎的看了一大半,很多东西都没有时间来好好消化。如果你是刚进大学不久的本科生,有着大把的可自由支配时间,那你幸运又幸福了,花上几个月时间好好的读一下此书吧,收获绝对大于你的期望值。
6. Introction to The Design and Analysis of Algorithms 算法设计与分析基础
很有趣的一本算法书,有许多在别的书上找不到的趣题,看完此书绝对能让你大开眼界,实在是一本居家旅行,面试装逼的必备佳作。
7. 编程之美--微软技术面试心得
虽说是一本面试书,但如果把前面十几页扯掉的话,我更愿意把它看作是一本讲解题思维的算法小品。在书中,作者通常是给出一个平常解法,然后再一次又一次的优化改进,你可以很清楚的看到基本的算法设计思想是如何得到运用以解决实际问题的。如果你已经有了一些算法的基础,看完本书应该能使你的算法应用能力得到一定的提高。另外,本书生动有趣,也同样适合于初学者。
8. Fundamentals of Algorithmics 算法基础
也是很久之前在学校图书馆借来看的,内容记不太清楚了,只隐约记得此书的动态规划章节犹为出彩。应该是很经典的一本书,个人以为足以和算法导论等所谓当世经典平分秋色,但是怎么好像被人提到的不多,或许是我孤陋寡闻了。
9. How to solve it 怎样解题
二十世纪最伟大的数学思想家之一波利亚的力作,讲一般性的解题方法:怎么认识问题,怎么转换问题,怎么解决问题,如何在问题中得到启发,如何找到一个通往答案的方向。
10. Programming interviews exposed 程序员面试攻略
一本消遣之作。个人以为要比国内的某“XXX面试宝典”纯粹一些,至少也有一些启发性的内容,而不单单是面试题解库。
11. Programming Pearls 编程珠玑
学习算法不仅需要像Alogrithms,算法导论这样的重量级的内功心法,像《编程之美》、《编程珠玑》这样的轻量级的轻功身法也必不可少。前些年网上不是很流行像“给你10亿个数,找到最大的n个”或者“给你10亿个数,找出现次数最多的那个数”之类的网络面试题吗?看了此书你就知道怎么解决了。相比于《编程之美》来说,本书中的示例技巧性略低一些,但是也更有实际应用价值一些。
12. 算法艺术与信息学竞赛
如果算法导论是九阳神功,那这本无疑就是九阴真经。本书是专为参加一些诸如ACM之类程序设计比赛的同学而写的,江湖人称“黑书”。里面讲的都是一些在编程比赛中常用的算法、数据结构,以及一些数论和计算几何等。我虽然并不搞竞赛,但也从此书中受益颇多。
13. An Introction to Probability Theory and Its Applications
准备看的,现在才发现概率论有多么重要,可惜本科的时候没有好好学。前不久一个同学问我个问题,我半天弄了一个程序给他,他说:这里就不是相关系数么,Excel一下就完事!我晕,我还真不知道那就是相关系数。
14. Numerical Analysis
这本的作者是Richard L. Burden,J. Douglas Faires
数值分析,讨论各种数值算法,比如插值、拟合、积分、微分方程的求解、线性和非线性方程组求解等。准备详细看。
15. TAOCP 计算机程序设计艺术
传说中的TAOCP,说的人多,看的人少。TAOCP四卷堪称是算法藏经阁中的易筋经或者是少林七十二绝技。天下武学,尽出少林,天下算法,尽出TAOCP也。

热点内容
安卓wifi路由器在哪里看 发布:2025-03-10 15:47:09 浏览:268
id密码怎么设置密码 发布:2025-03-10 15:26:02 浏览:88
linux打开终端怎么更改配置文件 发布:2025-03-10 15:17:38 浏览:319
抽象接口php 发布:2025-03-10 15:09:14 浏览:805
tomcat配置ip地址访问 发布:2025-03-10 14:54:54 浏览:689
注册淘宝密码多少 发布:2025-03-10 14:49:03 浏览:558
文件上传设备 发布:2025-03-10 14:47:47 浏览:498
江西l2tp服务器托管云服务器 发布:2025-03-10 14:47:38 浏览:886
微信如何给钱包设置手势密码 发布:2025-03-10 14:46:55 浏览:229
江苏服务器如何 发布:2025-03-10 14:46:17 浏览:180