欢迎来到一句话经典语录网
我要投稿 投诉建议
当前位置:一句话经典语录 > 经典名言 > 关于计算机算法的名言

关于计算机算法的名言

时间:2020-05-07 09:36

计算机方面的名言呗,最好里面带有.net这样专业术语的 要求能够显示出编程人员的聪明和专业

One of the beauties of OO programming is code re-use through inheritance,but to achieve it, programmers have to actually let other programmers re-use the code.-Gary Short面向对象编程的美妙之处之一是通过继承(而实现)的代码重用,但是为了实现这一点,程序员们不得不真正地做到让其他程序员重用(他们的)代码。

-盖里 肖特

和计算机上班,好吗

不妨选择:计算机科学理由如下:computer science,研究计算机及其周围各种现象和规律的科学,亦即研究计算机系统结构、程序系统(即软件)、人工智能以及计算本身的性质和问题的学科。

计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科,从抽象的算法分析、形式化语法等等,到更具体的主题如编程语言、程序设计、软件和硬件等。

计算机科学分为理论计算机科学和实验计算机科学两个部分。

后者常称为“计算机科学”而不冠以“实验”二字。

前者有其他名称,如计算理论、计算机理论、计算机科学基础、计算机科学数学基础等。

数学文献中一般指理论计算机科学。

目录研究领域计算机科学的领域研究课题相关奖项计算机系统分类美国开设计算机科学专业的院校相关学科展开研究领域计算机科学的领域研究课题相关奖项计算机系统分类美国开设计算机科学专业的院校相关学科展开编辑本段研究领域计算机是一种进行算术和逻辑运算的机器,而且对于由若干台计算机联成的系统而言还有通信问题,并且处理的对象都是信息,因而也可以说,计算机科学是研究信息处理的科学。

计算机科学分为理论计算机科学和实验计算机科学两个部分。

在数学文献中所说的计算机科学,一般是指理论计算机科学。

实验计算机科学还包括有关开辟计算机新的应用领域的研究。

计算机科学的大部分研究是基于“冯·诺依曼计算机”和“图灵机”的,它们是绝大多数实际机器的计算模型。

作为此模型的开山鼻祖,邱奇-图灵论题(Church-Turing Thesis)表明,尽管在计算的时间,空间效率上可能有所差异,现有的各种计算设备在计算的能力上是等同的。

尽管这个理论通常被认为是计算机科学的基础,可是科学家也研究其它种类的机器,如在实际层面上的并行计算机和在理论层面上概率计算机、oracle 计算机和量子计算机。

在这个意义上来讲,计算机只是一种计算的工具:著名的计算机科学家 Dijkstra 有一句名言“计算机科学之关注于计算机并不甚于天文学之关注于望远镜。

”。

编辑本段计算机科学的领域作为一个学科,计算机科学涵盖了从算法的理论研究和计算的极限,到如何通过硬件和软件实现计算系统。

CSAB(以前被叫做Computing Sciences Accreditation Board),由Association for Computing Machinery(ACM)和IEEE Computer Society(IEEE-CS)的代表组成,确立了计算机科学学科的4个主要领域:计算理论,算法与数据结构,编程方法与编程语言,以及计算机元素与架构。

CSAB还确立了其它一些重要领域,如软件工程,人工智能,计算机网络与通信,数据库系统,并行计算,分布式计算,人机交互,计算机图形学,操作系统,以及数值和符号计算。

理论计算机科学主条目:理论计算机科学广义的理论计算机科学包括经典的计算理论和其它专注于更抽象、逻辑与数学方面的计算。

计算理论主条目:计算理论按照Peter J. Denning的说法,计算机科学的最根本问题是“什么能够被有效地自动化

”计算理论的研究就是专注于回答这个根本问题,关于什么能够被计算,去实施这些计算又需要用到多少资源。

为了试图回答第一个问题,递归论检验在多种理论计算模型中哪个计算问题是可解的。

而计算复杂性理论则被用于回答第二个问题,研究解决一个不同目的的计算问题的时间与空间消耗。

著名的“P=NP?”问题,千禧年大奖难题之一,是计算理论的一个开放问题。

信息与编码理论主条目:信息论和编码理论信息论与信息量化相关,由Claude E. Shannon创建,用于寻找信号处理操作的根本极限,比如压缩数据和可靠的数据存储与通讯。

编码理论是对编码以及它们适用的特定应用性质的研究。

编码(code)被用于数据压缩,密码学,前向纠错,近期也被用于网络编码。

研究编码的目的在于设计更高效、可靠的数据传输方法。

算法算法指定义良好的计算过程,它取一个或一组值作为输入,经过一系列定义好的计算过程,得到一个或一组输出。

算法是计算机科学研究的一个重要领域,也是许多其他计算机科学技术的基础。

算法主要包括数据结构、计算几何、图论等。

除此之外,算法还包括许多杂项,如模式匹配、部分数论等。

程序设计语言理论主条目:程序设计语言理论程序设计语言理论是计算机科学的一个分支,主要处理程序设计语言的设计、实现、分析、描述和分类,以及它们的个体特性。

它属于计算机科学学科,既受影响于也影响着数学、软件工程和语言学。

它是公认的计算机科学分支,同时也是活跃的研究领域,研究成果被发表在众多学术期刊,计算机科学以及工程出版物。

形式化方法主条目:形式化方法形式化方法是一种特别的基于数学的技术,用于软件和硬件系统的形式规范、开发以及形式验证。

在软件和硬件设计方面,形式化方法的使用动机,如同其它工程学科,是通过适当的数学分析便有助于设计的可靠性和健壮性的期望。

但是,使用形式化方法会带来很高的成本,意味着它们通常只用于高可靠性系统,这种系统中安全或保安(security)是最重要的。

对于形式化方法的最佳形容是各种理论计算机科学基础种类的应用,特别是计算机逻辑演算,形式语言,自动机理论和形式语义学,此外还有类型系统、代数数据类型,以及软件和硬件规范和验证中的一些问题。

并发,并行和分布式系统主条目:并行性和分布式计算并行性(concurrency)是系统的一种性质,这类系统可以同时执行多个可能互相交互的计算。

一些数学模型,如Petri网、进程演算和PRAM模型,被创建以用于通用并发计算。

分布式系统将并行性的思想扩展到了多台由网络连接的计算机。

同一分布式系统中的计算机拥有自己的私有内存,它们之间经常交换信息以达到一个共同的目的。

数据库和信息检索主条目:数据库和数据库管理系统数据库是为了更容易地组织、存储和检索大量数据。

数据库由数据库管理系统管理,通过数据库模型和查询语言来存储、创建、维护和搜索数据。

应用计算机科学尽管计算机科学(computer science)的名字里包含计算机这几个字,但实际上计算机科学相当数量的领域都不涉及计算机本身的研究。

因此,一些新的名字被提议出来。

某些重点大学的院系倾向于术语计算科学(computing science),以精确强调两者之间的不同。

丹麦科学家Peter Naur建议使用术语datalogy,以反映这一事实,即科学学科是围绕着数据和数据处理,而不一定要涉及计算机。

第一个使用这个术语的科学机构是哥本哈根大学Datalogy学院,该学院成立于1969年,Peter Naur便是第一任教授。

这个术语主要被用于北欧国家。

同时,在计算技术发展初期,《ACM通讯》建议了一些针对计算领域从业人员的术语:turingineer,turologist,flow-charts-man,applied meta-mathematician及applied epistemologist。

三个月后在同样的期刊上,comptologist被提出,第二年又变成了hypologist。

术语computics也曾经被提议过。

在欧洲大陆,起源于信息(information)和数学或者自动(automatic)的名字比起源于计算机或者计算(computation)更常见,如informatique(法语),Informatik(德语),informatika(斯拉夫语族)。

著名计算机科学家Edsger Dijkstra曾经指出:“计算机科学并不只是关于计算机,就像天文学并不只是关于望远镜一样。

”(Computer science is no more about computers than astronomy is about telescopes.)设计、部署计算机和计算机系统通常被认为是非计算机科学学科的领域。

例如,研究计算机硬件被看作是计算机工程的一部分,而对于商业计算机系统的研究和部署被称为信息技术或者信息系统。

然而,现如今也越来越多地融合了各类计算机相关学科的思想。

计算机科学研究也经常与其它学科交叉,比如心理学,认知科学,语言学,数学,物理学,统计学和经济学。

计算机科学被认为比其它科学学科与数学的联系更加密切,一些观察者说计算就是一门数学科学。

早期计算机科学受数学研究成果的影响很大,如Kurt Gödel和Alan Turing,这两个领域在某些学科,例如数理逻辑、范畴论、域理论和代数,也不断有有益的思想交流。

计算机科学和软件工程的关系是一个有争议的话题,随后关于什么是“软件工程”,计算机科学又该如何定义的争论使得情况更加混乱。

David Parnas从其它工程和科学学科之间的关系得到启示,宣称计算机科学的主要重点总的来说是研究计算的性质,而软件工程的主要重点是具体的计算设计,以达到实用的目的,这样便构成了两个独立但又互补的学科。

人工智能主条目:人工智能这个计算机科学分支旨在创造可以解决计算问题,以及像动物和人类一样思考与交流的人造系统。

无论是在理论还是应用上,都要求研究者在多个学科领域具备细致的、综合的专长,比如应用数学,逻辑,符号学,电机工程学,精神哲学,神经生理学和社会智力,用于推动智能研究领域,或者被应用到其它需要计算理解与建模的学科领域,如金融或是物理科学。

人工智能领域开始变得正式源于Alan Turing这位人工智能先驱提出了图灵试验,以回答这样一个终极问题:“计算机能够思考吗

”计算机体系结构与工程主条目:计算机体系结构和计算机工程计算机系统结构,或者数字计算机组织,是一个计算机系统的概念设计和根本运作结构。

它主要侧重于CPU的内部执行和内存访问地址。

这个领域经常涉及计算机工程和电子工程学科,选择和互连硬件组件以创造满足功能、性能和成本目标的计算机。

计算机图形与视觉主条目:计算机图形学计算机图形学是对于数字视觉内容的研究,涉及图像数据的合成和操作。

它跟计算机科学的许多其它领域密切相关,包括计算机视觉、图像处理和计算几何,同时也被大量运用在特效和电子游戏。

计算机安全和密码学主条目:计算机安全和密码学计算机安全是计算机技术的一个分支,其目标包括保护信息免受未经授权的访问、中断和修改,同时为系统的预期用户保持系统的可访问性和可用性。

密码学是对于隐藏(加密)和破译(解密)信息的实践与研究。

现代密码学主要跟计算机科学相关,很多加密和解密算法都是基于它们的计算复杂性。

计算科学计算科学(或者科学计算)是关注构建数学模型和量化分析技术的研究领域,同时通过计算机分析和解决科学问题。

在实际使用中,它通常是计算机模拟和计算等形式在各个科学学科问题中的应用。

信息科学主条目:信息科学软件工程主条目:软件工程软件工程是对于设计、实现和修改软件的研究,以确保软件的高质量、适中的价格、可维护性,以及能够快速构建。

它是一个系统的软件设计方法,涉及工程实践到软件的应用。

[1]编辑本段研究课题计算机程序能做什么和不能做什么(可计算性);如何使程序更高效的执行特定任务(算法和复杂性理论);程序如何存取不同类型的数据(数据结构和数据库);程序如何显得更具有智能(人工智能);人类如何与程序沟通(人机互动和人机界面)。

编辑本段相关奖项计算机科学领域的最高荣誉是ACM设立的图灵奖,被誉为是计算机科学的诺贝尔奖。

它的获得者都是本领域最为出色的科学家和先驱。

华人中首获图灵奖的是姚期智先生.他于2000年以其对计算理论做出的诸多“根本性的、意义重大的”贡献而获得这一崇高荣誉。

编辑本段计算机系统分类计算机系统可划分为软件系统与硬件系统两大类。

硬件结构控制和指令系统算法和逻辑结构存储器结构冯·诺伊曼结构哈佛结构输入\\\/输出和数据通信数字逻辑逻辑设计集成电路计算机系统组织计算机系统结构计算机网络分布式计算网络安全计算机系统实现软件系统软件操作系统编译器应用软件计算机游戏办公自动化网络软件CAD软件计算机程序程序设计和程序设计实践面向对象技术程序设计语言软件工程软件复用驱动程序计算机模拟程序设计方法学数据和信息系统数据结构数据存储表示数据加密数据压缩编码与信息论文件信息系统管理信息系统决策支持系统- 专家系统数据库信息存储和数据存取信息交互与表达主要的研究领域形式化基础逻辑学谓词逻辑模态逻辑时序逻辑描述逻辑数学泛代数递归论模型论概率论和数理统计逻辑代数布尔代数离散数学组合数学图论网论信息论理论计算机科学形式语言自动机可计算性算法计算复杂性描述复杂性编译器程序设计理论信息论类型理论指称语义微程序遗传算法并行计算计算方法学人工智能计算机图形学图像处理与计算机视觉模式识别语音识别文字识别签名识别人脸识别指纹识别仿真与建模数字信号处理文档与文本处理计算机应用数值计算数值分析定理机器证明计算机代数工程计算计算机化学计算机物理生物信息论计算生物学非数值计算工厂自动化办公室自动化人工智能信息存储与检索符号语言处理计算机辅助科学计算机辅助设计计算机辅助教学计算机辅助管理计算机辅助软件工程机器人学多媒体技术人机交互电子商务特定技术测试基准机器视觉数据压缩软件设计模式数字信号处理文件格式信息安全国际互联网络超大规模集成电路设计网络传输协议网络处理器技术整数运算器浮点运算器矩阵运算处理器网格计算科学史计算机历史软件业历史编程思想[2]编辑本段美国开设计算机科学专业的院校弗吉尼亚大学,密西根大学安娜堡分校,乔治城大学,维克森林大学,耶鲁大学,哥伦比亚大学,华盛顿大学,卡内基梅隆大学,佐治亚理工学院,加州理工学院,麻省理工学院,斯坦福大学,加州大学伯克利分校,厄巴纳伊利诺斯州大学,威斯康星大学-麦迪逊分校,伦斯勒理工学院编辑本段相关学科计算机科学与另外的一些学科紧密相关。

这些学科之间有明显的交叉领域,但也有明显的差异。

信息科学 - 软件工程 - 信息系统 - 计算机工程 - 信息安全 - 密码学- 数学 - 工程学- 语言学 - 逻辑学编辑本段发展历史计算机科学中的理论部分在第一台数字计算机出现以前就已存在。

计算机科学根植于电子工程、数学和语言学,是科学、工程和艺术的结晶。

它在20世纪最后的三十年间兴起成为一门独立的学科,并发展出自己的方法与术语。

20世纪30年代中期英国数学家A.M.图灵和美国数学家E.L.波斯特几乎同时提出了理想计算机的概念(图灵提出的那种理想机在后来的文献中称为图灵机)。

40年代数字计算机产生后,计算技术(即计算机设计技术与程序设计技术)和有关计算机的理论研究开始得到发展。

这方面构成了现在所说的理论计算机科学。

至于图灵机理论,则可以看作是这一学科形成前的阶段。

至于“计算机科学”一词则到60年代初才出现,此后各国始在大学中设置计算机科学系。

学科内容 计算机科学是一门年轻的科学,它究竟包括哪些内容,还没有一致公认的看法。

一般认为,计算机科学主要包括理论计算机科学、计算机系统结构、软件工程的一部分和人工智能。

理论计算机科学 理论计算机科学是在20世纪30年代发展起来的。

40年代机电的与电子的计算机出现后,关于现实计算机及其程序的数学模型性质的研究以及计算复杂性(早期称作计算难度)的研究迅速发展起来,形成自动机论、形式语言理论、程序设计理论、算法设计与分析和计算复杂性理论几个领域。

计算机系统结构50年代50年代以来,计算机的性能在计算速度和编址空间方面已提高了几个数量级。

但大部分是通过元件更新而获得的。

在系统结构方面基本上仍是属于40年代后期形成的存储程序型,即所谓诺伊曼型机器。

这种结构的主要特点是它属于控制流型。

在这种结构中,一项计算先做什么后做什么是事先确定了的,程序中指令的顺序是事先确定了的。

为了在计算机的性能方面取得大的进展,需要突破这种旧的形式。

计算机系统结构方面的重要课题之一,是探索非诺伊曼型机器的设计思想。

在非诺伊曼型机器中,有一种是70年代初提出的数据流机器(又名数据驱动机器)。

美国、苏联和英国都已制成这种机器。

这种机器的特点是,在一项计算中先做什么后做什么不是事先确定,所执行的指令是动态排序的。

排序的原则是操作数已准备就绪的先做,因而称作数据驱动机器。

这种类型的机器更便于实现并行计算。

软件工程 程序设计在相当长的时间内是一种类似“手艺”而不是类似现代工程的技术。

60年代60年代以来出现了大程序。

这些大程序的可靠性很难保证。

到60年代后期,西方国家出现了“软件危机”。

这是指有些程序过于庞大(包含几十万条以至几百万条指令),成本过高而可靠性则比较差。

于是提出了软件工程的概念,目的在于使软件开发遵守严格的规范,使用一套可靠的方法,从而保证质量。

现代软件工程的方向是形式化和自动化,而形式化的目的在于自动化。

这里所说的自动化就是将程序设计中可以由机器来完成的工作,尽量交给机器去做。

中心课题之一是程序工具和环境的研究。

程序工具是指辅助人编程序的程序,如编译程序、编辑程序、排错程序等;程序环境则是指一套结合起来使用的用来辅助人编程序的程序工具。

人工智能 用计算机模拟人的智能,特别是模拟思维活动的技术及其有关理论。

由于人的思维活动离不开语言,而且人对于某一类问题进行思索和探索解法时,总是需要以关于这一类问题的基本知识(专业知识或常识)作为出发点。

于是,知识表示和机器对自然语言的理解就构成人工智能的两个重要领域。

所谓知识表示,是指将原来用自然语言表示的知识转换成用符号语言表示的,从而可以储存在机器内供机器使用的知识。

人工智能的研究角度有探索法的角度和算法的角度。

通常所说的解题算法是指机械的和总是有结果的方法,而这里所说的算法却是广义的,包括那些机械的而在使用时不一定有结果的算法。

这种方法时常称作半可判定的方法。

人在解决问题时,时常采用探索法。

这种方法具有“试错法”的性质,也就是说,试验若干条途径,一条路走不通时再试另一条,直到问题得到解决时为止。

机器可以模拟人用探索法解题的思维活动。

但由于可能途径的数目非常之大,不可能进行穷举式的探索。

人一般是只选出一些最有希望得到结果的途径去进行探索。

人的这种能力,就是进行创造性思维的能力。

这是机器极难模拟的事情。

采用算法角度,使用特定的解题算法或半可判定的方法时,会遇到另一方面的困难。

那就是当问题的复杂程度较高时(比如说是指数的),即使问题是有结果的,机器也无法在实际可行的时间内得到结果。

在计算机出现的初期,人们曾寄希望于机器的高速度,以为在模拟人的思维时,机器可能用它的高速度来换取它所不具有的创造性思维。

但通过“组合性爆炸”问题(“组合性爆炸”是指一些组合数学中的问题,在参数增大时,计算时间的增长率时常是指数的,甚至高于指数),人们认识到,单纯靠速度不能绕过组合性爆炸所产生的障碍。

有无办法来克服这种困难,尚有待于进一步研究。

与其他学科的关系 计算机是由物理元件构成的,迄今主要是由电子元件构成的。

因此,物理学的一些分支和电子工程便构成计算机科学的基础。

同时,计算机科学在一定意义上是算法的科学,而算法是一个数学概念。

因此,数学的某些分支如算法理论(即可算性理论,又名递归函数论)也构成计算机科学的基础。

但计算机科学已发展成为一门独立的技术科学,既不是电子学的一个分支,也不是数学的一个分支。

这是就这个学科的整体而言。

至于理论计算机科学,由于它可以看作是计算机科学的数学基础,在一定意义上,可以看作是数学的一个分支。

另一个与计算机科学有密切关系的学科是控制论。

控制论作为应用数学方法来研究机械系统和生命系统中的控制和通信现象的学科,同计算机科学有内容上的交叉,但后者不是它的一部分。

自从40年代制成数字计算机以来,计算机的性能有了很大的提高。

但在系统结构方面变化不大。

一些计算技术发达国家正在研制新一代的计算机。

这种计算机的系统结构将与过去40年的机器很不相同,所用的程序设计语言也将是新型的。

计算机科学将研究由此出现的新问题,如有关并行计算的问题。

对计算的数学性质的研究大都还是关于串行计算的,对并行计算性质的研究自70年代才发展起来,预计将成为计算机科学的中心课题之一。

另一个问题是程序设计的自动化问题。

在程序设计方面,明显的趋势是将机器能做的尽量交给机器去做。

程序环境的研究构成了软件工程的一个中心课题。

形式化方法越来越受到重视,因为它是提高自动化程度所必需的。

早期,虽然英国的剑桥大学和其他大学已经开始教授计算机科学课程,但它只被视为数学或工程学的一个分支,并非独立的学科。

剑桥大学声称有世界上第一个传授计算的资格。

世界上第一个计算机科学系是由美国的普渡大学在1962年设立,第一个计算机学院于1980年由美国的东北大学设立。

现在,多数大学都把计算机科学系列为独立的部门,一部分将它与工程系、应用数学系或其他学科联合。

请采纳。

本科计算机科学与技术需要考研吗

研究生阶段主要干什么

看你想干嘛,如果将来想从事科研或者高校教育工作,那么考研时必须的,将来还得读博;如果想就业的话,那就去看一下你最希望取得工作是什么要求的,比如一些国企、事业单位和公务员,想留在省会城市都要求硕士毕业,那么你就去读;如果说自己满意的工作不需要非得是硕士,那么建议直接工作就好,因为计算机领域重要的是编程经验,这些工作经验和硕士阶段跟着老师做项目的经验要强得多。

研究生阶段主要要看你老师做什么,基本都是帮着老师做项目,在项目中学经验,学东西。

至于具体工作要看你什么方向,软件、硬件、嵌入式、人工智能、数据挖掘、很多方向的,希望能够帮到你

我是一名专科大一生,学的是软件技术,c语言一点听不懂。

学习计算机编程确实需要一点天赋,没这方面天赋的人要学习一般的编程应该还是可以的

要掌握一点学习方法。

学习计算机语言和学习人类自然差不多,学习单词、学习语法、多写文章多和人交流。

对计算机语言而言单词就是语言中的命令、运算符等,语法就是这些命令运算符的用法,这些是基础的东西需要死记,然后多写一些小程序这样不仅可以帮你记忆这些命令、运算符的使用方法号可以增加你编程的兴趣,再就是要多读一些书上的程序示例,以便掌握一些常见问题的算法。

举几个列子说明一下:在学习自加、自减运算符时,不明白++i和i++的区别,你不妨自己写个小程序i=1;printf(%d,++i);i=1;printf(%d,i--);看看输出结果,然后照书上的说明加以理解两者为什么不同。

再比如排序问题,多看看书上的例题,什么冒泡法、选择法、比较法看看这几种算法的原理和区别是什么,以后碰到类似的问题自己心里就不会毫无头绪了。

记住学编程一定要多加练习,从容易入手,循序渐进,避免一开始碰钉子丧失学习信心。

最后送一句学计算机编程的名言“Just do it”.祝你好运

如何知道电脑是否具有并行计算能力?(就剩下这么点家底了,希望大家原谅)

你说PC吗

我个人认为, 任何电脑都具有并行计算的能力。

看你如何定义了。

并行计算和分布式系统同样都是一种计算方法,并不是硬件规格。

你的操作系统里每个任务都一个有个process, 而每个process都是由很多threads。

如果你上过操作系统的课应该遇到过multi-threads programming. 你让不同的threads去合作完成同一个task, 这其实就可以叫并行计算. 分布式处理嘛.你看那些并行计算的课的project, 也都是拿普通计算机跑算法, 重点是你会去模拟这个环境. 就像那些跑网络算法的用socket来模拟, 也是用一台PC模拟出了N台workstations的网络. 如果你说多核CPU, 来分布式处理事情. 关于Firmware的东西平民是很难实现的. 首先你并没有access to 那些普通的主板的firmware. 所以你必须要买一块general purpose的 programmable的板子. 这个不难, 但你要买个多核的基本可以说找不到吧...只有实验室里才有可能有...就算被你找到... 我觉得那块板子的钱估计也是你去读研然后进实验室的学费的好几倍... 总而言之, 软件实现的话今天的PC应该都没什么问题. 硬件的话, 首先你自己做不到, 要人家官方预设了这个选项. 而至于如何启动并行计算模式, 你要去读这块板子的datasheet. 我不同意上面那位说必须两个核, 有两个大脑的人确实可以做到并行. 但一个大脑的左脑与右脑也同样是并行. 在细化不同的神经元相对另外一个完全independent的神经元也同样是并行. 并行是一种解决问题的方式, 一种思想. 并行计算最早被提出的是1912年, 多核处理器是哪年才出现的, 我记不得了, 但2000年以后了吧至少...

数学家吴文俊的名言

我大三,专业计算机,目前在微软实习,希望回答能给你带来帮助。

初次学习编程不建议读“大砖头”C++premer, 推荐看的C++红皮书的前部分,先不看编程,学好结构化编程,然后深入数据结构和简单算法的学习,要想成为高手建议刷一些ACM水题,50道水题保证你的编程能力在潜移默化中有所提高,USACO和POJ,HDOJ就很不错,不知道是什么东西百度下就行了。

对代码的操控能力有一定基础之后,再深入到C++语言的高级特性里面学习,也就是的部分,继承,多态等。

于此同时应该看一下的设计模式,为以后做工程和项目做铺垫。

这个就类似于你学会写字之后开始锻炼如何写文章一样,很重要。

设计模式看好之后,可以看一些java,C#,Qt等高层次语言的学习, 这三种语言很类似,属于层次较为高的语言,但是不要怕,层次高反而会更加简单便捷,适于工程项目的开发,用三种语言开发软件的时候感觉就像你会写作文之后开始学习如何用别人写好的名言名句一样直接调用。

当然整个过程可能至少需要两三年,我说的这些是针对那些以后指望着code吃饭的童鞋啦。

冒泡排序法和快速排序比较的算法

打你屁股,这么简单的问题都不认真研究一下。

冒泡排序是最慢的排序,时间复杂度是 O(n^2)。

快速排序是最快的排序。

关于快速排序,我推荐你看看《代码之美》第二章:我编写过的最漂亮的代码。

作者所说的最漂亮,就是指效率最高的。

--------------------------------摘自《代码之美》---------------当我撰写关于分治(divide-and-conquer)算法的论文时,我发现C.A.R. Hoare的Quicksort算法(“Quicksort”,Computer Journal 5)无疑是各种Quicksort算法的鼻祖。

这是一种解决基本问题的漂亮算法,可以用优雅的代码实现。

我很喜欢这个算法,但我总是无法弄明白算法中最内层的循环。

我曾经花两天的时间来调试一个使用了这个循环的复杂程序,并且几年以来,当我需要完成类似的任务时,我会很小心地复制这段代码。

虽然这段代码能够解决我所遇到的问题,但我却并没有真正地理解它。

我后来从Nico Lomuto那里学到了一种优雅的划分(partitioning)模式,并且最终编写出了我能够理解,甚至能够证明的Quicksort算法。

William Strunk Jr.针对英语所提出的“良好的写作风格即为简练”这条经验同样适用于代码的编写,因此我遵循了他的建议,“省略不必要的字词”(来自《The Elements of Style》一书)。

我最终将大约40行左右的代码缩减为十几行的代码。

因此,如果要回答“你曾编写过的最漂亮代码是什么

”这个问题,那么我的答案就是:在我编写的《Programming Pearls, Second Edition》(Addison-Wesley)一书中给出的Quichsort算法。

在示例2-1中给出了用C语言编写的Quicksort函数。

我们在接下来的章节中将进一步地研究和改善这个函数。

【示例】 2-1 Quicksort函数void quicksort(int l, int u){ int i, m;if (l >= u) return; 10swap(l, randint(l, u));m = l;for (i = l+1; i <= u; i++)if (x[i] < x[l])swap(++m, i);swap(l, m);quicksort(l, m-1);quicksort(m+1, u);}如果函数的调用形式是quicksort(0, n-1),那么这段代码将对一个全局数组x[n]进行排序。

函数的两个参数分别是将要进行排序的子数组的下标:l是较低的下标,而u是较高的下标。

函数调用swap(i,j)将会交换x[i]与x[j]这两个元素。

第一次交换操作将会按照均匀分布的方式在l和u之间随机地选择一个划分元素。

在《Programming Pearls》一书中包含了对Quicksort算法的详细推导以及正确性证明。

在本章的剩余内容中,我将假设读者熟悉在《Programming Pearls》中所给出的Quicksort算法以及在大多数初级算法教科书中所给出的Quicksort算法。

如果你把问题改为“在你编写那些广为应用的代码中,哪一段代码是最漂亮的

”我的答案还是Quicksort算法。

在我和M. D. McIlroy一起编写的一篇文章(Engineering a sort function, Software-Practice and Experience, Vol. 23, No. 11)中指出了在原来Unix qsort函数中的一个严重的性能问题。

随后,我们开始用C语言编写一个新排序函数库,并且考虑了许多不同的算法,包括合并排序(Merge Sort)和堆排序(Heap Sort)等算法。

在比较了Quicksort的几种实现方案后,我们着手创建自己的Quicksort算法。

在这篇文章中描述了我们如何设计出一个比这个算法的其他实现要更为清晰,速度更快以及更为健壮的新函数——部分原因是由于这个函数的代码更为短小。

Gordon Bell的名言被证明是正确的:“在计算机系统中,那些最廉价,速度最快以及最为可靠的组件是不存在的。

”现在,这个函数已经被使用了10多年的时间,并且没有出现任何故障。

考虑到通过缩减代码量所得到的好处,我最后以第三种方式来问自己在本章之初提出的问题。

“你没有编写过的最漂亮代码是什么

”。

我如何使用非常少的代码来实现大量的功能

答案还是和Quicksort有关,特别是对这个算法的性能分析。

我将在下一节给出详细介绍。

2.2 事倍功半Quicksort是一种优雅的算法,这一点有助于对这个算法进行细致的分析。

大约在1980年左右,我与Tony Hoare曾经讨论过Quicksort算法的历史。

他告诉我,当他最初开发出Quicksort时,他认为这种算法太简单了,不值得发表,而且直到能够分析出这种算法的预期运行时间之后,他才写出了经典的“Quicksoft”论文。

我们很容易看出,在最坏的情况下,Quicksort可能需要n2的时间来对数组元素进行排序。

而在最优的情况下,它将选择中值作为划分元素,因此只需nlgn次的比较就可以完成对数组的排序。

那么,对于n个不同值的随机数组来说,这个算法平均将进行多少次比较

Hoare对于这个问题的分析非常漂亮,但不幸的是,其中所使用的数学知识超出了大多数程序员的理解范围。

当我为本科生讲授Quicksort算法时,许多学生即使在费了很大的努力之后,还是无法理解其中的证明过程,这令我非常沮丧。

下面,我们将从Hoare的程序开11始讨论,并且最后将给出一个与他的证明很接近的分析。

我们的任务是对示例2-1中的Quicksort代码进行修改,以分析在对元素值均不相同的数组进行排序时平均需要进行多少次比较。

我们还将努力通过最短的代码、最短运行时间以及最小存储空间来得到最深的理解。

为了确定平均比较的次数,我们首先对程序进行修改以统计次数。

因此,在内部循环进行比较之前,我们将增加变量comps的值(参见示例2-2)。

【示例2-2】 修改Quicksort的内部循环以统计比较次数。

for (i = l+1; i <= u; i++) {comps++;if (x[i] < x[l])swap(++m, i);}如果用一个值n来运行程序,我们将会看到在程序的运行过程中总共进行了多少次比较。

如果重复用n来运行程序,并且用统计的方法来分析结果,我们将得到Quicksort在对n个元素进行排序时平均使用了1.4 nlgn次的比较。

在理解程序的行为上,这是一种不错的方法。

通过十三行的代码和一些实验可以反应出许多问题。

这里,我们引用作家Blaise Pascal和T. S. Eliot的话,“如果我有更多的时间,那么我给你写的信就会更短。

”现在,我们有充足的时间,因此就让我们来对代码进行修改,并且努力编写出更短(同时更好)的程序。

我们要做的事情就是提高这个算法的速度,并且尽量增加统计的精确度以及对程序的理解。

由于内部循环总是会执行u-l次比较,因此我们可以通过在循环外部增加一个简单的操作来统计比较次数,这就可以使程序运行得更快一些。

在示例2-3的Quicksort算法中给出了这个修改。

【示例2-3】 Quicksort的内部循环,将递增操作移到循环的外部comps += u-l;for (i = l+1; i <= u; i++)if (x[i] < x[l])swap(++m, i);这个程序会对一个数组进行排序,同时统计比较的次数。

不过,如果我们的目标只是统计比较的次数,那么就不需要对数组进行实际地排序。

在示例2-4中去掉了对元素进行排序的“实际操作”,而只是保留了程序中各种函数调用的“框架”。

【示例2-4】将Quicksort算法的框架缩减为只进行统计void quickcount(int l, int u){ int m;if (l >= u) return;m = randint(l, u);comps += u-l;quickcount(l, m-1);quickcount(m+1, u);}12这个程序能够实现我们的需求,因为Quichsort在选择划分元素时采用的是“随机”方式,并且我们假设所有的元素都是不相等的。

现在,这个新程序的运行时间与n成正比,并且相对于示例2-3需要的存储空间与n成正比来说,现在所需的存储空间缩减为递归堆栈的大小,即存储空间的平均大小与lgn成正比。

虽然在实际的程序中,数组的下标(l和u)是非常重要的,但在这个框架版本中并不重要。

因此,我们可以用一个表示子数组大小的整数(n)来替代这两个下标(参见示例2-5)【示例2-5】 在Quicksort代码框架中使用一个表示子数组大小的参数void qc(int n){ int m;if (n <= 1) return;m = randint(1, n);comps += n-1;qc(m-1);qc(n-m);}现在,我们可以很自然地把这个过程整理为一个统计比较次数的函数,这个函数将返回在随机Quicksort算法中的比较次数。

在示例2-6中给出了这个函数。

【示例2-6】 将Quicksort框架实现为一个函数int cc(int n){ int m;if (n <= 1) return 0;m = randint(1, n);return n-1 + cc(m-1) + cc(n-m);}在示例2-4、示例2-5和示例2-6中解决的都是相同的基本问题,并且所需的都是相同的运行时间和存储空间。

在后面的每个示例都对这些函数的形式进行了改进,从而比这些函数更为清晰和简洁。

在定义发明家的矛盾(inventor's paradox)(How To Solve It, Princeton University Press)时,George Póllya指出“计划越宏大,成功的可能性就越大。

”现在,我们就来研究在分析Quicksort时的矛盾。

到目前为止,我们遇到的问题是,“当Quicksort对大小为n的数组进行一次排序时,需要进行多少次比较

”我们现在将对这个问题进行扩展,“对于大小为n的随机数组来说,Quichsort算法平均需要进行多少次的比较

”我们通过对示例2-6进行扩展以引出示例2-7。

【示例2-7】 伪码:Quicksort的平均比较次数float c(int n)if (n <= 1) return 0sum = 0for (m = 1; m <= n; m++)sum += n-1 + c(m-1) + c(n-m)return sum\\\/n如果在输入的数组中最多只有一个元素,那么Quichsort将不会进行比较,如示例2-613中所示。

对于更大的n,这段代码将考虑每个划分值m(从第一个元素到最后一个,每个都是等可能的)并且确定在这个元素的位置上进行划分的运行开销。

然后,这段代码将统计这些开销的总和(这样就递归地解决了一个大小为m-1的问题和一个大小为n-m的问题),然后将总和除以n得到平均值并返回这个结果。

如果我们能够计算这个数值,那么将使我们实验的功能更加强大。

我们现在无需对一个n值运行多次来估计平均值,而只需一个简单的实验便可以得到真实的平均值。

不幸的是,实现这个功能是要付出代价的:这个程序的运行时间正比于3n(如果是自行参考(self-referential)的,那么用本章中给出的技术来分析运行时间将是一个很有趣的练习)。

示例2-7中的代码需要一定的时间开销,因为它重复计算了中间结果。

当在程序中出现这种情况时,我们通常会使用动态编程来存储中间结果,从而避免重复计算。

因此,我们将定义一个表t[N+1],其中在t[n]中存储c[n],并且按照升序来计算它的值。

我们将用N来表示n的最大值,也就是进行排序的数组的大小。

在示例2-8中给出了修改后的代码。

【示例2-8】 在Quicksort中使用动态编程来计算t[0] = 0for (n = 1; n <= N; n++)sum = 0for (i = 1; i <= n; i++)sum += n-1 + t[i-1] + t[n-i]t[n] = sum\\\/n这个程序只对示例2-7进行了细微的修改,即用t[n]来替换c(n)。

它的运行时间将正比于N2,并且所需的存储空间正比于N。

这个程序的优点之一就是:在程序执行结束时,数组t中将包含数组中从元素0到元素N的真实平均值(而不是样本均值的估计)。

我们可以对这些值进行分析,从而生成在Quichsort算法中统计比较次数的计算公式。

我们现在来对程序做进一步的简化。

第一步就是把n-1移到循环的外面,如示例2-9所示。

【示例2-9】 在Quicksort中把代码移到循环外面来计算t[0] = 0for (n = 1; n <= N; n++)sum = 0for (i = 1; i <= n; i++)sum += t[i-1] + t[n-i]t[n] = n-1 + sum\\\/n现在将利用对称性来对循环做进一步的调整。

例如,当n为4时,内部循环计算总和为:t[0]+t[3] + t[1]+t[2] + t[2]+t[1] + t[3]+t[0]在上面这些组对中,第一个元素增加而第二个元素减少。

因此,我们可以把总和改写为:2 * (t[0] + t[1] + t[2] + t[3])我们可以利用这种对称性来得到示例2-10中的Quicksort。

【示例2-10】 在Quichsort中利用了对称性来计算t[0] = 014for (n = 1; n <= N; n++)sum = 0for (i = 0; i < n; i++)sum += 2 * t[i]t[n] = n-1 + sum\\\/n然而,在这段代码的运行时间中同样存在着浪费,因为它重复地计算了相同的总和。

此时,我们不是把前面所有的元素加在一起,而是在循环外部初始化总和并且加上下一个元素,如示例2-11所示。

【示例2-11】 在Quicksort中删除了内部循环来计算sum = 0; t[0] = 0for (n = 1; n <= N; n++)sum += 2*t[n-1]t[n] = n-1 + sum\\\/n这个小程序确实很有用。

程序的运行时间与N成正比,对于每个从1到N的整数,程序将生成一张Quicksort的估计运行时间表。

我们可以很容易地把示例2-11用表格来实现,其中的值可以立即用于进一步的分析。

在2-1给出了最初的结果行。

表2-1 示例2-11中实现的表格输出N Sum t[n]0 0 01 0 02 0 13 2 2.6674 7.333 4.8335 17 7.46 31.8 10.37 52.4 13.4868 79.371 16.921这张表中的第一行数字是用代码中的三个常量来进行初始化的。

下一行(输出的第三行)的数值是通过以下公式来计算的:A3 = A2+1 B3 = B2 + 2*C2 C3 = A2-1 + B3\\\/A3把这些(相应的)公式记录下来就使得这张表格变得完整了。

这张表格是“我曾经编写的最漂亮代码”的很好的证据,即使用少量的代码完成大量的工作。

但是,如果我们不需要所有的值,那么情况将会是什么样

如果我们更希望通过这种来方式分析一部分数值(例如,在20到232之间所有2的指数值)呢

虽然在示例2-11中构建了完整的表格t,但它只需要使用表格中的最新值。

因此,我们可以用变量t的定长空间来替代table t[]的线性空间,如示例2-12所示。

【示例2-12】 Quicksoft 计算——最终版本sum = 0; t = 015for (n = 1; n <= N; n++)sum += 2*tt = n-1 + sum\\\/n然后,我们可以插入一行代码来测试n的适应性,并且在必要时输出这些结果。

这个程序是我们漫长学习旅途的终点。

通过本章所采用的方式,我们可以证明Alan Perlis的经验是正确的:“简单性并不是在复杂性之前,而是在复杂性之后” (Epigrams on Programming, Sigplan Notices, Vol. 17, Issue 9)。

声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。联系xxxxxxxx.com

Copyright©2020 一句话经典语录 www.yiyyy.com 版权所有

友情链接

心理测试 图片大全 壁纸图片