您是否在"现实世界"中使用Big-O复杂性评估?

beg*_*ggs 16 algorithm performance complexity-theory big-o profiling

最近在一次采访中,我被问到了几个与技术问题过程中出现的各种算法的Big-O有关的问题.我不认为我在这方面做得很好......自从我参加编程课程以来我被要求计算算法的Big-O十年以来,我没有一个关于任何东西的'Big-O'的讨论我一直在努力或设计.我参与了许多与其他团队成员的讨论以及与我一起工作过的关于代码复杂性和速度的架构师的讨论,但我从未参与过在实际项目中实际使用Big-O计算的团队.讨论总是"考虑到我们对数据的理解,有更好或更有效的方法吗?" 从来没有"这个算法的复杂性是什么"?

我想知道人们是否真的在真实的单词中讨论他们的代码的"大O"?

Mit*_*eat 19

它不是那么多使用它,它更多的是你理解其含义.

有些程序员没有意识到使用O(N ^ 2)排序算法的后果.

我怀疑除了那些在学术界工作的人会在日常生活中使用Big-O复杂性分析.

  • @Beggs:这种知识对于在每种情况下都能使用适当的算法是必要的.如果不知道它的复杂性,你怎么能选择合适的? (8认同)
  • 我经常使用它,但我也处理数百万的N,因此O(N)vs O(log N)是巨大的.如果你的N很小,我怀疑你的使用会减少. (4认同)

Bri*_*ian 11

没有不必要的n平方

根据我的经验,你没有很多关于它的讨论,因为它不需要讨论.在实践中,根据我的经验,所有发生的事情是你发现某些东西很慢并且看到它是O(n ^ 2)实际上它可能是O(n log n)或O(n),然后你去了更改.除了"那是n平方,去解决它"之外,没有其他讨论.

所以是的,根据我的经验你很常用它,但只是在"减少多项式的阶数"的基本意义上,而不是在一些高度调整的分析中"是的,但如果我们切换到这个疯狂的算法,我们将从logN下降到Ackerman函数的倒数"或者一些这样的废话.任何小于多项式的东西,理论都会从窗口中移出并切换到分析(例如,甚至在O(n)和O(n log n)之间进行判断,测量实际数据).

  • 我会保留logN只是为了挽救我的理智. (2认同)

Yuv*_*dam 8

Big-O表示法相当理论化,而在实践中,您对实际的性能分析结果更感兴趣,这些结果可以为您提供关于性能如何的难以理解的结果.

您可能有两种排序算法,这些算法可以通过本书O(n^2)O(nlogn)上限进行,但是分析结果可能会显示效率更高的算法可能会有一些开销(这不会反映在您为其找到的理论界限中)以及针对特定问题的设置正在处理,你可能会选择理论上效率较低的排序算法.

底线:在现实生活中,分析结果通常优先于理论运行时边界.

  • 但是,在这种情况下,请注意使用实际数据进行分析.具有指数运行时的算法可能适用于小型数据集,并且灾难性地超过某​​个限制.这些是您可以*先前分析所捕获的内容,但是根据您的描述方式,可能很难通过单独的分析来检测. (3认同)

Skl*_*vvz 6

我一直这样做.当您必须处理"大"数字时,通常在我的情况下:用户,数据库中的行,促销代码等,您必须知道并考虑算法的Big-O.

例如,生成用于分发的随机促销代码的算法可用于生成数十亿个代码...使用O(N ^ 2)算法生成唯一代码意味着数周的CPU时间,而O(N)意味着小时数.

另一个典型的例子是代码中的查询(糟糕!).人们查找表然后对每行执行查询...这将订单调到N ^ 2.您通常可以更改代码以正确使用SQL并获得N或NlogN的订单.

因此,根据我的经验,只有在使用正确的算法类之后,分析才有用.我使用分析来捕获不良行为,例如理解为什么"小"数字绑定应用程序表现不佳.


Vij*_*hew 5

根据我个人经验的答案是 - 不.可能原因是我只使用简单,易懂的算法和数据结构.几十年前,他们的复杂性分析已经完成并发表.Rob Pike 在此更好地解释了为什么我们应该避免使用花哨的算法.简而言之,从业者几乎从不需要发明新算法,因此几乎不必使用Big-O.

那并不意味着你不应该精通Big-O.项目可能要求设计和分析一种全新的算法.对于一些现实世界的例子,请阅读Skiena的算法设计手册中的"战争故事" .