【问题标题】:When is it justified to use a O(2^n) algorithm? [duplicate]什么时候使用 O(2^n) 算法是合理的? [复制]
【发布时间】:2023-03-27 15:01:01
【问题描述】:

由于有许多不同的排序算法选择,在任何示例中使用更高复杂度的算法是否合适?

我能想到的唯一原因是有一个非常短的数组,或者非常接近排序的数组,或者只包含几个不同的数字。

【问题讨论】:

  • 2^n 是 n^2 的错字吗?我认为没有任何合理的 O(2^n) 排序算法。
  • 我同意,但有趣的是,我最近使用 2^n 在试卷中得到了这个确切的问题
  • 这很不寻常。尽管如此,如果 n 个元素以具有复杂要求的某种多维顺序排列,或者可以说您可以认为将一组数字排列成一个特定数独的解决方案以“排序”,那么 O(n^2) 可能是有意义的他们进入解决方案排序......
  • 实现比更快的算法简单得多的一个原因,您想在单元测试中使用它来验证更复杂、更快的实现

标签: algorithm sorting time-complexity big-o


【解决方案1】:

由于有许多不同的排序算法选择,在任何示例中使用更高复杂度的算法是否合适?

它可能是,如果所关注的 big-O 复杂性是最坏的情况,你确定你不会遇到,或者 n 如你所说的那样小(例如 n 是棋盘上剩下的白兵数量)和常数因素更重要。

O(2^n) 是极端的……您还必须考虑使用它的原因的稳定性 - 是否有人(包括将来的您)不小心修改了代码,使 O(2 ^n) 算法,并且有时在调用它并且 n 高于最初预期或数据不太“友好”时让应用程序锁定?

对于大多数事情,值得花时间创建一个相当高效且有望重用的算法,而且不必担心,但有时这可能会更加复杂且容易出错,而 CPU 或内存的好处只是不要为之辩解。归根结底,重要的是对您的实际项目的短期和长期影响。

在创建算法代码时,通常有一种非常简单、显而易见的解决方法,以及一种复杂但有效的解决方法,最好快速编写以前的代码以便您可以使用它进行测试后者。前者可能被称为“预言机”实现,因为它知道真相:正确答案是值得信赖的。如果它也恰好足够快,并且您有 n 或所讨论的数据场景的限制,您可能不需要进行复杂的实现。

【讨论】:

  • 扩展“简单明了的解决方法”。你可能不得不做一个一次性的工作,在你写几分钟后需要 n^2 算法六个小时来解决它。高效的算法可以在几分钟内解决问题,但需要你一两个小时的开发工作。使用“低效”算法可能会更好,因为您可以在处理其他任务时在后台运行它。我发现自己经常遇到这种情况,并且发现“低效”算法通常最终会节省我的时间。
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多