导航:首页 > 源码编译 > 算法设计是怎么回事

算法设计是怎么回事

发布时间:2022-04-28 19:09:27

① 如何设计算法

设计一个正确的算法是一件困难的工作,因为它需要创新,从以太真空中发掘出一个解方案来解决问题。算法设计比对现有的方案进行改良要难得多,因为算法设计的可选择空间太,过多的自由反而成了一种约束。 This book is designed to make you a better algorithm designer. The techniques presented in Part I of this book provide the basic ideas underlying all combinatorial algorithms. The problem catalog of Part II will help you with modeling your application and point you in the right direction of an algorithm or implementation. However, being a successful algorithm designer requires more than book knowledge; it requires a certain attitude, the right problem-solving approach. It is difficult to teach this mindset in a book; yet getting it is essential to become a successful designer. 本书的设计目标是让你成为一个更好的算法设计者。本书第一部分展示有关组合算法的基本原理和基本思想;第二部分的问题清单帮助你为你的问题建模,并且为你指明实现正确算法的方向。尽管如此,要成为一个成功的算法设计者光有书本知识是不够的,面对问题的态度(attitude)和选择正确的方法更重要。书本容易传授知识,很难传授人的心态(mindset)和思考方式;而这种心态和思考却是成为成功的算法设计者的根本条件。 The key to algorithm design (or any other problem-solving task) is to proceed by asking yourself a sequence of questions to guide your thought process. What if we do this? What if we do that? Should you get stuck on the problem, the best thing to do is move onto the next question. In any group brainstorming session, the most useful person in the room is the one who keeps asking, ``Why can't we do it this way?'' not the person who later tells them why. Because eventually she will stumble on an approach that can't be shot down. 算法设计(或其它问题解决任务)的关键是一系列持续的自我反问,这些反问引导我们思维的前进。“如果这样做会怎样?”,“如果那样做又会怎样?”……如果 你被一个问题掐住了,最好的办法就是先搁一下,换一个问题换一个前进的方向试试。在每组头脑风暴会议中,最有价值的人是不断提出为什么的人,不是尔后解说为什么的人。因为我们常常被一些习以为常的东西所拌倒,掉进自己设置的陷阱。 kemin:如果问题解决是一种思考过程,那么思考的形式(过程的严谨性、细致性和正确性)很重要,而思考的内容也不容忽视。因为引导我们思考前进的方式 除反问本身外,反问的内容也很重。就比如参加头脑风暴的材料一样。人大脑的思维功能是硬编码的,人与人之间没有思维规律——质的区别,只是思维的清晰度和 灵敏度——量的差别。人与人之间智力的差别更多体现在思维内容的量上,体现在对外部世界的事实掌握的广度和深度上。 Towards this end, we provide below a sequence of questions to guide your search for the right algorithm for your problem. To use it effectively, you must not only ask the questions, but answer them. The key is working through the answers carefully, by writing them down in a log. The correct answer to, ``Can I do it this way?'' is never ``no,'' but ``no, because ....'' By clearly articulating(明确有力地表达) your reasoning as to why something doesn't work, you can check if it really holds up or whether you have just glossed(掩盖) over a possibility that you didn't want to think hard enough about. You will be surprised how often the reason you can't find a convincing(使人信服的) explanation for something is because your conclusion is wrong. 在末尾我们提供一个反问问题的列表,你不但要反问自己这些问题,更重要是仔细回答这些问题,最好把答案写下来。回答诸如问题“我可以使用这种方式吗?”的 不是一个“不能”就完了,而是“不能,因为……”。通过仔细明确的回答“为什么不能”时,你会发现到底是“真的不能“,还是只是你自己不愿意去深入思考掩 盖了”能“。如果你不曾训练出严谨的思考方式,当你这样做时你会惊讶的发现,为了说明某些东西但却找不到一个令人信服的解释的原因常常是因为你的结论本身 是错的。 An important distinction to keep aware of ring any design process is the difference between strategy and tactics(战略). Strategy represents the quest for the big picture, the framework around which we construct our path to the goal. Tactics are used to win the minor battles we must fight along the way. In problem solving, it is important to check repeatedly whether you are thinking on the right level. If you do not have a global strategy of how you are going to attack your problem, it is pointless to worry about the tactics. 在设计过程中特别重要区分策略和战略的概念。策略是对全局的一个探索,一个构筑通向目标路径的指导框架。战略则是用来解决通向大目标过程的较小的问题。如果你对关于如何对付所面临的问题没有一个全局的策略,那关心战略是不得要领的,予事无补的。在解题领域,不断修正思维的层次(thinking on the right level)是很重要战略。(--莱布尼兹曾经将人的解题思考过程比喻成晃筛子,把脑袋里面的东西都给抖落出来,然后正在搜索的注意力会抓住一切细微的、与问题有关的东西。事实上,要做到能够令注意力抓住这些有关的东西,就必须时刻将问题放在注意力层面,否则即使关键的东西抖落出来了也可能没注意到。) An example of a strategic question is, ``How best can I model my application as a graph algorithm problem?'' A tactical question might be, ``Should I use an adjacency邻接 list or adjacency matrix data structure to represent my graph?'' Of course, such tactical decisions are critical to the ultimate quality of the solution, but they can be properly evaluated only in light of a successful strategy. 一个策略问题的例子是:“我如何才能更好地把我的问题建模成图问题?”。而一个战略问题可能是这样:“我是用邻接列表还是邻接矩阵来实现我的图结构?”。当然,这种战略选择是对解决方案的最终质量起着重要作用;不过战略价值的体现还是基于正确的策略的选择。 When faced with a design problem, too many people freeze up in their thinking. After reading or hearing the problem, they sit down and realize that they don't know what to do next. They stare(凝视) into space, then panic(惊惶), and finally end up settling(沉淀; 决定) for the first thing that comes to mind. Avoid this fate(天数; 运气; 命运 ). Follow the sequence of questions provided below and in most of the catalog problem sections. We'll tell you what to do next! 初学者在面对问题时常常表现出思维凝滞、手足无措和盲目解题。参考以下的反问问题列表和本书的问题清单,我们告诉你应该怎么做。 Obviously, the more experience you have with algorithm design techniques such as dynamic programming, graph algorithms, intractability, and data structures, the more successful you will be at working through the list of questions. Part I of this book has been designed to strengthen this technical background. However, it pays to work through these questions regardless of how strong your technical skills are. The earliest and most important questions on the list focus on obtaining a detailed understanding of the problem and do not require specific expertise. 当然本反问问题列表对读者有背景要求,要求读者对算法设计技术(动态规划、图算法、难解性和数据结构)的熟悉程度。本书第一部分的目标就是对这些技术背景进行强化。不过,不管你的技术背景怎样,通读这些问题对你解题还是很有裨益的。

② 算法的概念

算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法+数据结构=程序,求解一个给定的可计算或可解的问题,不同的人可以编写出不同的程序,来解决同一个问题,这里存在两个问题:一是与计算方法密切相关的算法问题;二是程序设计的技术问题。算法和程序之间存在密切的关系。
算法是一组有穷的规则,它们规定了解决某一特定类型问题的一系列运算,是对解题方案的准确与完整的描述。制定一个算法,一般要经过设计、确认、分析、编码、测试、调试、计时等阶段。
对算法的学习包括五个方面的内容:① 设计算法。算法设计工作是不可能完全自动化的,应学习了解已经被实践证明是有用的一些基本的算法设计方法,这些基本的设计方法不仅适用于计算机科学,而且适用于电气工程、运筹学等领域;② 表示算法。描述算法的方法有多种形式,例如自然语言和算法语言,各自有适用的环境和特点;③确认算法。算法确认的目的是使人们确信这一算法能够正确无误地工作,即该算法具有可计算性。正确的算法用计算机算法语言描述,构成计算机程序,计算机程序在计算机上运行,得到算法运算的结果;④ 分析算法。算法分析是对一个算法需要多少计算时间和存储空间作定量的分析。分析算法可以预测这一算法适合在什么样的环境中有效地运行,对解决同一问题的不同算法的有效性作出比较;⑤ 验证算法。用计算机语言描述的算法是否可计算、有效合理,须对程序进行测试,测试程序的工作由调试和作时空分布图组成。

③ 算法设计原则是什么

原则:首先说设计的算法必须是"正确的",其次应有很好的"可读性",还必须具有"健壮性",最后应考虑所设计的算法具有"高效率与低存储量"。

所谓算法是正确的,除了应该满足算法说明中写明的"功能"之外,应对各组典型的带有苛刻条件的输入数据得出正确的结果。

在算法是正确的前提下,算法的可读性是摆在第一位的,这在当今大型软件需要多人合作完成的环境下是换重要的,另一方面,晦涩难读的程序易于隐藏错误而难以调试。算法的效率指的是算法的执行时间,算法的存储量指的是算法执行过程中所需最大存储空间。

算法是程序设计的另一个不可缺的要素,因此在讨论数据结构的同时免不了要讨论相应的算法。这里有两重意思,即算法中的操作步骤为有限个,且每个步骤都能在有限时间内完成。

确定性表现在对算法中每一步的描述都没有二义性,只要输入相同,初始状态相同,则无论执行多少遍,所得结果都应该相同。

可行性指的是,序列中的每个操作都是可以简单完成的,其本身不存在算法问题,例如,"求x和y的公因子"就不够基本。

输入值即为算法的操作对象,但操作的对象也可以由算法自身生成,如"求100以内的素数",操作对象是自然数列,可以由变量逐个增1生成。

算法的健壮性指的是,算法应对非法输入的数据作出恰当反映或进行相应处理,一般情况下,应向调用它的函数返回一个表示错误或错误性质的值。

④ 算法设计的过程一般是什么样子 算法设计的过程一般是那几步

和你做数学题目的过程一样,已知条件是什么?已知量是什么?要求什么?需要输出一个什么结果?
算法设计就是把问题解决步骤用计算机编程语言来表示出来

⑤ 鸡兔同笼数学建模及算法设计是什么

这是一节数学课,教案设计如下:

“鸡兔同笼”问题出现在五年级上册,它是我国古代数学名着《孙子算经》中的记载的一道题。原题是:“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?”根据这道数学题,编者化“难”为“简”。

把大一些的数字化成小一些的数字,作为第一道例题出现在教材中,即鸡兔同笼,有9个头,26条腿,鸡、兔各有几只?在解决了这个问题之后,教材出示了《孙子算经》中的问题,这样由简入繁,符合学生的认知规律。

“鸡兔同笼”的解题方法很多,其中也渗透着很多的数学思想方法。比如教材中提供的列表的方法就渗透着列举和猜想的思想方法;画图的方法渗透着假设的数学思想方法。由列举和画图的解题过程可以归纳出解决此类问题的数学模型,同时渗透了数学的模型思想;还可以运用方程来解决这类问题,则渗透着代数的思想方法。

在课堂中,我重点和学生讨论了列表的方法。在教学中把这些数学思想方法联系起来看,结合起来用,建立数学模型。让学生在解决问题的过程中体会建模的过程。

一、出示问题,明确题意。

课堂上,我先出示《孙子算经》中的“鸡兔同笼”问题,引导学生理解题意,明确题目的意思。而后,组织学生讨论如何解决这个问题.在讨论交流中,明确解决比较复杂的问题的一般路径:可以先从简单问题入手,寻找规律,再解决较复杂的问题。

接着,我出示了本节课的第一道例题“鸡兔同笼,有9个头,26条腿。鸡兔各有几只?”在数量上明显比原先小了很多,解决起来自然也就容易一些。

从而让我学生感觉到:在解决数字比较大的问题的时候,就可以把数字变小,化繁为简,解决起来就会容易很多。与此同时,转化的思想便开始萌芽。

二、独立思考,小组交流。

面对这个问题,我让学生思考。猜测一下,可以用什么办法来解决。学生会根据已有的租车问题的经验想到列表法,或根据学过的用方程来解决这个问题,或运用假设的方法来解决这个问题。有了方法,我便给学生几分钟独立思考的时间。

让他们理清解决问题的思路,再小组交流。我觉得,小组交流建立在学习小组的每个成员独立思考的基础上,这样的交流才是有效的。

三、全班交流,建立模型。

小组成员交流完毕后,我让学生静下来,再交流的基础上整理好自己的思路,并练习讲一讲。这样可以给学生充分的准备,才能在全班交流中产生高效的结果。

接着学生来汇报自己的想法,在汇报中,学生分别采用了不同的方法。我们共同归纳,给这些方法分别起了名字:列表法,代数法,假设法,画图法,抬脚法。

方法很多,但每一种方法中都蕴含着一个规律——当鸡的只数每减少1只,兔的只数每增加1只,脚的只数就会增加2只。由此规律,学生不难总结出一个数学模型,就是鸡的只数=(头的总数×4-脚的总只数)÷(4-2)。整个建模的过程,学生都在参与着,在参与中渐渐学会这种数学思想。

⑥ 算法设计

第5章:常用算法设计(软件设计篇)免费下载

链接:https://pan..com/s/1EsbJAHii_AXsOL6JuSnRHw

提取码:vwj2

《算法设计》是2007年清华大学出版社出版发行的图书,作者是Jon Kleinberg / Éva Tardos。

⑦ 《算法设计与分析》是学什么的和《数据结构》一样吗谢谢!

三者都不一样

通俗点说,算法就是解决问题的方法,因为和计算密切相关,所以不交方法,叫算法
数据结构是数据的组织方式。
算法通过操作和处理数据来解决问题,所以算法和数据结构是不分家的!

而计算方法是另一门课程。基本上是存数学的东西,看这里http://ke..com/view/754503.htm?fr=ala0_1_1

⑧ 算法设计和编码之间的区别是什么哪种更难

算法设计更难,编码只是根据算法的伪代码去实现算法。需要一些写代码的功底。
算法设计更注重的是想法。基本上算法设计出来了,写程序就不难了。
算法设计的工资比编码的工资高得多,一个高中生就能编码了。
在印度,程序员基本上是高中生。而中国的计算机本科生出来基本上做了程序员。

⑨ 算法设计的过程一般是什么样子

您好,楼主
算法设计就是把问题的解决步骤通过计算机编程语言来实现。
大概步骤如下:
1.分析问题:输入什么/输出什么/条件什么/能用什么方法
2.用流程图画出解决方案:决定程序的结构(有三大结构:顺序结构、判断结构、循环结构)
3.算法设计:常见的算法设计方法有:穷举法/迭代法/递推法/递归法/回溯法/贪婪法/分治法。
4.程序设计:这个就需要变成语言来实现的。

⑩ 影响算法设计的因素有哪些

影响算法设计的有以下因素:

针对机器:空间复杂性和时间复杂性。

针对程序员:算法表达和实现的简单性。

针对问题:算法对问题及问题输入规模的普适性。

影响算法效率的因素

1、从大的方面来讲,所选择的语言对算法的效率影响很大。一般来说,使用越高级的语言所需要的时间和空间就越大。另外,不同编译器产生的代码质量不同,这对算法的效率也会有影响。

2、存储结构

数据的存储结构,分为顺序存储结构和链式存储结构。顺序存储结构的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;链式存储结构则是借助指示元素存储地址的指针表示数据元素之间的逻辑关系。不同的问题求解选用不同的存储结构。

3、指针操作

在使用指针时,指针的有秩序扫描非常重要。例如在模式匹配中,如果直接进行匹配,当有不完全匹配时,主串的指针需要回溯。

在KMP算法中,我们先可以求出每个元素的next函数值,从而在发生不完全匹配时,主串的指针不必要回溯,只需要模式串的元素回到当前元素的next函数值所指的元素再进行匹配即可。当主串和模式串有很多不完全匹配时,KMP算法可以大大提高效率。

4、查找的效率

有很多快速查找的算法都可以提高查找的效率,如建立索引,折半查找等,都是在记录和关键字之间进行比较,从而寻求关系。这一类查找建立在比较的基础之上。查找的效率依赖于查找过程中所进行的比较次数。

在哈希表中,使得记录的存储位置和关键字之间建立一个确定的存储关系,因而在查找时,只需要根据这个对应的关系f 找到给定值K 的像f(k)。用这个思想建立哈希表。如在基因组匹配时,用哈希表非常方便。

5、数据类型的选择

数据类型的选择也会影响算法效率,在对时间和空间要求非常严格时,尽可能的使用占用空间较小的数据类型。使用动态开辟空间会使得效率降低,所有在能确定或估计出需要的空间大小的情况下尽量使用静态数字。个人觉得用vector虽然方便,但是效率并不高。

6、存储方式

用堆操作还是用栈操作,对于不同的问题需要仔细选择。在串和队列的有关操作中用堆操作合适,在树的操作中用栈操作合适,如建立二叉树中序遍历的递归算法或非递归算法,用栈操作好。

阅读全文

与算法设计是怎么回事相关的资料

热点内容
pgp基于什么体系加密 浏览:633
python合法赋值语句格式 浏览:709
程序员数学线性代数 浏览:622
看帧率app如何使用 浏览:523
从DHC服务器租用IP地址 浏览:473
编译怎么学 浏览:329
数码管显示0到9plc编程 浏览:665
服务器是为什么服务的 浏览:765
java定义数据类型 浏览:874
安卓pdf手写 浏览:427
什么是app开发者 浏览:284
android闹钟重启 浏览:101
程序员失职 浏览:520
在云服务器怎么改密码 浏览:588
服务器pb什么意思 浏览:942
51驾驶员的是什么app 浏览:672
php静态变量销毁 浏览:890
编程买苹果电脑 浏览:764
flac算法 浏览:501
reactnative与android 浏览:665