当前位置:首页 » 操作系统 » 算法类论文

算法类论文

发布时间: 2022-05-24 20:21:29

A. 算法与程序设计论文3000字

1、论点(证明什么)论点应该是作者看法的完整表述,在形式上是个完整的简洁明确的句子。从全文看,它必能统摄全文。表述形式往往是个表示肯定或否定的判断句,是明确的表态性的句子。
A.把握文章的论点。 中心论点只有一个(统率分论点)⑴明确:分论点可以有N个(补充和证明中心论点)
⑵方法①从位置上找:如标题、开篇、中间、结尾。②分析文章的论据。(可用于检验预想的论点是否恰当)③摘录法(只有分论点,而无中心论点)
B.分析论点是怎样提出的:①摆事实讲道理后归结论点;②开门见山,提出中心论点;③针对生活中存在的现象,提出论题,通过分析论述,归结出中心论点;④叙述作者的一段经历后,归结出中心论点;⑤作者从故事中提出问题,然后一步步分析推论,最后得出结论,提出中心论点。
2、论据(用什么证明)⑴论据的类型:①事实论据(举例后要总结,概述论据要紧扣论点);②道理论据(引用名言要分析)。
⑵论据要真实、可靠,典型(学科、国别、古今等)。⑶次序安排(照应论点);⑷判断论据能否证明论点;⑸补充论据(要能证明论点)。
3、论证(怎样证明)
⑴论证方法 (须为四个字)①举例论证(例证法)事实论据记叙②道理论证(引证法和说理)道理论据 议论
③对比论证(其本身也可以是举例论证和道理论证)④比喻论证 比喻在说明文中为打比方,散文中为比喻。
⑵分析论证过程:①论点是怎样提出的;②论点是怎样被证明的(用了哪些道理和事实,是否有正反两面的分析说理);③联系全文的结构,是否有总结。
⑶论证的完整性(答:使论证更加全面完整,避免产生误解)
⑷分析论证的作用:证明该段的论点。
4、议论文的结构⑴一般形式:①引论(提出问题)―――②本论(分析问题)―――③结论(解决问题)。
⑵类型:①并列式②总分总式③总分式④分总式⑤递进式。
6、驳论文的阅读
⑴作者要批驳的错误观点是什么?
⑵作者是怎样进行批驳的,用了哪些道理和论据;
⑶由此,作者树立的正确的观点是什么?

B. 算法类的论文都能发在哪些的SCI检索期刊

国内检索的就知网吧,是最权威的,但是知网也有省级国家级的期刊论文的。看你具体是要找什么样子的期刊或者论文,数据库不单一收录期刊的。论文发表有问题可以找原上草论文了解。

C. 计算机类论文怎么写

作为一个着重研究信息系统开发、应用的专业,计算机毕业论文的写作应该更贴合实际出来,可能有很多刚拿到题目的学生不知道改如何着手,下面我们就来了解一下计算机毕业论文怎么写?

一、计算机毕业论文的写作方法

1、前言部分

前言部分也常用"引论"、"概论"、"问题背景"等做标题,在这部分中,主要介绍论文的选题。

首先要阐明选题的背景和选题的意义。选题需强调实际背景,说明在计算机研究中或部门信息化建设、企业管理现代化等工作中引发该问题的原因,问题出现的环境和条件,解决该问题后能起什么作用。结合问题背景的阐述,要使读者感受到此选题确有实用价值和学术价值,因而有研究和开发的必要性。

前言部分常起到画龙点睛的作用。选题实际又有新意,表明作者的研究方向正确,设计开发工作有价值。对一篇论文来说,前言写好了,就会吸引读者,使他们对作者的选题感兴趣,愿意进一步了解作者的工作成果。



2、综述部分

任何一个课题的研究或开发都是有学科基础或技术基础的。综述部分主要阐述选题在相应学科领域中的发展进程和研究方向,特别是近年来的发展趋势和最新成果。通过与中外研究成果的比较和评论,说明自己的选题是符合当前的研究方向并有所进展,或采用了当前的最新技术并有所改进,目的是使读者进一步了解选题的意义。

综述部分能反映出毕业设计学生多方面的能力。首先是结合课题任务独立查阅中外文献资料的能力,通过查阅文献资料,收集各种信息,了解同行的研究水平,在工作和论文中有效地运用文献,这不仅能避免简单的重复研究,而且也能使论文工作有一个高起点。

其次,还能反映出综合分析的能力。从大量的文献中找到可以借鉴和参考的信息,这不仅要有一定的专业知识水平,还要有一定的综合能力。对同行研究成果是否能抓住要点,优缺点的评述是否符合实际,恰到好处,这和一个人的分析理解能力是有关的。

值得注意的是,要做好一篇毕业论文,必须阅读一定量(2~3篇)的近期外文资料,这不仅反映自己的外文阅读能力,而且有助于体现论文的先进性。

3、方案论证

在明确了所要解决的问题和课题综述后,很自然地就要提出自己解决问题的思路和方案。在写作方法上,一是要通过比较,显示自己方案的价值,二是让读者了解方案的独到之处或有创新点的思路、算法和关键技术。

在与文献资料中的方案进行比较时,首先要阐述自己的设计方案,说明为什么要选择或设计这样的方案,前面评述的优点在此方案中如何体现,不足之处又是如何得到了克服,最后完成的工作能达到什么性能水平,有什么创新之处(或有新意)。如果自己的题目是总方案的一部分,一定要明确说明自己承担的部分,以及对整个任务的贡献。

4、论文主体

在这部分中,要将整个研究开发工作的内容,包括理论分析、总体设计、模块划分、实现方法等进行详细的论述。论文主体部分要占4/5左右。主体部分的写法,视选题的不同可以多样,研究型论文和应用开发型论文的写法就有明显的不同。

研究型的论文,主体部分一般应包括:理论基础,数学模型,算法推导,形式化描述,求解方法,软硬件系统的实现及调试,测试数据的分析及结论。

要强调的是,研究型论文绝不是从推理到推理的空洞文章。研究型论文也应有实际背景,也应有到企业和实际部门调研的过程,并在实际调查研究中获取信息,发现问题,收集数据和资料。在研究分析的基础上,提出解决实际问题的、富有创建性的结论。

应用开发型的论文,主体部分应包括:总体设计,模块划分,算法描述,编程模型,数据结构,实现技术,实例测试及性能分析。

以上内容根据任务所处的阶段不同,可以有所侧重。在整个任务初期的论文,可侧重于研究与设计,在任务后期的论文可侧重于实现与应用。但作为一篇完整的论文应让读者从课题的原理设计,问题的解决方法,关键技术以及性能测试都有全面的了解,以便能准确地评判论文的质量。

论文主体部分的内容一般要分成几个章节来描述。在写作上,除了用文字描述外,还要善于利用各种原理图、流程图、表格、曲线等来说明问题,一篇条理清晰,图文并茂的论文才是一篇好的论文。

5、测试及性能分析

对理工专业的毕业设计论文,测试数据是性能评价的基础,必须真实可靠。通过测试数据,论文工作的成效可一目了然。根据课题的要求,可以在实验室环境下测试,也可以在工作现场测试。

在论文中,要将测试时的环境和条件列出,因为任何测试数据都与测试环境和条件相关,不说明测试条件的数据是不可比的,因此也是无意义的。

测试一般包括功能测试和性能测试。功能测试是将课题完成的计算机软硬件系统(子系统)或应用系统所要求达到的功能逐一进行测试。性能测试一般是在系统(子系统)的运行状态下,记录实例运行的数据,然后,归纳和计算这些数据,以此来分析系统运行的性能。

测试实例可以自己设计编写,也可以选择学科领域内公认的、有一定权威性的测试实例或测试集。原则是通过所选择(设计)的实例的运行,既能准确反映系统运行的功能和性能,与同类系统又有可比性。只有这样,论文最后为自己工作所做的结论才有说服力。

6、结束语

这一节篇幅不大,首先对整个论文工作做一个简单小结,然后将自己在研究开发工作中所做的贡献,或独立研究的成果列举出来,再对自己工作的进展、水平做一个实事求是的评论。但在用"首次提出"、"重大突破"、"重要价值"等自我评语时要慎重。

7、后记

在后记中,主要表达对导师和其他有关教师和同学的感谢之意。对此,仍要实事求是,过分的颂扬反而会带来消极影响。这一节也可用"致谢"做标题。

8、参考文献

中外文的参考文献应按照规范列举在论文最后。这一部分的编写反映作者的学术作风。编写参考文献要注意:(1)要严格按照规范编写,特别是外文文献,不要漏写、错写;(2)论文内容和参考文献要前后对应,正文中凡引用参考文献的地方应加注;(3)列出的文献资料应与论文课题相关,无关的文献只会使读者感到作者的研究目标很分散;(4)选择的参考文献应主要是近期的。

二、计算机写作注意事项

1、设计(论文)题目:按照小题目。封面XXXXX学院毕业设计(论文)、 届 分院(系)

2、摘要:不要主语,英文中无法表达时可用被动语态

3、关键词:体现设计(论文)主要工作的词语

4、目录:自动生成,1.1.1的格式,最多到1.1.1.1 5、正文中文献引用要客观,别人的成果要说明,不要据为己有;自己的成果要突出。不清楚的图必须修改(可用word画或者AutoCAD画),表格尽量采用三线表

6、参考文献:至少要有两篇英文文献

7、致谢(不是致辞)

8、附录(若多于一个附录,可用附录一、附录二,……)

9、各部分格式要求,严格按照毕业设计手册执行

三、计算机论文编辑技巧

1、文档结构图的妙用 格式修改时可先将全文设置为正文格式(新罗马与宋体的博弈),然后将三级标题以上标题按照三级标题提出来,再将二级标题以上标题按照二级标题提出来,最后将一级标题提出来。提出标题时注意使用大纲级别。 提出大纲级别后,可用文档结构图轻松导航文档。还可自动生成目录(插入-引用-索引和目录-目录)。

2、图的裁剪与组合(建议采用浮于文字上方的方式)、文本框的妙用、公式的编辑(变量用斜体、下标用的i、j、k用斜体,其余用正体。公式中出现汉字怎么办?用拼音加加输入法输入汉字)

3、表格的编辑

4、上下标的使用(自定义word菜单)

5、分节符的使用

6、目录自动生成(页码的问题),目录可单独取文件名(写字板的运用),也可放到正文前面

7、样式与格式的自动更新功能

8、页眉设置(去掉横线)

9、文档的备份(防止病毒感染、U盘丢失、计算机故障)

D. 如何在半个月内发表至少两篇计算机算法类论文,有没有什么推荐的

你好,你是要发表学术论文?时间紧张,可以考虑发表《信息与电脑》杂志《计算机关盘软硬与应用》杂志 但是半月之内 肯定是拿不到书的,最起码的等两个月左右。

E. 有哪些计算机算法技术领域的论文资料

计算机学术论文是学术论文的一种。计算机学术论文的一般格局是:
(一)题目。题目是论文的窗户,它应是论文内容的高度概括。好的论文题目能大体反映出作者研究的方向、成果、内容、意义。题目引用语要确切、简洁、精炼、通俗和新颖。确定题目时,题目要专一,开掘要透,道理要深,立意要新。
(二)内容提要。就是将文章的主要内容简要地概括出来,使读者了解论文概貌,以确定其有无阅读价值。提要以二三百字为宜,不要过长。一般较短的论文(三千字以下)可不写提要。
(三)绪论(引论、引言、前言、序言)。概述研究该课题的动机,目的、意义和主要方法,指出前人或旁人做了哪些工作,进展到何种程度,哪些尚未解决,说明自己研究这个问题的主要成果和贡献。这部分占比例要小,起简介作用。文字要简洁、明确、具体,使人看到绪论,就知道本文的基本价值。
(四)本论(正文)。这部分占论文的绝大部分篇幅,具有极其重要的地位,是作者表达研究成果的部分。这部分的关键在于论证,即证明作者所提出的论题。这里包括课题的提出,对解决问题的设想、研究过程(研究中出现的问题及解决问题的方法。手段、主要数据)、研究结果等。写这部分要注意理论的运用和逻辑推理,注意段与段之间的过渡衔接,注意主次,抓住本质。如果内容多,可加小标题。也可使用由大到小的不同序码。
(五)结论。是整个研究的结晶,是论证得到的结果,即对本论进行分析、比较、归纳、综合、概括而得出的结论,审视整个课题的答案。写结论时,措词要严谨,逻辑要严密,文字要简明具体,使读者看到作者的独到见解。不得使用“大概”、“可能”之类含混不清的字眼。不能得出明确结论时,要说明有待进一步探讨。
(六)参考文献。在文章的最后注明写作论文时所参考的文献;引用别人原话或原文时还需注明出处,以便查找。这样做反映作者科学态度和求实精神,表示作者对他人成果的尊重。

F. 算法类论文一定要做实验吗

不一定非要用实验。
论文并不一定需要做实验来验证。但是,一定要有一定的依据和想法,只有这样才能够让人觉得这篇论文有一定的可行性,从而让别人认可和欣赏这篇论文。不然的话,既没有实验证实,也没有一定的依据,那写出来的论文,别人也是不会欣赏的。

G. 算法的应用类论文怎么写

参考各个排序算法的优缺点,即各种排序的计算复杂度,以及最好情况,最坏情况,平均情况下的分析吧。

H. 算法与程序设计论文2000字

数学上的算法已是头绪纷繁———加法,减法,乘法,除法,平方,开方,对数┉┉一连串的读下来,已经让人头痛,那人生呢?如果我再问你人生的算法是什么呢?
人生中种种悲欢离合,喜怒哀乐,复杂至极,但我始终认为,人生的算法应该是最基础最平实的加法,是我们每个人对于算法最初的映象,人生应该是一个加法算试。
做加法,需要我们向人生的算式中加入责任的数值,这是算式最基础的几个决定结果“份量”的大数字,你的人生会输出一个两位数,三位数还是四位数甚或以上的结果,决定于这个最“压秤”的数值。
5.12汶川大地震后,网上渐渐开始痛批“范跑跑”,这名“老师”在地震到来时抢先冲出教室不管学生安危的做法激起人们强烈的反感。而当他在网上颇有几分得意的宣扬那引人唾弃的“正常人都会这么做”理论时,在北川,一位悲恸的妇人正在丈夫灵堂上痛哭失“我听人说有个老师扑在四个学生身上……死了……我就想可能是你……”这两位老师,品行高下一望便知,他们人生的最后价值,取决于他们在算式中累加了多少责任,人民教师的职责的份量,使得一个人的生命重于泰山;而另一个,人生的结果只会约等于零。
做加法,还需要我们在算式中累加爱的数值。每一分每一秒的积累,在一个微笑,一次谅解,一个怀抱,一个亲吻里寻它的影子,为自己也为他人叠加爱的份量,那么到最后,当人生算法即将穷尽时,就一定可以得出爱的真谛与生的喜悦。
哪位先哲说过“无论什么样的爱,无论多么微小和难以察觉,都是伟大的。”在生命中积蕴爱的温暖,对爱人,对亲人,对朋友,乃至对每一朵漂亮的花儿,每一片金黄的叶,每一次的晨曦与晚霞。人生的算式,会有很大的变化,会有更美丽的过程与更深刻的结果。
做加法,不是让人生加上压力,金钱,权势这些“虚数”,而是去发现和探索生活的美好,去恪守和尊重自己的职责,去不断用真正的“实数”完善,填充这个算式,那么到生命的尽头,就会获得一个很重的结果和一个很轻很轻的美丽心灵。
请尝试着,在人生中做加法吧!那一个个不起眼的小小加号里,有最深刻的内含和最朴素的美丽。

I. 求算法相关的论文

史丰收计算法
演练实例一







Example
of
Rapid
Calculation
in
Practice
○史丰收速算法易学易用,算法是从高位数算起,记着史教授总结了的26句口诀(这些口诀不需死背,而是合乎科学规律,相互连系),用来表示一位数乘多位数的进位规律,掌握了这些口诀和一些具体法则,就能快速进行加、减、乘、除、乘方、开方、分数、函数、对数…等运算。
□本文针对乘法举例说明
○速算法和传统乘法一样,均需逐位地处理乘数的每位数字,我们把被乘数中正在处理的那个数位称为“本位”,而从本位右侧第一位到最末位所表示的数称“后位数”。本位被乘以后,只取乘积的个位数,此即“本个”,而本位的后位数与乘数相乘后要进位的数就是“后进”。
○乘积的每位数是由“本个加后进”和的个位数即--
□本位积=(本个十后进)之和的个位数
○那么我们演算时要由左而右地逐位求本个与后进,然后相加再取其个位数。现在,就以右例具体说明演算时的思维活动。
(例题)
被乘数首位前补0,列出算式:
0847536×2=1695072
乘数为2的进位规律是“2满5进1”
0×2本个0,后位8,后进1,得1
8×2本个6,后位4,不进,得6
4×2本个8,后位7,满5进1,
8十1得9
7×2本个4,后位5,满5进1,
4十1得5
5×2本个0,后位3不进,得0
3×2本个6,后位6,满5进1,
6十1得7
6×2本个2,无后位,得2
在此我们只举最简单的例子供读者参考,至于乘3、4……至乘9也均有一定的进位规律,限于篇幅,在此未能一一罗列。
“史丰收速算法”即以这些进位规律为基础,逐步发展而成,只要运用熟练,举凡加减乘除四则多位数运算,均可达到快速准确的目的。

J. 写一篇《论算法设计中的分治与增量》的学术论文1500字

一、动态规划的基本思想

在比较基本的算法设计思想里,动态规划是比较难于理解,难于抽象的一种,但是却又十分重要。动态规划的实质是分治思想和解决冗余,因此它与分治法和贪心法类似,它们都是将问题的实例分解为更小的、相似的子问题,但是动态规划又有自己的特点。

贪心法的当前选择可能要依赖于已经作出的选择,但不依赖于还未做出的选择和子问题,因此它的特征是由顶向下,一步一步地做出贪心选择,但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解。相比而言,动态规划则可以处理不具有贪心实质的问题。

在用分治法解决问题时,由于子问题的数目往往是问题规模的指数函数,因此对时间的消耗太大。动态规划的思想在于,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,如果我们能够保存已经解决的子问题的答案,而在需要的时候再找出已求得的答案,这样就可以避免大量的重复计算。由此而来的基本思路是,用一个表记录所有已解决的子问题的答案,不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。

比较感性的说,其实动态规划的思想是对贪心算法和分治法的一种折衷,它所解决的问题往往不具有可爱的贪心实质,但是各个子问题又不是完全零散的,这时候我们用一定的空间来换取时间,就可以提高解题的效率。

二、动态规划的基本步骤

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。设计一个动态规划算法,通常可以按以下几个步骤进行:

(1)找出最优解的性质,并刻画其结构特征。

(2)递归地定义最优值。

(3)以自底向上的方式计算出最优值。

(4)根据计算最优值时得到的信息,构造一个最优解。

其中(1)——(3)步是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省去。若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速构造出一个最优解。

三、典型的动态规划举例——矩阵连乘问题

作为经典的动态规划算法举例,矩阵连乘问题很好地展现了动态规划的特点和实用价值。给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘的,i=1,2,...n-1。现在要计算这n个矩阵的连乘积。由于矩阵的乘法满足结合律,所以通过加括号可以使得计算矩阵的连乘积有许多不同的计算次序。然而采用不同的加扩号方式,所需要的总计算量是不一样的。若A是一个p*q矩阵,B是一个q*r矩阵,则其乘积C=AB是一个p*r矩阵。如果用标准算法计算C,总共需要pqr次数乘。

现在来看一个例子。A1,A2,A3分别是10*100,100*5和5*50的矩阵。如果按照((A1A2)A3)来计算,则计算所需的总数乘次数是10*100*5+10*5*50=7500。如果按照(A1(A2A3))来计算,则需要的数乘次数是100*5*50+10*100*50=75000,整整是前者的10倍。由此可见,在计算矩阵连乘积时,不同的加括号方式所导致的不同的计算对计算量有很大的影响。如何确定计算矩阵连乘积A1A2,...,An的一个计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少便成为一个问题。

对于这个问题,穷举法虽然易于入手,但是经过计算,它所需要的计算次数是n的指数函数,因此在效率上显得过于低下。现在我们按照动态规划的基本步骤来分析解决这个问题,并比较它与穷举法在时间消耗上的差异。

(1)分析最优解的结构。

现在,将矩阵连乘积AiAi+1...Aj简记为A[i:j]。对于A[1:n]的一个最优次序,设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开(1<=k<n),那么完全加括号的方式为((A1...Ak)(Ak+1...An))。依此次序,我们应该先分别计算A[1:k]和A[k+1:n],然后将计算结果相乘得到A[1:n],总计算量为A[1:k]的计算量加上A[k+1:n]的计算量,再加上A[1:k]和A[k+1:n]相乘的计算量。

通过反证法可以证明,问题的关键特征在于,计算A[1:n]的一个最优次序所包含的计算矩阵子链A[1:k]和A[k+1:n]的次序也是最优的。因此,矩阵连乘积计算次序问题的最优解包含着其子问题的最优解。这种最优子结构性质是该问题可以用动态规划解决的重要特征。

(2)建立递归关系定义最优值。

设计算A[i:j](1<=i<=j<=n)所需的最少数乘次数为m[i][j],则原问题的最优值为m[1][n]。而且易见,当i=j时,m[i][j]=0。

根据上述最优子结构性质,当i<j时,若计算A[i:j]的最优次序在Ak和Ak+1之间断开,可以定义m[i][j]=m[i][k]+m[k+1][j]+pi-1*pk*pj(其中,Ai的维数为pi-1*pi)。从而有:

当i=j时,m[i][j]=0。

当i<j时,m[i][j]=min{m[i][k]+m[k+1][j]+pi-1*pk*pj} (i<=k<j)。

除此之外,若将对应于m[i][j]的断开位置记为s[i][j],在计算出最优值m[i][j]后,可以递归地由s[i][j]构造出相应的最优解。

(3)计算最优值。

如果直接套用m[i][j]的计算公式,进行简单的递归计算需要耗费指数计算时间。然而,实际上不同的子问题的个数只是n的平方项级(对于1<=i<=j<=n不同的有序对(i,j)对应于不同的子问题)。用动态规划解决此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。下面给出计算m[i][j]的动态规划算法:

void matrixChain (int * p, int n, int * * m, int * * s)

{

for ( int i=1;i<=n;i++)

m[i][i]=0;

for ( int r=2;r<=n;r++) //链长度控制

for ( int i=1;i<=n-r+1;i++) //链起始位置控制

{

int j=i+r-1; //链终止位置

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];

s[i][j]=i;

for ( int k=i+1;k<j;k++)

{

int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if (t<m[i][j])

{

m[i][j]=t;

s[i][j]=k;

}

}

}

}

算法首先设定m[i][i]=0(i=1,2,...,n)。然后再根据递归式按矩阵链长的递增方式依此计算出各个m[i][j],在计算某个固定的m[i][j]时,只用到已计算出的m[i][k]和m[k+1][j]。

稍加分析就可以得出,这个算法以O(n^2)的空间消耗大大降低了时间复杂度,计算时间的上界为O(n^3)。

(4)构造最优解。

通过以上算法的计算,我们知道了要计算所给矩阵连乘积所需的最少数乘次数,但是还不知道具体应该按照什么顺序来做矩阵乘法才能达到这个次数。然而,s[i][j]已经存储了构造最优解所需要的足够的信息。从s[1][n]记录的信息可知计算A[1:n]的最优加括号方式为(A[1:s[1][n]])(A[s[1][n]+1:n])。同理,每个部分的最优加括号方式又可以根据数组s的相应元素得出。照此递推下去,最终可以确定A[1:n]的最优完全加括号方式,即构造出问题的一个最优解。

四、结语

本文简单介绍了动态规划的基本思想、步骤和简单例题。以后笔者还会给大家介绍更多的例子,以及由动态归划衍生出来的备忘录方法,使大家即使在不能清晰地分析出问题子结构的从属关系时,仍能够避免不必要的重复计算,快速地解决问题。
一、分治算法
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。下面通过实例加以说明。
【例1】 [找出伪币] 给你一个装有1 6个硬币的袋子。1 6个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。比较硬币1与硬币2的重量。假如硬币1比硬币2轻,则硬币1是伪造的;假如硬币2比硬币1轻,则硬币2是伪造的。这样就完成了任务。假如两硬币重量相等,则比较硬币3和硬币4。同样,假如有一个硬币轻一些,则寻找伪币的任务完成。假如两硬币重量相等,则继续比较硬币5和硬币6。按照这种方式,可以最多通过8次比较来判断伪币的存在并找出这一伪币。
另外一种方法就是利用分而治之方法。假如把1 6硬币的例子看成一个大的问题。第一步,把这一问题分成两个小问题。随机选择8个硬币作为第一组称为A组,剩下的8个硬币作为第二组称为B组。这样,就把1 6个硬币的问题分成两个8硬币的问题来解决。第二步,判断A和B组中是否有伪币。可以利用仪器来比较A组硬币和B组硬币的重量。假如两组硬币重量相等,则可以判断伪币不存在。假如两组硬币重量不相等,则存在伪币,并且可以判断它位于较轻的那一组硬币中。最后,在第三步中,用第二步的结果得出原先1 6个硬币问题的答案。若仅仅判断硬币是否存在,则第三步非常简单。无论A组还是B组中有伪币,都可以推断这1 6个硬币中存在伪币。因此,仅仅通过一次重量的比较,就可以判断伪币是否存在。
现在假设需要识别出这一伪币。把两个或三个硬币的情况作为不可再分的小问题。注意如果只有一个硬币,那么不能判断出它是否就是伪币。在一个小问题中,通过将一个硬币分别与其他两个硬币比较,最多比较两次就可以找到伪币。这样,1 6硬币的问题就被分为两个8硬币(A组和B组)的问题。通过比较这两组硬币的重量,可以判断伪币是否存在。如果没有伪币,则算法终止。否则,继续划分这两组硬币来寻找伪币。假设B是轻的那一组,因此再把它分成两组,每组有4个硬币。称其中一组为B1,另一组为B2。比较这两组,肯定有一组轻一些。如果B1轻,则伪币在B1中,再将B1又分成两组,每组有两个硬币,称其中一组为B1a,另一组为B1b。比较这两组,可以得到一个较轻的组。由于这个组只有两个硬币,因此不必再细分。比较组中两个硬币的重量,可以立即知道哪一个硬币轻一些。较轻的硬币就是所要找的伪币。
【例2】在n个元素中找出最大元素和最小元素。我们可以把这n个元素放在一个数组中,用直接比较法求出。算法如下:
void maxmin1(int A[],int n,int *max,int *min)
{ int i;
*min=*max=A[0];
for(i=2;i < n;i++)
{ if(A > *max) *max= A;
if(A < *min) *min= A;
}
}
上面这个算法需比较2(n-1)次。能否找到更好的算法呢?我们用分治策略来讨论。
把n个元素分成两组:
A1={A[1],...,A[int(n/2)]}和A2={A[INT(N/2)+1],...,A[N]}
分别求这两组的最大值和最小值,然后分别将这两组的最大值和最小值相比较,求出全部元素的最大值和最小值。如果A1和A2中的元素多于两个,则再用上述方法各分为两个子集。直至子集中元素至多两个元素为止。
例如有下面一组元素:-13,13,9,-5,7,23,0,15。用分治策略比较的过程如下:
图中每个方框中,左边是最小值,右边是最大值。从图中看出,用这种方法一共比较了10次,比直接比较法的14次减少4次,即约减少了1/3。算法如下:
void maxmin2(int A[],int i,int j,int *max,int *min)
/*A存放输入的数据,i,j存放数据的范围,初值为0,n-1,*max,int *min 存放最大和最小值*/
{ int mid,max1,max2,min1,min2;
if (j==i) {最大和最小值为同一个数;return;}
if (j-1==i) {将两个数直接比较,求得最大会最小值;return;}
mid=(i+j)/2;
求i~mid之间的最大最小值分别为max1,min1;
求mid+1~j之间的最大最小值分别为max2,min2;
比较max1和max2,大的就是最大值;
比较min1和min2,小的就是最小值;
}
利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是经常采用的一种有效的方法,例如二分法检索。运用分治策略解决的问题一般来说具有以下特点:
1、原问题可以分解为多个子问题,这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。
2、原问题在分解过程中,递归地求解子问题,由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。
3、在求解并得到各个子问题的解后,应能够采用某种方式、方法合并或构造出原问题的解。
不难发现,在分治策略中,由于子问题与原问题在结构和解法是的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种排序方法中,如归并排序、堆排序、快速排序等,都存在有分治的思想。

热点内容
ftp特指 发布:2024-10-27 01:27:44 浏览:697
安卓漂流瓶在qq哪里 发布:2024-10-27 01:26:18 浏览:297
编程猫网盘 发布:2024-10-27 01:23:30 浏览:863
编译原理语法分析报告 发布:2024-10-27 01:17:02 浏览:49
金杯霸道有哪些配置 发布:2024-10-27 01:16:20 浏览:892
一个虚拟存储器有64个页面 发布:2024-10-27 01:16:02 浏览:982
浙江联通服务器地址 发布:2024-10-27 01:15:08 浏览:713
家里无线网怎么设密码 发布:2024-10-27 01:04:49 浏览:869
上万套源码 发布:2024-10-27 01:00:18 浏览:531
pandas数据库 发布:2024-10-27 00:59:21 浏览:670