今天在SO上有一个question,作者在采访中遇到了NP完全问题,显然他没有被告知这是一个问题。
提出这些问题的目的是什么?在询问这些事情时,面试官会有什么样的行为?证明?有用的启发式方法?如果它不是每个人都应该知道的众所周知的NP完全问题,那么问一个人是否合法? (有一个plenty of them)
答案 0 :(得分:16)
对我完全合法。如果你是计算机科学专业人士,很有可能你可以非正式地论证为什么问题似乎很难,或者(甚至更好)提供一个从已知的NP难题中减少的草图。
许多现实世界的问题最终都变成了NP难题,而且stackoverflow现在还有一个关于问题复杂性的问题,这个问题最终变得很困难(例如NP-hard)。它是CS专业人员工具箱的重要组成部分,能够识别和争论已知难以解决的问题。
答案 1 :(得分:10)
我没有看到问这样的问题。此外,不应期望程序员通过死记硬背来识别NP完全问题。但是,无论给定的问题是否为NP完全,他们都应该能够确定他们的算法可能很慢。
答案 2 :(得分:8)
当然,为什么不呢? NP-complete并不意味着无法解决,它只是意味着你的解决方案会很慢。您可能正在寻找候选人是否会选择暴力解决方案,或尝试动态编程解决方案。这类问题可能导致关于运行时和其他有用理论的问题。
答案 3 :(得分:7)
有些类型的面试问题在某些国家/地区是非法的,通常与个人详细信息有关,而这些问题与雇主的业务无关。除此之外,如果面试官认为这有助于了解受访者的能力,那么任何问题都是公平的游戏!
如果您正在招聘一个需要思考者而不仅仅是代码猴的职位,那么向申请人提出此类问题可能会有所帮助。谁关心一个问题是否是“众所周知”的NP?如果这个人很好,他会在分析问题时达成这种理解。这很可能是面试官想要看到的结果,或者申请人可以继续进行更多的预分析,并描述他如何暴力破解问题,或者他可以考虑采用哪些优化来使其更易于管理
答案 4 :(得分:3)
我没有看到这方面的问题,但我在一般的采访中对这些问题的用处有所怀疑。
作为面试官,提出这样的问题的好处是看到这个人如何处理问题,以及他们如何思考。如果你告诉他们说出来,你可以找到他们将如何处理一个棘手的问题。
话虽这么说,在一次采访中,大多数人并没有达到最佳状态 - 所以抛出像这样有点“棘手”的东西往往是矫枉过正的,IMO。
答案 5 :(得分:3)
我认为问一个你知道受访者不知道答案的问题是有效的。
每个人都遇到了他们不知道答案的问题。这类问题将让您深入了解受访者的内部流程。如果他们在逻辑上总结并开始制定正确的答案,即使它不是最好的动态编程算法,它表明他们可以很好地推理并发现答案。
此外,由于他们可能不了解问题的所有内容,因此这类问题可以让您了解受访者对寻求帮助或澄清的满意程度。
我认为回答这类问题的最佳方法是,如果遗漏或不为人所知,要求任何澄清,然后假设答案,指出为什么你认为这是正确的,以及为什么它可能不是'最好的解决方案。
答案 6 :(得分:3)
最好提出一个难以回答的问题,看看程序员如何解决问题。
但这一切都取决于采访者如何提出问题,并提示程序员如果不是数学天才就能找到解决方案(即看看他们如何推理,以及他们如何对诸如“这是一个好的开始”之类的问题做出反应,但是如果......“)而不是检测它们是否是自闭症并且可以在4.3秒内提供最佳解决方案。
值得记住的是,采访是非常紧张的事情,许多人发现很难回答这些问题 - 如果不让受访者承受过度的压力/压力,一个更简单的问题通常就足够了。
如果你这样做是故意试图看看他们如何处理压力只是愚蠢 - 这不是程序员在工作中必须处理的那种压力,所以你没有测试任何值得的东西。
答案 7 :(得分:2)
在没有告知受访者的情况下提出几乎不可能的问题是有意义的,但是在观察到解决问题的过程中,经常会问这个问题,以便您可以展示批判性思维技能,如何解决问题,以及如何处理压力或失败。
我被问到无法解决的面试问题,而且我认为我从未因此而“失败”。
答案 8 :(得分:2)
在面试中询问如何将数字分解是否公平?
那不知道是NP-C,但是没有多项式时间解[*]是已知的,所以当然不知道它在P中。
我认为我的问题和原始问题的答案都是“是”,并且出于同样的原因。有些问题没有解决方案可以很好地扩展,但无论如何都需要为某些输入解决。如果你需要能够处理这些问题的程序员,那么就有一个很好的方法让他们在面试中证明这一点,那就是给他们一个,看看他们是否会感到害怕。
如果有人声称拥有CompSci背景,那么他们甚至应该能够根据需要为某些NP-C问题提供良好的解决方案,例如通过动态编程解决背包问题。我认为要求申请人编写一个他们以前从未见过的问题毫无意义,并且实际证明它是NP完全的(例如通过减少背包到指定的问题)。每个公司都不需要很多程序员可以做到这一点(通常为0),你可能会发现,在尝试改变主题并在面试时间做一些更有价值的事情之前,候选人会保留多长时间。 ..
[*]以位为单位的输入大小的多项式,即。您经常会看到人们讨论整数问题的算法复杂性,例如在输入所代表的数字大小方面的因子分解,例如: “sqrt(N)试验部门”。但这不是NP和NP-C的定义方式。
答案 9 :(得分:1)
不,这是一个粗鲁的迹象,表明面试官只是喜欢处于权力地位。哈哈,彭!我知道答案,你不知道答案!而且,男孩,我是否喜欢让你试图想出来!
关于它作为一个有用的面试问题甚至可能稍微有效的唯一方法是,如果它是一个众所周知的问题,或者显然是NP完全的问题,并以鼓励讨论可行性的方式询问。
答案 10 :(得分:1)
在面试中将NP完全问题作为编程挑战并没有错。我只是看到在面试期间找到问题的多项式时间解决方案时出现了问题。
面试官应该想看看候选人如何处理各种情况 - 包括候选人无法找到简单解决方案的情况。 “不可能”的问题表明,当没有简单的解决方案时候选人会如何反应。候选人是否放弃了?候选人搜索了多少次尝试?这些解决方案有多远?候选人什么时候寻求帮助 - 以及如何?候选人是否抱怨问题“不公平”?
简而言之,这样的面试问题不是解决P = NP ......这是心理上的答案。
答案 11 :(得分:0)
如果在面试之前提出这样的问题(在面试中回答)我会说没关系......但是要解决这样一个难题,因为现场肯定不会做得好程序员,如果程序员做得好,只是意味着他们可以在现场采取行动(这对于编程来说并不总是最好的事情,因为设计事物需要花费时间并检查每个可能的缺陷)或他们已经看到类似的之前的问题。
编辑: 或者可能关于这个问题的讨论会很好,比如说制定一个行动计划,无论你是否完全解决它......并讨论如何可行以及是否存在快速(但困难)的方法等等。我不会说受访者应该在面试中写下超过50行的C代码来解决它
答案 12 :(得分:0)
那是邪恶的!
如果面试官在面试官中询问NP完整问题,他们可以合理地预期的唯一回答是受访者回答证明问题是NP完全的。在像大学作业问题这样的低压力环境中,这通常需要一个聪明的学生2-3个小时才能证明。证明本身可能需要几页才能完全写出来,也许几个小时的工作本身。在像面试这样的高压力环境中,您可以预期受访者可能甚至不会意识到这是完全正确的。
唯一合理的选择是受访者产生近似算法;但是,在这种情况下,面试官应该明确明确地明确他们罚款的近似值。
即便如此,大多数近似值只有2的正确答案。
我猜还有另外一种选择:受访者建议搜索类型算法可能是最合适的(例如,整数域优化问题是NP完全的,大多数近似算法使用分支和边界搜索旋转在单纯形算法上产生不错的结果。)
答案 13 :(得分:0)
我更愿意让他们证明P!= NP或P == NP。有一天,候选人会回答,我会偷他们的答案而闻名!
但更严重的是,我认为这是完全公平的。大多数NP完全问题很容易解决,它们运行得非常慢。但是,除非工作要求他们对复杂性理论有很多了解,否则他们需要证明的是他们理解解决方案会很慢。如果他们知道非多项式时间,那么奖励积分,如果他们知道NP完全就是金星。