一般而言,编程或计算机科学都与算法有关吗?


40

作为一名研究生,我发现越来越有声望的公司(例如Google,Facebook,Microsoft等)将算法问题放入他们的测试和面试中。我申请过的一些创业公司也询问了算法。我想知道对于这些公司的软件开发人员来说,算法流畅性是否最重要?

如果答案是肯定的,那么有效学习和实践算法的最佳方法或资源是什么?我似乎对解决大多数教科书或网站中似乎过于复杂的问题没有兴趣。尽管很容易理解基本算法(如quicksort,bubblesort等),但我发现很难记住它并以后再使用。

谢谢。

P / S:如果您问我喜欢什么,它正在构建优秀的软件,以创新方式解决用户的问题。我想这并不一定意味着该软件必须非常复杂。


26
知道让Google使用文本框和按钮搜索整个网络有多复杂吗?
JeffO

21
@JeffO我什至不再使用按钮;-)
maple_shaft

1
如果Google简化了操作,则所有其他搜索网站将完全不需要任何代码。
JeffO

我认为问题应该是关于计算机的工作方式,例如CPU的工作方式,RAM的工作方式,wifi的工作方式等。这些非常有趣的问题仍需进行大量研究。我仍然发现硬件比使用Java或php的所有怪胎编程都更加出色。
2012年

2
这不仅涉及算法,而且实际上它们是CS的核心。但是编程不仅要有算法和逻辑,还有很多东西(例如,维护代码就不需要了解算法)。
haylem 2012年

Answers:


44

算法很明确

这是关于算法的美丽之处:它们处理的问题空间是明确定义的,即您的要求不仅是实际已知的,而且通常甚至形式化,就像解决方案质量的度量标准一样。

因此,如果我告诉您提出一种算法,那么沟通问题的可能性就不大,而衡量性能则是一项琐碎的任务。同时,您的表现是您逻辑思考能力的相当不错的指标。

算法是一种有效的过滤器

行业(和教育)当前的问题是毕业生的平均质量差。FizzBu​​zz测试对此进行了说明,该测试为:

编写一个程序,该程序将处理从1到100的数字,如果该数字可以被3整除,则将打印“ fizz”;如果可以将其数字5整除,则将打印“ buzz”;如果不能将其数字整除,则将打印数字本身。

显然,所有Comp Sci毕业生中的大多数都无法解决该问题。请注意,这是一个算法问题,尽管当然是一个令人尴尬的简单问题。有了这个,找到可以解决Google Code Jam或Project Euler中出现的问题的人,您已经在享受crème-de-la-crème。

算法只是软件开发的一小部分

事实是,一旦您从事该行业,您使用算法技能的时间就不会超过1%。

在甚至开始编写代码之前,您必须首先收集并分析需求。然后,您必须基于它们来综合设计。然后,您必须实施设计。然后,您必须对照原始需求评估实现,然后迭代需求,然后迭代设计,然后迭代实现,依此类推。

要求之一是合理的性能。如果不满足该要求,则必须概要分析实现以跟踪瓶颈,然后可以对其进行优化,这有时是直接进行微优化的问题(这很容易做到),但有时是使用更好的算法(此后并不总是很容易做到)。因此:

算法至关重要

您对算法的掌握程度越高,您第一次就能正确使用它的机会就越大。否则,您不仅会遇到只能通过实施更好的算法来解决的问题,而且您将无法实际解决它。
因此,尽管您几乎不需要此技能,但它却代表了开发方法中的单点失败,如果您不具备该技能,则只能希望永远不会出现这种必要,或者希望有人为解决此问题而跳出来您。

正如我在回答类似问题时所解释的那样,真正重要的是对计算复杂性有一个感觉,以及如何降低它。或者专门研究那些根本不重要的事情,例如GUI开发,但是随后几乎所有人都讨厌它……是有原因的!


5
+1是一个非常全面和智能的答案。同样,令人遗憾的是过滤器FizzBu​​zz的效果如何。无法做到这一点绝对没有任何借口。
亚当·克罗斯兰

4
我认为fizzbuzz如果该数字可被两个部分整除,那么您应该进行打印,并且很多人都忽略了这一点,因为您需要仔细订购模支票。
Matthieu M.

1
1%可能有点太高了

1
@MatthieuM .:在要求的表述方式中,印刷两者是固有的。缺少那意味着您没有仔细检查需求;现在,我发现有趣的是,它不必说您不必按任何特定顺序打印,甚至
不必

1
@ back2dos:是的,但是以随机顺序执行听起来更有趣...请注意,此答案中给出的要求没有提到行,只是打印。如果您接受了FizzBu​​zz测试,可能值得指出的是其中存在很多未阐明的假设(然后,它可能会让您像个聪明人一样)。
jmoreno 2012年

30

通常,将编程作为一项工作与算法无关。您可以花费数年时间编写CRUD应用程序,而无需具备深厚的算法技能。

编程是关于:

  1. 通讯:

    • 源代码是将您的想法传达给同行的一种手段。如果没有人可以阅读/理解您的代码,那将毫无价值。

    • 一个不与任何其他开发人员交谈的孤独开发人员可能会开始在代码中犯错误,并认为自己的方法是唯一可以接受的方法。

    • 您必须知道如何与利益相关者,质量保证部门,用户,视觉设计师,DBA等进行沟通。

    • 作为一个经验丰富的开发人员,您必须教那些希望提高技能的经验不足的同事。

  2. 掌握正确的工具:版本控制,错误跟踪系统,IDE,哪种语言更适合于特定任务以及为什么,如何使用代码分析等。

  3. 广泛的知识和文化:什么是功能语言?计算机如何解释代码?为什么LOC是无意义的措施?等等

  4. 对您使用的语言有深入的了解。

  5. 算法。

另一方面,计算机科学更多地面向算法。如果您是科学家,那么这可能与开发人员的工作无关,您将在如何优化算法,如何将数据表示形式转换为其他形式等方面进行更多工作。


12
-1:“ CRUD应用程序” 算法。它们只是(通常)简单。没有“高尚的意义”。
S.Lott

2
源代码是您到计算机的唯一通信渠道,它可以完全按照您的要求执行操作(几乎从不执行您想要的操作)
棘手的怪胎2012年

5
清理CRUDdy应用程序的市场多么出色,这是令人惊讶的,这些应用程序的工程团队忽略了(或从未学习过)算法的基础。
JasonTrue 2012年

2
@ S.Lott:“ CRUD应用程序是算法”类似于“我是美国”。;)
Jim G.

1
@JimG:正如史蒂文·科尔伯特(Steven Colbert)所说:“我是美国,你也可以。” CRUD应用程序包含,基于,包含,实现,实现,体现,反映算法。您只是抱怨而没有提出具体介词。哪个会让您更快乐?
S.Lott

16

我认为面试中有关算法的问题是公司试图判断候选人对计算机科学基础知识的掌握的主要方式之一。尽管这不是专业程序员唯一重要的技能领域,但它是优秀程序员的核心能力之一。

我认为许多大公司在面试过程中都强调CS基础知识的原因是,这是毕业并入职后最少发展的核心技能。实际的编程能力,设计技能,软件工程实践等都是根据经验开发的,而您的CS基础知识则主要是在学习过程中开发的。

至于如何练习算法设计,史蒂夫·叶格(Steve Yegge)在他作为程序员进行面试的出色指南中推荐了Skiena的《算法设计手册》


4
+1:编程语言,框架,操作系统,编辑器,工具集无处不在,但是了解如何有效解决问题与了解数据结构和算法的基础息息相关。这些事情永远伴随着我们。
亚当·克罗斯兰

“关于如何实践算法设计,史蒂夫·叶格(Steve Yegge)在他作为程序员进行面试的出色指南中,推荐了Skiena的《算法设计手册》。” 抱歉,但这可能不适用于提出此问题的人,因为他恰好是研究生。Google / MS已从Skiena(面向研究生)发展到提出在国际大学编程竞赛中出现的问题。(我从轶事经验中肯定知道)。Skiena的书仍在使用-但主要是针对本科生。
user396089 2012年

至于出现在编程竞赛中的问题-如果您之前从未看过问题,那么您几乎会
感到不知所措

11

作为一名成功的软件开发人员,他是自学成才的,并且只上过大学的几门计算机科学课程,我想说的是,当今企业面临的最大问题不是所有程序员都能以最有效的方式编写气泡排序算法的能力。可能。企业面临的真正问题:

  • 无法快速学习并适应新领域的开发人员

  • 无法以有意义的方式与客户或利益相关者进行社交互动的开发人员

  • 无法再次猜测和质疑不正确或考虑不周的业务需求的开发人员

  • 不了解如何彻底测试其代码和功能的开发人员

  • 无法及时提供有意义的估算的开发人员

  • 无法创建清晰简洁文档的开发人员

  • 无法自发启动或无法掌控局势的开发人员

在十分之九的情况下,我敢打赌,几乎所有情况下,开发人员都在公司中挣扎的原因是,他们无可救药地失败了以上一种素质。忘了Google和Facebook,它们是例外情况,对具有深刻理解计算机科学知识的人们有合法的需求。

真实的企业虽然不会与计算机科学的复杂性抗争,但会与人类的复杂性抗争。问题在于,很难对上述质量进行测试。大多数时候,您必须根据自己的直觉来判断人们是否具备这些特质。如果您没有良好的人际交往能力和直觉,那将很难做到,测试算法知识要容易得多。


+1普通的和非Google类的怪异公司需要具有良好业务技能的人员,并且主要是在了解如何发明/应用/管理/修改流程方面。没错,像Google这样的公司没有孵化敏捷运动,因为计算机科学并不是要解决业务问题。
S.Robins,2012年

10

我个人认为“标准”算法和数据结构是程序员词汇的一部分。作为程序员,您面临的许多实际问题通常都有一种解决方案,该解决方案(至少部分地)可以在此词汇表中表达。

使用这些词汇表可以避免您不得不提出“自己的”解决方案(可以说是重新发明轮子),从而使您可以更聪明,更快捷地工作。

“我似乎对解决大多数教科书或网站中看起来过于复杂的问题没有兴趣”

“我发现很难记住并且以后再使用它们”

强迫自己完成它们。稍后您将感谢自己。即使您不记得它们的全部细节(尽管经过足够的练习,您肯定会记住),但是能够说“我记得使用算法X或数据结构Y解决相似的问题”将极大地帮助您。即使确实需要您查找详细信息并刷新内存。


+1用于数据结构。它们是算法硬币的另一半。
Spencer Rathbun 2012年

9

尽管您可能不了解算法就不能成为一名优秀的程序员,但是将编程专业的其他方面拒之门外是不公平的。例如,严格的纪律和良好的母语能力对于成为一名优秀的程序员至少与您对算法的了解同样重要。也不应该低估了解基本工具(例如编程语言,源代码控制系统,测试环境等)的重要性。

但是,在面试时,衡量您对算法的理解比衡量您与程序员工作相关的其他能力要简单得多。这就是为什么面试官经常专注于询问算法,并密切注意您在面试过程中解释它们的方式。这并不是因为其他事情不太重要,而是因为很难在分配给面试的30分钟内评估这些其他事情。


1
+1完美答案!测试算法知识更容易。
maple_shaft

“您的算法”-我是自学成才的。在某处是否有资料来源或列表说明每个程序员都应该知道哪些通用算法?我想通读它们。谢谢!
Ominus

2
@Ominus尽管在算法的“绅士列表”上没有达成共识,但在大多数情况下,它包括搜索,排序,遍历缺乏空间连续性的数据结构(链接列表,二叉树等)和基本(mis)递归的应用(递归阶乘,斐波那契数列等)
dasblinkenlight 2012年

@Ominus-我也是自学成才,但我认为“算法简介”-CLRS是熟悉该领域的好方法。Skiena的书《算法设计手册》也不错。
Tod 2012年

5

是的,编程主要是关于算法。

但是,也许不是您在思考的意思。

我得到的印象是我们都在使用不同的算法定义。 老实说,这个问题很难回答,因为算法是一个模糊的术语。我将使用Wikipedia的定义来回答这个问题:

一组精确定义操作序列的规则。

这是编程的灵魂。当您编写任何代码时,您只是在实现一种算法。如果要编写一些CRUD应用程序,那么您正在实现一个简单的算法。能够提出一种解决问题的算法就是编程。其余只是细节。

我不同意先前的海报,他说深入了解一种语言比理解算法更重要。任何优秀的程序员都应该能够深入学习一种语言,但是如果没有算法,就无法自己编写任何代码。


从另一个角度看,在数学中,核心和灵魂可能是算法,但是对于编程而言,则是另外一回事。您可以编写软件而不需要算法本身(也许不是好的软件),但是如果没有逻辑和抽象思维就不能编写软件。从本质上讲,这是解决问题的方法。找到解决方案是一个算法过程,但是解决方案本身并不一定是算法。
S.Robins'2

4

答案完全取决于您要从事的工作。与其他领域相比,某些领域尤其关注算法。尽管我很荣幸能多次采访亚马逊,但在谈到该笔记时仍然如此。即使职位与这些复杂的算法关系不大,我也对如何使任务摊销固定时间感到困惑。

证明对算法有深刻理解的内容为您的潜在雇主证明了您是一个合适的问题解决者。这并不是一个好员工的好指标(IMO),但是一些雇主使用它来进行筛选。如果您正在申请需要研究生学位的职位,那么您将期望在算法上有更严格的基础。

在实际中,IMO(IMO)的最大帮助不是记住特定的算法,而是通过了解某些算法的工作原理,在您脑海中回荡着这个小块,您将在其中说“我以前见过”或“我知道我可以做得更好”,这将对您的问题的解决方案进行一些研究。


+1讨论研究生的招聘栏。一些公司在招收研究生时比起本科生要容易得多。但是对他们来说公平的是,研究生的薪水也更高,通常在内部以更高的水平招聘。
user396089 2012年

1

我一直认为编程比算法更受数据驱动。.但是,如果您不做任何事情,那么数据的用途是什么……所有这些操作都是算法。所以实际上,是的,编程几乎完全基于算法。

它可能看起来不像数学,而且您每天要做的许多算法工作都非常简单,例如在GUI和程序之间发送数据,但这也算作一种算法。在列表框中插入元素是一种标准的插入算法,它本身具有一些问题,例如性能和列表结构操作。


1

只有为这些公司工作的程序员才能真正回答您的问题。在过去25年中,“算法简介”中涉及的算法种类可能占我编程时间的0.01%。当我需要数据结构或排序时,通常所提供的库或框架将满足我的需求。当我需要超快速FFT时,我会找到类似Intel Math lib的东西,而不是自己写一个。但是,我可以知道他们在Google所做的工作与我在职业生涯中所做的有何不同。Skiena的书“算法设计手册”之所以大开眼界,是因为他讲了有关战争的故事。您可以说他在很多工作中使用了算法。

以我作为独立编程顾问的经验,成功来自于三件事:1.与客户进行有效沟通; 2.编写有效的代码。3.管理复杂性

仅做数字1和2是不够的。如果代码不可维护(由编写该代码的程序员以外的其他人维护),那么它注定了失败。

3号是最难掌握的编程技能。它要求将思想纳入体系结构,设计和编码中。它需要掌握重构。它需要了解SOLID / DRY原理。如果我必须雇用一名已经阅读算法入门并致力于掌握它的程序员,或者雇用一个阅读The Pragmatic Programmer并致力于成为一个程序员,那么我会每次都雇用后者。(不是他们必须互相排斥)。


1

是。

计算机科学主要是算法(按百分比计)。

没有。

但这就是计算机的“科学”。计算机科学最常见的应用是软件工程。软件工程不是主要算法。它主要是关于创造艺术,追求完美的艺术,并且以积极影响当今存在的真实人们的生活为中心。尽管计算机科学可能具有某些相同的动机,但与软件工程相去甚远。

向一所主要的计算机科学大学的终身教授询问,关于编程最了解的关键是什么,它们可能会告诉您“算法和数据结构”

询问一家大型软件公司的高级开发人员,关于编程最了解的关键是什么,他们可能会告诉您“学会取悦客户”(这意味着要理解敏捷,像客户一样思考,按时发货和不断地使工作正常,等等)

可能看起来像语义,但是从我的理解来看,两者在实践和理论上都明显不同。


1

如果我必须选择计算机科学中最重要的一件事,那么我将选择抽象而非算法。


1

在计算机科学中,您所学到的概念只有在展示出来之后才有用。问题是需要解决的主要问题,因此算法是对如何解决问题的简要计划。因此,它是计算机科学界的主要关注点。

我认为计算机科学的几乎每个方面都需要算法。下面向我介绍一下计算机科学的各个领域以及它们使用的算法。

自动机

动力装置构造。将非确定性自动机转换为确定性自动机的算法。 Todd-Coxeter算法。生成陪伴集的过程。

人工智能

Alpha-beta。Alpha最大值加Beta最小值。广泛用于棋盘游戏。 蚂蚁算法。蚁群优化是一组受蚂蚁行为启发而解决问题,找到两个位置之间最佳路径的算法。 DE(差分进化)。解决切比雪夫多项式拟合问题。 在线产品评论中对讽刺句的半监督识别。识别推文或在线文档中的recognize窃或反讽的算法。这样的算法对于类人机器人编程也必不可少。

计算机视觉

缩影。用较小的图像或视频表示图像或视频。 计数图像中的对象。使用连接组件标记算法首先标记每个对象,然后对对象计数。 O'Carroll算法。通过对昆虫视力的数学转换,该算法评估了如何避开物体。

遗传算法

他们使用三个运算符。选择(选择解决方案),复制(使用选择的解决方案构建其他解决方案),替换(如果更好,请替换解决方案)。

健身比例选择。也称为轮盘选择,是用于选择解决方案的功能。 截断选择。选择解决方案的另一种方法,按适用性排序。 比赛选择。通过锦标赛选择最佳解决方案。 随机通用抽样。将个体映射到直线的连续段,以使每个个体的段在大小上与其适应度完全相同,就像在轮盘赌选择中一样。

神经网络

霍普菲尔德网。循环人工神经网络,用作具有二进制阈值单元的内容可寻址存储系统。他们收敛到稳定状态。 反向传播。用于训练人工神经网络的监督学习技术。 自组织地图(Kohonen地图)。使用无监督学习对神经网络进行训练,以生成训练样本的低维(2D,3D)表示形式。适用于可视化高维数据。

生物信息学

Needleman-Wunsch。对两个序列(蛋白质或核苷酸序列)执行全局比对。 史密斯沃特曼。Needleman-Wunsch的变体。

压缩

无损压缩算法

Burrows-Wheeler变换。预处理对于改善无损压缩很有用。 放气。ZIP使用的数据压缩。 增量编码。辅助压缩经常发生顺序数据的数据。 增量编码。Delta编码应用于字符串序列。 LZW。(Lempel-Ziv-Welch)。LZ78的继承者。从要压缩的数据构建转换表。由GIF图形格式使用。 LZ77和78. LZ进一步变化的基础(LZW,LZSS等)。他们都是字典编码员。 LZMA。Lempel-Ziv-Markov链算法的缩写。 LZO。专注于速度的数据压缩算法。 PPM(通过部分匹配进行预测)。基于上下文建模和预测的自适应统计数据压缩技术。Shannon-Fano编码。根据一组符号及其概率构造前缀代码。 截断的二进制文件。熵编码通常用于具有有限字母的均匀概率分布。改善二进制编码。 游程编码。主压缩用出现的次数替换相同代码的序列。 Sequitur。字符串的增量语法推断。 EZW(嵌入式零树小波)。渐进编码可将图像压缩成精度更高的比特流。也可能是有损压缩效果更好。

熵编码 编码方案,将编码分配给符号,以便使码长与符号的概率匹配。

霍夫曼编码。利用相对字符频率进行简单的无损压缩。 自适应霍夫曼编码。基于霍夫曼编码的自适应编码技术。 算术编码。高级熵编码。 范围编码。与算术编码相同,但查看方式略有不同。 一元编码。代表n代表n的数字,n代表零。埃里亚斯(Elias)三角洲,伽玛,欧米茄编码。编码正整数的通用代码。斐波那契编码。将正整数编码为二进制代码字的通用代码。 Golomb编码。熵编码的形式,最适合遵循几何分布的字母。 大米编码。 熵编码的形式,最适合遵循几何分布的字母。

有损压缩算法

线性预测编码。通过以压缩形式表示语音数字信号的频谱包络来进行有损压缩。 A-law算法。标准压扩算法。 Mu-law算法。标准模拟信号压缩或压扩算法。 分形压缩。使用分形压缩图像的方法。 转换编码。像音频信号或摄影图像这样的数据的数据压缩类型。 矢量量化。经常用于有损数据压缩的技术。 小波压缩。数据压缩形式非常适合图像和音频压缩。

密码学

密钥(对称加密)

使用密钥(或一对直接相关的密钥)进行解密和加密。

高级加密标准(AES) ,又称Rijndael算法作为。 河豚。由Schneier设计为通用算法,旨在替代老化的DE。 数据加密标准(DES),以前是DE算法。 IDEA(国际数据加密算法)。以前是IPES(改进的PES),是DES的另一种替代物。由PGP(非常好的隐私)使用。使用键对拆分为块的数据执行转换。 RC4或ARC4。流密码在协议中广泛使用,例如用于Internet流量的SSL和用于无线网络的WEP。 微小的加密算法。使用某些公式易于实现分组密码算法。 PES(建议的加密标准)。 IDEA的旧名称。

公钥(非对称加密)

使用一对分别称为公钥和私钥的密钥。公钥加密消息,只有私钥允许解密消息。

DSA(数字签名算法)。生成带有质数和随机数的密钥。被美国机构使用,现在是公共领域。 ElGamal。基于Diffie-Hellman,由GNU Privacy Guard软件,PGP和其他密码系统使用。 RSA(Rivest,Shamir,Adleman)。广泛用于电子商务协议。使用质数。 Diffie-Hellman(Merkle)密钥交换(或指数密钥交换)。在不受保护的通信信道上共享秘密的方法和算法。由RSA使用。 NTRUEncrypt。利用带卷积乘法的多项式环。

消息摘要功能

消息摘要是由哈希函数处理的任意长度的字符串或数据加密后得到的代码。

MD5。用于检查CD或DVD的ISO映像。 RIPEMD(RACE完整性基元评估消息摘要)。基于MD4的原理,与SHA-1类似。 SHA-1(安全哈希算法1)。SHA组最常用的相关加密哈希函数。由NSA机构设计。 HMAC。密钥哈希消息认证。 老虎(TTH)。通常用于老虎树哈希。

使用伪随机数的密码, 请参见。随机数发生器

密码技术

秘密共享,秘密分割,密钥分割,N个算法中的M个。

Shamir的秘密共享计划。这是基于多项式插值的公式。 布拉克利的秘密分享计划。本质上是几何的,秘密是m维空间中的一个点。

其他技术和解密

子集总和。给定一组整数,任何子集总和等于零吗?用于密码学。 Shor的算法。能够根据非对称函数(例如RSA)解密代码的量子算法。

几何

礼品包装。确定一组点的凸包。 Gilbert-Johnson-Keerthi距离。确定两个凸形之间的最小距离。 格雷厄姆扫描。确定平面中一组点的凸包。 线段相交。查找线是否与扫掠线算法相交。 指向多边形。测试给定点是否在给定范围内。 射线/平面相交。 *线/三角形相交。*射线/平面相交的特殊情况。 隐式曲面的多边形。用多边形表示近似隐式曲面。 三角剖分。从角度到已知点的其他点到点的距离的评估方法。

3D Surface Tracker技术。在考虑到隐藏表面的情况下在视频的墙壁上添加图像的过程。 贝尔曼福特。计算加权图中的最短路径(其中某些边缘权重可能为负)。 Dijkstra的算法。使用非负边权重计算图形中的最短路径。 摄动方法。一种计算图中局部最短路径的算法。 Floyd-Warshall。在加权有向图中解决所有对最短路径问题。 弗洛伊德的周期发现。查找迭代中的循环。 约翰逊。稀疏加权有向图中的所有对最短路径算法。 克鲁斯卡尔。查找图形的最小生成树。 普里姆的。查找图形的最小生成树。也称为DJP,Jarník或Prim–Jarník算法。 * Boruvka。*查找图形的最小生成树。 福特福克森。计算图中的最大流量。 埃德蒙兹·卡普。实施福特福克森。 无阻塞最小跨越开关。用于电话交换。 Woodhouse-Sharp。查找图形的最小生成树。 基于弹簧。图形绘制算法。 匈牙利。寻找完美匹配的算法。 着色算法。图着色算法。 最近的邻居。查找最近的邻居。 拓扑排序。对有向无环图进行排序,以使每个节点都位于其具有边的所有节点之前(根据方向)。 Tarjan的离线最不常见祖先算法。为树中的节点对计算最低的公共祖先。

图形

布雷森汉姆的线算法。使用决策变量在2个指定点之间绘制一条直线。 风景绘制3D风景。 * DDA线算法。*使用浮点数学在2个指定点之间绘制一条直线。 洪水填充。用颜色填充连接的区域。 图像还原。恢复照片,改善图像。 吴小林的线路算法。线抗锯齿。 画家的算法。检测3D风景的可见部分。 射线追踪。逼真的图像渲染。 Phong底纹。3D计算机图形中的照明模型和插值方法。 Gouraud底纹。在3D对象的整个表面上模拟光和颜色的不同影响。 扫描线渲染。通过移动假想线构造图像。 全局照明。考虑其他物体的直接照明和反射。 插值。构造新的数据点,例如数字变焦。 再合成器。删除照片上的对象,然后重建Photoshop和The Gimp使用的背景。重新合成器教程。 斜率截距算法。它是用于绘制直线的斜率截距公式的实现。 样条插值。减少龙格现象的错误。 3D Surface Tracker技术。 在视频中的墙壁上添加图像或视频,但要考虑隐藏的表面。

列表,数组和树

正在搜寻

字典搜索。参见预测搜索。 选择算法。查找列表中的第k个最大项目。 二进制搜索算法。在排序列表中找到一个项目。 广度优先搜索。逐级遍历图形。 深度优先搜索。遍历图一个分支。 最佳优先搜索。使用优先级队列以可能的重要性顺序遍历图形。 树搜索。*最好优先搜索采用启发式方法来提高速度的特殊情况。 统一成本搜索。树状搜索可找到成本变化最小的成本最低的路线。 预测性搜索。类似于二进制的搜索,其中搜索项的大小与搜索中的高值和低值有关。 哈希表。将关键字与未排序集合中的项目相关联,以在线性时间内检索它们。 内插搜索。参见预测搜索。

排序

二叉树排序。二叉树的排序,增量式,类似于插入排序。 Bogosort。效率低下的随机性办公桌卡。 气泡排序。对于每对索引,如果顺序混乱,请交换项目。 桶排序。将列表拆分为存储桶,然后分别对它们进行排序。概括信鸽排序。 鸡尾酒排序(或双向气泡,振动筛,波纹,往复运动,欢乐时光排序)。气泡排序的变体,它们在两个方向上均通过列表进行双向排序。 梳子排序。气泡排序的有效变化消除了“乌龟”,即靠近列表末尾的小值,并在两个值之间使用了空格。 计数排序。它使用列表A中的数字范围来创建此长度的数组B。B中的索引用于计算A中有多少个元素的值小于i。 侏儒排序。与插入排序类似,只是将元素移至适当位置是通过一系列交换完成的,如冒泡排序。 堆排序。将列表转换为堆,继续从堆中删除最大的元素,并将其添加到列表的末尾。 插入排序。确定当前项目在已排序项目列表中的位置,然后将其插入其中。 Introsort。还是内省型的。它从快速排序开始,并在特定递归级别切换到堆排序。 合并排序。分别对列表的前半部分和后半部分进行排序,然后合并排序后的列表。 薄煎饼排序。反转序列中某些前缀的元素。 鸽眼排序。按顺序将要排序的数组的所有元素填充到一个空数组中。 邮递员排序。邮局使用的桶分类的分层变体。 快速排序。将列表分为两部分,第一个列表中的所有项目都排在第二个列表中的所有项目之前。然后对两个列表进行排序。通常是选择方法。 基数排序。对与项目关联的键进行排序,或者通过处理数字对整数排序。 选择排序。选择剩余的最小元素,将其添加到排序列表的末尾。 外壳排序。通过使用值之间的间隙改善插入排序。 Smoothsort。参见heapsort。 随机排序。参见bogosort。

还有很多...


0

您已经在问题标题中问了两个问题,所以我将回答两个问题。

是的,计算机科学全都与算法有关。嗯...实际上这有点误导,因为计算机科学涉及很多方面,所以我重新表述。在工作环境中应用的计算机科学主要与算法有关。像Google,Facebook之类的公司,以及在华尔街所有吸引医生和开发人员的疯狂场所,都希望将高度复杂的问题简化为一种简单的形式,这本身就需要对数学和算法设计有深入的了解。

不,编程不仅与算法有关。编程是关于获取规范并将其转换为可编译以执行的代码。

答案的额外部分是:软件开发不是编程,但是许多人似乎混淆了这些术语并可以互换使用它们。编程仅仅是软件开发的一个较大过程的功能或技术。软件开发当然不仅仅与算法有关,还与解决软件问题以及应用合理的业务兼容流程以有效解决问题有关。虽然软件开发过程-甚至本身编程-可能是其性质的算法流程,这是不一样的是关于算法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.