对于程序员来说,知道如何从内存中实现QuickSort / MergeSort算法有多重要?[关闭]


58

我正在查看笔记,偶然发现了各种排序算法的实现。

当我尝试理解QuickSort和MergeSort的实现时,我想到,尽管我以谋生为目的进行编程,并认为自己做得很好,但是我没有摄影记忆,也没有足够的脑力去实现这些算法而没有依靠我的笔记。我只记得其中一些算法是稳定的,而有些则不是。有些需要O(nlog(n))或O(n ^ 2)时间来完成。有些内存比其他内存更多...

如果不是这样的话,我会觉得我不应该得到这份工作,因为我的职位不需要我使用除标准API之外的任何排序算法。我的意思是,你们中有多少人具有编程职位,实际上您必须自己记住或想出这类东西很重要?


13
您需要记住,存在一个解决方案以及何时使用它。然后进入文档并实施它。如果您不了解quicksort或mergesort,您仍然会使用Bubblesort并观察程序进行爬网,并在数据增加时提出低于标准的解决方案。
Pieter B

1
除了下面提到的良好答案外,还请注意,许多公司要求(1)了解此类算法的复杂性,(2)能够熟练地在黑板上实现它们。
sakisk 2012年

3
我相信重要的是要记住这些算法,因为Google经常会离线。:o
Lee James

您需要了解它们的性能,用例等。了解技术的内在实现是仅技术公司在采访中需要的。
sakisk 2014年

@PieterB,我不同意。不需要知道Google的“ mergesort”和“ quicksort”“最佳表现排序算法”
hyankov

Answers:


117

让我们问阿尔伯特,看看他在这个问题上要说些什么:

“我不需要一无所知,只需要知道在哪里找到它,何时需要它”

- 爱因斯坦Albert Einstein)释义

阿们,阿尔伯特弟兄,阿们。

一旦对任何特定学科(排序,搜索等)的基本算法进行了很好的调查,您就可以忽略实现细节,直到您真正需要算法为止,在这种情况下,您可以查找或使用算法。预先存在的lib。25年前,我使用B *树构建了一个主要的搜索系统,但是今天我需要使用RTFM才能很好地使用它们。



9
那如何回答这个问题?他说:“我并不需要知道的一切”,他并没有说“我不需要知道的任何事情。” 一些技能是基本技能,整个问题是关于某条信息是否属于基本技能类别。
康拉德·鲁道夫

1
认为目标是记住快速排序就是错过了问题的重点。当然,在现实世界中,如果需要通用的快速排序,则可以使用库例程或查找代码并将其复制。测试是查看您是否了解递归,循环不变式等,并要求您快速记下排序算法只是该知识的一个非常简单的演示。如果您不能当场重新导出20行快速排序,那么您例行的实际上效率低下或错误的甚至不知道的事情有多少?
拉里·格里兹

3
@Larry:我想我已经忘记了很多程序员对算法细节的了解,而从头开始进行快速排序就是其中之一-出于很好的理由-我选择阅读高级内容并使用高级语言,而不是而不是陷入底层的实施细节中。坦白说-我不在乎我正在使用哪种库例程-就我而言,它可以使用pixy灰尘和妖精。文档将告诉O()确定大小,这是我需要知道的全部内容。
mattnz

2
@mattnz:对您的“ O()调整大小”进行了一些迟来的跟进。我很难学到的一件事是,对于大型数据集,不良的引用局部性可能完全使O()不堪重负。您可能有一个算法,即O(n log n),但是如果您遇到很多缓存未命中或(上帝禁止)您击中磁盘的情况,那n log n将只是一种喜欢的记忆。
彼得·罗威尔

49
  1. 这不是真正要记住的问题。这是一个深刻理解一般算法类别(例如分治法)的问题。如果您真的了解分而治之,那么您就不必记住快速排序。您可以根据需要重新派生它。此外,真正的收益甚至不在于您自己能够重新推导快速排序,而是您可以识别何时可以解决分而治之的问题。

  2. 并非所有编程作业都相同。一些工作需要对算法有深刻的了解,一些工作需要了解类型理论的人员,而另一些工作则需要可以从Web表单中抓取数据并将其移至数据库的人员。有些工作甚至需要同时具备所有这些技能。您想从事哪种工作?


5
我认为不记得QuickSort就不可能了解QuickSort。这不是一件复杂而神秘的事情,而只是两个通用思想的结合。同样的事情适用于合并排序,但您只有一个主意:P
drxzcl 2012年

我不同意第二点。所有工作都是一样的,只是面试官改变了。这个人非常了解排序,并且认为每个优秀的程序员都必须知道排序,因为那是他所知道和关心的。
IAdapter 2012年

2
@IAdapter,肯定是您在开玩笑!我从我自己的经验中知道,我为收缩包装软件公司编写TROFF宏的第一份工作所需的知识和技能与我在计算生物学实验室的当前工作所需的知识和技能有很大不同。
查尔斯·格兰特

@ CharlesE.Grant在大多数情况下都不会检查您是否具备完成工作所需的技能(我不记得我被问到的最后一个javascript / css问题,我也做了webapps)。
IAdapter 2012年

10

我认为,您唯一需要记住的就是在申请工作时,您必须当场提出答案并且没有外部资源。

我已经让同事重写了quicksort和诸如此类的东西,但是我一直告诉他们要回到使用该语言内置的排序功能。我确实知道,根据我们从事的项目类型,我们确实必须记住其他算法,因为它们通常不包含在标准库中,但是排序并不是一种出现的算法,因为它通常是语言内置的。

但是,当我们确实需要记住这些算法时,我们通常会去找Google或一本书,通常它不是在寻找特定的实现,而是对我们的问题来说最好的实现。


6

只需记住哪种算法在什么情况下有用,就足以在您的工作中提供帮助。实际上,大多数编程工作不需要记住方法,相反,他们对遇到问题时识别算法模式的方式很感兴趣。

实际上,大多数编程博客/文章中都有关于算法主题的大量信息。因此,记住准确的实现并不重要。最有价值的信息将是关于可以使用哪种类型的算法以及它们可以解决哪些特定问题的基本思路。在知道要查找的内容之后,立即搜索确切的实现非常快。

总而言之,最好总是知道您要查找的内容以及引用在哪里 -这将指导您使用源。


5

确切的实现不是很重要。但是mergesort / quicksort背后的原理-递归,分区等是非常基本的原则,每个程序员都应该理解。一旦理解,这些算法实际上非常容易用语言描述。

您是否可以查找它还是可以谷歌搜索并不是一个真正的问题,而是程序员是否了解这些问题解决技术并能够应用于其他情况。


3

我在这个问题上有两个想法。我认识许多程序员,他们不知道排序算法是什么,但是做得很好。我也相信理解原则才能真正理解领域。

对我而言,在这个问题上很难有一个公正的答案,因为我从事编程已经很久了,我可能忘记了我目前知道的更多算法-但我仍然知道此问题中提到的排序算法。我认为敏捷的思想领袖(例如Ron Jeffries,Alistair Cockburn)在这个想法附近有一些好的想法(例如Shu-Ha-Ri)。

总结一下这个棘手的问题:绝对使用API​​(NIH是开发人员不成熟的标志),但始终了解基本原理。我希望这有帮助。


2

无论您是Donald Knuth的粉丝还是想成为下一个Larry Page的人,排序和搜索都非常重要。根据您所从事的业务以及可以在候选人中争取的竞争水平,我建议您在面试中包括以下一些概念。

排序

  • 某种排序算法的草图。
  • 列出排序算法的一些示例。
  • 比较/对比具有不同性能特征的两种。
  • 如果他们没有提到内存使用,请询问一下。

正在搜寻

  • 尽可能多地命名搜索算法。
  • 比较/对比两种搜索算法。
  • 绘制除线性搜索以外的任何搜索。

有人可能会说,除非这些工作在没有互联网连接的荒岛上,否则为这些算法要求代码是过大的。另一个考虑因素是,如果您有30分钟的时间,并且想问其他问题,那么对于许多候选人来说,实施排序可能会花费您大量的时间。


我曾经以为让人们去采访采访是很愚蠢的,但是您只是不相信有看似很棒的简历的人,并且用鲜艳的色彩回答“社会”问题,但是对于他们的生活来说,谁却不能记下“ strcat”或其他一些简单函数的正确实现。有好几次,这使我免于雇用某个人,如果不是因为愚蠢的编码问题,那可能会引起无尽的悲伤,并无能为力地拖垮了团队。
拉里·格里兹
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.