【问题标题】:Is it correct to ask to solve an NP-complete problem on a job interview? [closed]在求职面试中要求解决 NP 完全问题是否正确? [关闭]
【发布时间】:2010-12-16 00:44:00
【问题描述】:

今天在 SO 上有一个question,作者在一次采访中遇到了一个 NP 完全问题,显然他没有被告知这是一个问题。

问这些问题的目的是什么?当问这样的问题时,面试官期望什么行为?证明?有用的启发式方法?问一个人是否不是每个人都应该知道的众所周知的 NP 完全问题是否合理? (有一个plenty of them

【问题讨论】:

  • 您可以争论这些问题是否合法,但潜在的雇主可能会决定问他们。你如何回应他们是最重要的。
  • @Robert Harvey,嗯,这就是我所说的“面试官期望什么?”。
  • 他指的是这个操作系统问题:stackoverflow.com/questions/1720737/…
  • 只要说“我解决不了这个问题,其他人也解决不了”。如果你的公文包里有 Garey/Johnson 的副本并向他们展示图纸,效果最好:-)

标签: algorithm np-complete


【解决方案1】:

我认为问这样的问题没有任何问题。此外,不应期望程序员死记硬背地识别 NP 完全问题。然而,无论给定问题是否是 NP 完全问题,他们都应该能够识别出他们的算法可能很慢。

【讨论】:

  • 真的吗?他指出的矩阵示例显然相当于计算旅行商旅行,因此它必须是NP完全的:P
  • @Ben S,你们之间感觉问题是 NPc,而你 证明它可能会过去 10 到无限分钟。
  • @Ben S:如果它明显等同于 TSP,那么我吃午饭时比我想象的要迟钝。我什至看不到从矩阵问题解决方案到 TSP 解决方案的明显映射。如果你在这句话中幽默,那么它并没有很好地转化为互联网。
  • 我相信这显然等同于懒惰、机会主义的旅行商问题。推销员可以跳过城市的地方,旅行成本可能是负数(可能是因为拉斯维加斯在路上?或者拜访私生子?)当然,我只是编造了这个问题。但是,这显然是 NP 难的——我只是太懒惰和投机取巧,现在无法输入证明。
【解决方案2】:

不,这很粗鲁,表明面试官只是喜欢处于权力位置。哈哈,佩恩!我知道答案,而你不知道!男孩,我喜欢让你想出它来蠕动吗?

关于它作为一个有用的面试问题甚至稍微有效的唯一方法是,它是一个众所周知的问题,还是一个在某种程度上明显是 NP 完全的问题,并且以一种鼓励讨论可行性的方式提出。

【讨论】:

  • 或者我想如果手头工作的一个极其重要的资格条件是“申请人在压力下忍受不合理的要求的程度如何”,那么它可能是可行的。
  • 我不这么认为。这种问题可以让你了解受访者对他不习惯解决的问题的反应。它还可以让您了解他们是否愿意在需要时询问更多信息。
  • 您可以在不要求解决 NP 完全问题的情况下完成这两件事。要求他们这样做很好,但是,如果你想看看他们如何应对他们不习惯的问题,看看他们是否愿意询问更多信息,并成为一个笨蛋.
  • 呃,所以按照你的说法,面试官不应该问他知道答案而被面试者不知道的问题? (NP-hard 问题在实践中有时/经常以不明显的形式出现。)
  • 但是任何体面的程序员根本不会认为多项式时间解决方案是一个很大的解决方案。所以他们可以想出一个解决方案,然后因为它太慢而打折。然后努力想出不存在的快速解决方案。面试官总是会咯咯笑,因为他知道用不慢的解决方案是不可能解决的。面试应该是评估申请人,而不是满足面试官的智力虐待。
【解决方案3】:

如果在面试前提出这样的问题(面试时回答)我会说没关系..但是像现场解决这样一个难题,绝对不是任何人都能做好的程序员,如果程序员做得好,那意味着他们可以当场采取行动(这对于编程来说并不总是最好的事情,因为设计事物需要花时间并检查每一个可能的缺陷)或者他们已经看到了类似的情况之前的问题。

编辑: 或者可能讨论这个问题会很好,比如制定一个行动计划,无论你是否完全解决它......并讨论如何可行以及是否有快速(但困难)的方法等等。我不会说被面试者必须在面试中写下超过 50 行 C 代码才能解决它

【讨论】:

    【解决方案4】:

    当然,为什么不呢? NP-complete 并不意味着无法解决,它只是意味着您的解决方案会很慢。您可能正在寻找候选人是否会选择蛮力解决方案,或者尝试动态编程解决方案。而这类问题可能会引发关于运行时和其他有用理论的问题。

    【讨论】:

      【解决方案5】:

      我不认为这有什么问题,但我确实有点质疑这类问题在一般面试中的用处。

      作为面试官,提出这样的问题的好处是可以了解对方是如何处理问题的,以及他们是如何思考的。如果您告诉他们说出来,您可以了解很多关于他们将如何解决难题的信息。

      话虽如此,在接受采访时,大多数人都没有处于最佳状态 - 所以扔一些像这样有点“棘手”的东西通常是矫枉过正,IMO。

      【讨论】:

        【解决方案6】:

        对我来说完全合法。如果您是计算机科学专业人士,那么您很有可能可以非正式地论证为什么这个问题看起来很难,或者(甚至更好)提供一个已知 NP 难题的简化草图。

        许多现实世界的问题最终被证明是 NP 难的,而且 stackoverflow 也时不时地对问题的复杂性提出疑问,而这最终被证明是一个困难的问题(例如,NP 难)。能够识别和争论已知难以解决的问题是 CS 专业工具箱的重要组成部分。

        【讨论】:

        • "提供一个已知 NP 难题的简化草图" — 请注意,您需要简化 from 一个 NP 难题,而不是 to i> 一个 NP 难题(通常太容易了)。
        • 提供一个简化为已知 NP 完全问题的草图通常很困难。你想在一个问题上花多少时间,你想对某人是否有一批 NP 完全问题在记忆中并能在面试中拿出证明草图给予多大的重视?
        • @David ShreevatsaR 你说得对,我会编辑和修复
        • 我花了整整 6 个小时才能够在数学上识别出问题所在。在那之后花了5分钟才发现它是NP完成的。而且我仍然不知道应该如何为 6 个变量求解丢番图方程。我在设计企业架构、Paxos、分布式、CRDT、矢量时钟等方面编写了 26 年的代码。我知道张量产品、GR、NN、QM。你没看到模式吗,先生。数学家?这里有偏见。
        【解决方案7】:

        我认为问一个你知道受访者不知道答案的问题是有效的。

        每个人都会遇到他们不知道答案的问题。这类问题会让你深入了解受访者的内部流程。如果他们在逻辑上得出结论并开始制定正确的答案,即使它不是最好的动态规划算法,也表明他们可以很好地推理并找到答案。

        此外,由于他们可能对问题一无所知,因此这类问题可以让您了解受访者在寻求帮助或澄清方面的舒适程度。

        我认为回答此类问题的最佳方法是要求澄清是否缺少某些内容或不为人所知,然后假设一个答案,指出您认为它是正确的原因以及它可能不正确的原因最好的解决方案。

        【讨论】:

        • 不完全一样,是一位为她的 B.Sc. 努力过的同事。在她的大一入门课程中,计算机科学博士被要求计算第四个阿克曼数 (en.wikipedia.org/wiki/Ackermann_function>)。它超出了当前的硬件范围,所以她失败了,不久后沮丧地放弃了 CompSci。这可能是有意为之,并且取决于您如何看待它,这可能是一个很好的结果。
        • @Carl:我认为这说明了要求不可能(“计算第四个阿克曼数”)和仅仅要求没有解决方案的问题之间的区别,(“给出一个算法计算阿克曼数”)。解决一个 NP 完全问题可能非常容易(例如,通过穷举搜索)。当输入大小发生变化或未指定时,您会遇到紧急情况。
        • 每个人都在谈论这个矩阵问题的动态规划解决方案,但没有人给出解决方案。对我来说,这似乎不是 DP 问题。
        • @Peter:这个答案:stackoverflow.com/questions/1720737/… 是一个动态规划解决方案。
        【解决方案8】:

        在某些国家/地区,有一类面试问题是非法的,通常涉及与雇主无关的个人详细信息。除此之外,如果面试官认为这有助于了解受访者的能力,任何问题都是公平的游戏!

        如果您正在招聘的职位需要思想家而不仅仅是代码猿,那么向应聘者提出此类问题可能会很有用。谁在乎一个问题是否“众所周知”是 NP?如果这个人很好,他会在分析问题时得出那种理解。这很可能是面试官希望看到的结果,或者申请人可以继续进行更多的预分析并描述他将如何暴力破解问题,或者他可以考虑应用哪些优化以使其更易于管理.

        【讨论】:

        • NPc 问题存在一个问题:它们的 NP 完备性需要很长时间才能被证明。那么面试应该多长时间?
        • @Pavel:我完全同意,我已经证明了几个 NP 完全问题,其中大多数问题最多需要我几个小时才能减少,有些需要几天的思考。我认为大多数回答“是的,问任何问题都很好”的人可能以前没有做过困难的减少。
        • 但是只有在需要证明的情况下才会有问题,雇主可能只是期望“这似乎是NP”然后与您讨论。
        • 这取决于面试的地点。对于顶级实验室或大学,如果这似乎是问题中最有趣的方面,我希望通过去白板并尝试草拟证明来获得积分。不过,我会首先概述启发式解决方案,并确保我要求他们阻止我——但通常这不是问题。我同意有时这些可能需要很长时间(或永远),但我肯定会在几分钟内勾勒出有希望的减少(通常来自 3SAT)。雇主提出这些问题是为了了解您的想法。他们当然想这样做!
        • @Pavel,gmatt:我认为你正在摧毁一个稻草人。没有人会期望您提供完整且完善的 NPC 证明。因此,谈论这应该花费的时间是没有意义的。然而,对于一份合格的工作,你的面试官很可能期望你考虑并至少直观地认识到这种情况。有很多工作都需要这种能力,尽管其中许多工作永远不会(不仅仅是在面试中)期望得到正式的证明。
        【解决方案9】:

        在不通知受访者的情况下提出几乎不可能的问题有点意思,但在观察到的问题解决中,经常会问这个问题,以便您可以展示批判性思维能力、您如何解决问题以及您如何处理压力或失败。

        我被问到一些我无法解决的面试问题,而且我认为我从来没有因此而“失败”过一次面试。

        【讨论】:

        • 好评论,但我注意到 NP-complete not 几乎不可能。绝对有可能提出解决 NP 完全问题的方法;只是它们不会缩放。但是,如果面试官特别要求一种能够处理大量问题实例的算法,那么,是的,那意味着......
        • 是的,我应该说得更好。在典型的软件开发人员面试范围内,它们几乎是不可能的。时间限制和执行压力会阻止大多数人解决它。即使在采访中,我通常也会觉得这些问题更多是关于揭示性格和激发计算机科学讨论,而不是得到答案。或者也许我只是用魅力弥补了失败:)
        【解决方案10】:

        那是邪恶的!

        如果面试官向面试官提出一个 NP 完全问题,他们唯一可以合理预期的回答是受访者回答问题是 NP 完全问题的证据。在像大学家庭作业这样的低压力环境中,这通常需要一个聪明的学生 2-3 小时或更长时间来证明。证明本身可能需要几页才能完整地写出来,甚至可能需要几个小时的工作。在像面试这样的高压力环境中,您可以预期受访者甚至可能没有意识到这是 np-complete。

        唯一合理的选择是被采访者产生一个近似算法;但是,在这种情况下,面试官应该明确清楚地表明他们很好具有近似值。

        即便如此,大多数近似值也只有 2 个正确答案。

        我猜还有另外一种选择:受访者建议搜索类型的算法可能是最合适的(例如整数域优化问题,它是 NP 完全的,大多数近似算法使用分支定界搜索自旋在单纯形算法上产生不错的结果。)

        【讨论】:

        • 或者被采访者可以,你知道,用慢速算法解决问题。很多 NP 完全问题都有相当简单的解决方案,它们只是运行时间很糟糕。
        • 我认为如果面试官愿意接受一个琐碎的算法,他们应该这样指定。 “可怕的运行时间”充其量只是一种轻描淡写的说法,即使对于相当小的输入大小,大多数微不足道的算法都需要大约与创建和销毁宇宙所需的时间大致相同。
        • “很多 NP 完全问题都有相当简单的解决方案”。所有 NP 问题都有一个非常简单的解决方案(假设给出多项式验证算法):蛮力。问题不是“面试官给你一个 NP-C 问题然后抱怨解决方案很慢可以吗”,问题是“面试官给你一个 NP-C 问题可以吗? "。
        • “整数域优化”和“绑定搜索单纯形算法” - 我不知道你在说什么。我用 C++、Python、JS 编写商业应用程序来养活我的家人 26 年,包括带有矢量时钟的分布式流式重载复制架构、Paxos 共识、CRDT、构建完整的企业解决方案。从来没有遇到过考虑 NP 完全算法的需要。
        【解决方案11】:

        在面试中问如何分解数字是否公平?

        不知道是 NP-C,但不知道多项式时间解[*],所以肯定不知道它在 P 中。

        我认为我的问题和原始问题的答案都是“是”,并且出于相同的原因。有些问题没有解决方案可以很好地扩展,但对于某些输入,无论如何都需要解决。如果你需要能处理此类问题的程序员,有一个好办法让他们在面试中证明这一点,那就是推销他们,看看他们是否疯了。

        如果有人声称具有 CompSci 背景,那么他们甚至应该能够按需为某些 NP-C 问题提供良好的解决方案,例如使用动态规划解决背包问题。我认为要求编程工作的申请人解决他们以前从未见过的问题并实际证明它是 NP 完全的(例如通过将背包减少到指定的问题)是毫无意义的。你不需要每个公司有很多程序员可以做到这一点(通常是 0 人),你可能会发现候选人在尝试改变主题并在面试时间做一些更有价值的事情之前坚持了多长时间。 ..

        [*] 以位为单位的输入大小的多项式,即。您经常看到人们根据输入表示的数字的大小来讨论整数问题的算法复杂性,例如因式分解,例如“sqrt(N) 试用分区”。但这不是 NP 和 NP-C 的定义方式。

        【讨论】:

        • 有 CompSci 背景,我不记得如何用动态规划解决背包问题。我知道我可以在哪里快速查找它,这通常足以满足所有实际用途,除了回答面试问题。
        • 是的,我也许应该说一个最近的 CompSci 背景。大约 10 年前,我在大学攻读数学学位时解决了背包问题。我很确定我可以从内存中描述该算法,但有一些错误,但我肯定无法说出代码。对于几乎任何特定的算法,人们都可以说:“我不记得细节,但它在 Knuth 中”。但是面试官会希望看到我确实知道至少一种算法的证据。那么:动态编程是不是我应该能够按需重现它,就像我可以按需重现二进制搜索一样?取决于工作和我的简历。
        • 同样,我很讨厌白板代码,因为我从来没有在现实生活中写过它。我通常会为除最常规任务之外的所有任务提供参考。我仍然承认需要在面试中编写代码,我只是从来没有勇气随身携带我的书 ;-)。如果这意味着我最终会说,“嗯,此时我会查找 mmap 的论点”,那么,好吧,我不得不依靠面试官的怜悯。同样,我希望研究过背包问题的人能给出一个如何解决它的大纲,如果不是所有的细节的话。
        • “我解决了背包问题”。顺便说一句,这是简洁,而不是傲慢。我被教导要解决...
        • 我从来没有被教过背包,但我正在编写商业代码并连续 26 年养活我的家人。而且我仍然不喜欢这些愚蠢的白板面试。
        【解决方案12】:

        最好问一个难以回答的问题,看看程序员是如何解决问题的。

        但这一切都取决于面试官如何提出问题,如果程序员不是数学天才,他们会提示他们找到解决方案(即看看他们如何推理,以及他们如何对诸如“这是一个好的开始”之类的问题做出反应, 但是如果...") 而不是检测他们是否患有自闭症并且可以在 4.3 秒内提供最佳解决方案)。

        值得记住的是,面试是压力很大的事情,很多人发现这样的问题很难很好地回答 - 一个简单得多的问题通常就足够了,而不会给受访者带来过度的压力/压力。

        如果你这样做是为了故意尝试看看他们如何处理压力,那是愚蠢的——这不是程序员在工作中必须处理的那种压力,所以你没有测试任何有价值的东西。

        【讨论】:

          【解决方案13】:

          我更喜欢让他们证明 P != NP 或 P == NP。总有一天会有候选人回答,我会窃取他们的答案并出名!

          不过,更严肃地说,我认为这是完全公平的。大多数 NP 完全问题很容易解决,只是运行速度很慢。但是,除非这项工作要求他们对复杂性理论有很多了解,否则他们需要证明的只是他们理解解决方案会很慢。如果他们知道这是非多项式时间,则加分,如果他们知道这是 NP 完全的,则获得金星。

          【讨论】:

          • 了解复杂性理论的人需要几分钟才能为 NP-c 问题提供一个简单的解决方案,因为暴力破解将是他最后想到的。就个人而言,在面试压力下,我什至会说“我无法解决”,因为蛮力方法太愚蠢而无法成为“解决方案”。
          • 别忘了你会得到的价格! claymath.org/millennium
          • 我首先读到你更愿意让他们证明 P==NP :)
          • @psihodelia 哈哈,这就是我的意思。脑放屁。
          【解决方案14】:

          在面试中提出一个 NP 完全问题作为编程挑战并没有错。我只发现在面试期间期望找到问题的多项式时间解决方案是错误的。

          面试官应该想了解应聘者如何应对各种情况,包括应聘者无法找到简单解决方案的情况。 “不可能”的问题展示了候选人在没有简单解决方案时的反应。候选人会放弃吗?候选人搜索了多少种不同的尝试?尝试的解决方案有多深远?候选人何时寻求帮助——以及如何寻求帮助?候选人是否抱怨问题“不公平”?

          简而言之,这样的面试问题不是要解决 P=NP……而是心理上的答案。

          【讨论】:

            猜你喜欢
            • 2011-10-18
            • 2010-09-13
            • 2021-09-15
            • 1970-01-01
            • 2022-01-26
            • 1970-01-01
            • 2022-07-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多