有能力的程序员应该能够提出自己的最短路径算法吗?


58

我作为计算机程序员的能力正遭受信心危机。

昨天,我尝试提出自己的图形最短路径算法,几个小时后,我简单地投入毛巾,学习了Dijkstra的算法。

这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?

哦,好吧,至少我能够重塑气泡排序:D


7
做过20年UI的人可能很难在短时间内从另一个域中找到问题的解决方案。
编码器

38
我认为在SE网站上花费大量时间会给所有人带来信心危机!(这不是一件坏事)。生活中的幸福正在接受事物与改变事物的愿望之间找到完美的平衡。
TrojanName 2011年

2
我自己无法重新发明它,但我试图记住它是如何工作的。请确保你理解这个动画:upload.wikimedia.org/wikipedia/commons/2/23/...
工作

6
@天才的布莱恩悲剧。您再也无法再成为最优秀的人了。
宫坂丽

7
一个好的计算机科学家应该但不一定是计算机程序员或软件工程师
Neil McGuigan

Answers:


118

优秀的程序员应该意识到,已经编写了一种出色的算法来解决问题,并且不会浪费时间重新发明轮子。

我怀疑Dijkstra在几个小时内提出了最短路径算法,因此这对于确定某人是否是“优秀程序员”似乎是一个很高的标准。


25
@Nakilon-忽略现有解决方案的程序员只是在浪费时间,如果他们没有在浪费时间,那就是在制定更糟糕的解决方案。请参阅:每个人都使用自己的密码哈希方案与bcrypt。
恢复莫妮卡

10
@GSto:根据维基百科,Dijkstra在不到一个小时的时间内提出了该算法:20分钟,这是对维基百科的第一注:en.wikipedia.org/wiki/Dijkstra%27s_algorithm
woliveirajr 2011年

9
这是一个相对简单的算法,但是Dijkstra非常有才华,并且接受过理论物理学和高等数学方面的培训。几年没有什么比编写证明来提高自己设计算法的能力更好的了。
凯文·克莱恩

19
@woliveirajr-好吧,我确定牛顿花了相同的时间来得出运动定律。经过20年的思考。
鲁克

6
@Nakilon-是的,这就是每个人都用C编写所有内容的原因,因为否则,您只是使用别人的高级语言的程序员。哦,等等,我的意思是汇编,否则您只是在使用别人的底层语言。哦,等等,我的意思是扳动开关来改变电路,否则您只是在使用别人的指令集。或者您知道,您可以仅使用现有的东西并创建新的东西。当您可以发明新的东西(例如使用它的程序)时,为什么还要浪费时间重新发明Dijkstra的算法?
恢复莫妮卡

54

这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?

首先,您可能将编程与理论计算机科学混淆了。出色的程序员需要计算机科学方面的基础知识,但他并不需要出色。Dijkstra在计算机科学领域非常出色。

其次,我希望对图有深刻理解的任何人经过一番思考后都会发展自己的图遍历。但不是最短路径算法。Dijkstra的算法特别复杂。一旦理解,它就非常明显。但是大多数事情都是这样。

在尝试了一些东西并花了一些时间之后,您可能会得出某种最短路径算法。但是,如果要花费几个小时甚至几天的时间,请不要失望。这是完全正常的。

(注意:好吧,您应该能够在几个小时内就将问题强行解决,但这即使在相当小的图形上也不会产生有效的算法。)


56
别担心,如果蛮力不起作用,那么您只是没有足够地使用它。
罗比

2
+1用于说明理论CS与编程之间的差异。编程是解决现实世界中的问题的方法,理论上的CS可以支持编程。但是,理论上的CS在大多数人的日常编程中并不是100%必需的。
菲尔,

17

这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?

绝对不现实。人们不仅会在几个小时内“浮现”算法。这需要大量的努力和工作。引用博客:

本特利在《 Programming Pearls》中引用Donald Knuth的话说:“虽然第一次二进制搜索是在1946年发布的,但是直到1962年,才出现了对n的所有值都正确工作的第一次二进制搜索。”

而Bentley的版本在用于大型设备时也存在问题。

此外,优秀的程序员知道他可以使用哪些工具以及何时使用这些工具。您不会因独创性或做不同的事情而获得加分-您希望它能正常工作。


1
杰克(BlackJack),我必须加入这个论坛来指出本特利没有说出您所说的话:努斯(Knuth)说了,本特利则引用了他。当我阅读您的评论时,我认为您说的很对,但是我想验证我的消息来源,却从未听说过本特利。但是,我听说过Knuth,可以相信他的话。请下次更好地检查您的资源。
理查德

8
@Richard-评论是“ Bentley说,在Programming Pearls中。” Knuth是第一个这么说的人,但是我的消息来源是Programming Pearls,而不是TAoCP,所以我写了Bentley的文章。我并没有声称Bentley是发起人-我只是引用书中所说的话。书中没有大量内容是作者自己发明的,所以我不明白您为什么会这样看。
BlackJack

通过将报价单仅归因于Bentley,您就不能归功于Knuth的信誉;如果“ Bentley's”陈述是错误的,则意味着您将Bentley置于产生错误信息的位置,而不仅仅是散布该信息。严格来说,您没有说出宾利所说的话:如果有,您会说:“宾利说,努斯说过……”。引用在这里被很好地使用,但是它是从引用的上下文中删除的。
理查德

3
@Richard-我列出的引文直接来自博客,直接引自该书(从字面上看,我认为这是第一版的第57页)。如果您对声明有太多疑问,请与博客作者联系,并请他进行更改。
BlackJack

1
@Richard和BlackJack:你们都是正确的,但是原始作者的署名增加了声明的可信度和上下文。我的编辑应该足够了。
史蒂文·埃弗斯

9

您将不可能找到比您可以选择的解决方案更好的解决方案。

提出一种比“最佳”算法(在您的情况下,最短算法)更好的算法并不是每个人都可以做的。可能甚至不可能。

一个好的程序员应该能够理解该算法背后的逻辑,以及为什么它比尝试解决相同问题的其他算法更好或更糟(或者根本不足以解决该特定问题)。

他还应该能够知道这是否真的是解决特定问题的最佳方法。

无论如何,如果您想练习,仍然可以尝试编写自己的算法实现,尝试用自己的思想解决问题。可能不是最好的方法,但这是解决问题的好方法。


6

这让我想起了我读到的有关“软件工程”(我称之为编程)与其他工​​程学科之间的区别的内容。想到它,我认为那是原始的《设计模式》一书。我确定这里有人可以引用他的头。

无论如何,关键是(尽管不完全针对算法设计)是将工程学科进行了编纂。没有任何土木工程师可能会花时间尝试重塑工字梁,但是程序员一直都在这样做。问题(我意识到我只是在回应许多人的观点)是,这种行为是浪费和容易出错的,并且比解决方案更能为我服务。

计算机科学使我开始编程,我俩都爱。但是,我比计算机科学家要好得多。我永远不会指责您没有能力,因为您无法在一个下午重新发明Dijkstra的算法。如果您无法识别可以通过最短路径图算法解决的问题,我会质疑您作为程序员的能力。

就是说,我相信思考算法并尝试设计和实现新算法(可能)很有趣,并且(几乎)总是很有启发性。我只是试图将CS时间与编程时间完全区分开。对于程序员而言,我们(特别是带薪的)时间最好用于解决实际问题,而不是抽象问题。此外,CS时间几乎总是粉碎我的信心。


噢,具有讽刺意味的是...现在我可以在任何地方发表评论了,我应该删除为我赢得特权的答案吗?为此应该有一个徽章。
基思·莱恩

还有就是- 纪律但是,如果你的名声被重新计算你会回落到1
ChrisF

是的,这正是我的观点...那时,IMO将超越纪律。如果我删除将答案转换为评论,则可以全部使用...我建议使用一个名为UberDisciplined的新徽章来删除所有会导致您返回全新用户状态的删除。:)
Keith Layne

3

您不会注意到其他所有人所做的相同事情。我认为这只是我们必须生活的事实。其中大部分归因于您的被动学习和由此产生的心理模型。

我认识一些非常聪明和有能力的程序员,他们必须在学校里教过德摩根的法则,然后才能始终如一。我碰巧自己弄清楚了Dijkstra的算法(我不得不承认我对此感到有些骄傲),但是花了我很长时间才弄清气泡排序。

更著名的是,您会以为爱因斯坦是打结理论专家的爱因斯坦,直到他十岁左右时,他才系上自己的鞋带。

您很有可能在不知不觉中重塑许多其他人从未想过的东西,如果不是明确地教他们的话。


3

对于大多数答案,我希望有所不同。虽然我不希望任何级别的程序员都能亲自提出Dijkstra的算法,但我绝对希望他提出解决问题的任何方法(有效或无效)。

例如,您作为附带评论说,您可以自己提出气泡排序。我知道它是最臭的排序算法,但是您找到了解决问题的方法,这就是我所希望的程序员能够做到的:找到解决问题的方法。

当然,研究和寻找其他人提供的解决方案也是可行的,但那一点极端是一个不考虑自己,并且其程序是Google搜索纲要的人。

我认为我听起来比实际想要的要苛刻,但我的意思是:我希望程序员具有足够的创造力,可以提出解决问题的方法,即使该解决方案有故障或混乱。


因此,回到您的情况,我认为您不必提出Dijkstra的算法,但是如果您能够编写一种算法来尝试几种可能性并找到最短路径而又不以无限循环结尾的能力,那你就得到我的认可

(顺便说一句,我的认可与免费洗车优惠券的重要性顺序相同。)


3
我同意,是的,有能力的程序员应该能够提出冒泡排序或类似的冒泡排序。甚至可能会花费大量时间实际实施并尝试一下,也许只是为了更好地理解问题。但是我认为需要说的是,没有合格的程序员会继续在生产代码中实际使用它。这样做就是让您的客户明年回来的抱怨,因为他们现在有更多的数据要处理,所以您的O(n!)算法将花费两倍于宇宙的时间来完成...
Thomas Padron-McCarthy

谁在乎您是否可以发明算法,如果您什至不知道算法何时糟透了呢?对于程序员而言,自我批评与创造力同样重要。我宁愿与一个程序员迅速合作,当他们知道自己的解决方案花费的时间太长或不太可能是最佳方案时,而不是与一个希望重塑每个轮子的程序员合作,因为这样做会伤及他们的自我意识,而不是与他们合作。
宫坂丽

我在这两点上都同意,但是我认为我们正在衡量两个不同的方面。一种是程序员解决问题的能力(我认为这是必不可少的)。另一个是自我批评(我确实认为这很重要,但对编程而言并非如此:终身)和判断代码的能力(非常可取)。我还要说,永远采用的解决方案不是真正的解决方案,对吗?;)
Alpha

2

是的,他/她应该。

也许在道德上等同于冒泡排序,但我确实认为,一个好的程序员应该至少能够提出可行的建议,尽管效率可能不高。

毋庸置疑,如果出现特定问题,那么好的程序员将首先查看是否有图书馆为他做这件事,或者哪个发布的算法可以做到这一点并且易于实现。

当然,许多编程任务的难度要小得多,并且并不是每个人都需要能够解决这些难题。但是您会希望团队中有一个这样的人,因为您可能会遇到一些特定于项目的复杂问题,而您不能依赖以前的科学研究工作。


1

别担心

作为Perl程序员,我将永远不会彻底改变轮子。这就是CPAN的工作。如果有一个简单的,受良好支持的算法或模块,我们将使用它。如果没有好的模块,那么我们发明轮子。那是Perl最伟大的事情之一。

所以我的意思是这样的:

  1. 我不建议您重新发明轮子,但是当您这样做时...
  2. 尝试不要完全重新发明它并...
  3. 如果您做不到,请不要担心。这就是为什么我们有一个编程社区:-)。

这并不是要重塑,而是要解决一般的问题。如果您不尝试自己发明事物,那么您将永远无法改善。
尼尔斯

0

图论及其应用的算法在表面上看起来很简单,但通常相距甚远。您会认为,非交叉(平面)图的形成很简单,例如,乍一看。去年,我广泛研究了这个问题(通过消除Kuratowski子图来实现平面性)。根据经验,我可以告诉您,编写这些算法的人员通常会花费其博士学位研究的时间来进行研究,有时还需要团队进行研究。作为研究人员,这是他们在这段时间内唯一的工作重点。认为我们的现场工程师可以期望得到同样的结果是不明智的。正如这里的其他人正确地说的那样,一旦解决方案出现在您面前,它就非常明显。情况似乎总是如此!


0

这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?

我要说的是,如果您能够独自发明一个解决诸如最短路径之类的著名问题的算法,那么您将是一个糟糕的程序员。

这意味着您将忽略最短路径问题的悠久历史,从1955年发布的O(| V | ^ 4)算法到1984年发布的O(E + V log V)算法(即Dijkstra的算法)斐波那契树算法)。您几乎可以保证比已设计的算法做得更糟。更糟糕的是,您的算法很可能存在漏洞或错误,从而使其不正确。此外,与重用现有算法相比,您几乎肯定会花更多的时间来思考,实施和测试算法。

将算法设计留给算法设计者。程序员是他们结果的消费者。程序员结合了算法并将其用于实际任务。警务人员不必为了工作或成为一名好警官而重塑法律。

我什至鼓励您使用专家做出的实现,而不是自己为任何中等复杂的算法实现算法。这很可能是正确的,有可能它们使它比您以往更快,并且为您节省了大量时间。这是特别的加密算法真实的,因为你得到安全的额外需求,通常只有专家可以为您提供。


密码算法很容易验证其实现;已知的正确测试向量对于任何公开指定的算法都是一角钱,无论正确与否。(使用自定义实现可能会获得次优的性能,但是,如果它是正确的,则可以解决。)密码术中的难点是诸如随机数生成,正确处理原始密钥和内存中的密钥扩展表之类的事情。处理用户输入(盐腌等),存储某些内容以让您确定解密的数据是否有效,等等。
的CVn

我一直在考虑定时攻击等方面的内容,几乎没有程序员知道这些东西。这并不总是一个问题,但仍然是一个重要的问题。而且,组合密码原语通常不会像人们期望的那样工作,这也是安全性的重要组成部分。
亚历克斯(Alex)10 Brink

虽然定时攻击等当然是一个有效的问题(不仅是在密码学中),但我认为实现的易感性对其正确性没有影响。而且,有很多很多方法可以使加密失效,而不仅仅是启用定时攻击。布鲁斯·施耐尔(Bruce Schneier)曾经主持过他的《狗屋》系列。我最近没有看到任何内容,但是那里有很多警告示例。google.com/search?q=site%3Aschneier.com+%22the+doghouse%22
CVn
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.