是否有图表或表格可以显示许多(至少是流行的)数据结构和算法及其运行时间和效率?
我正在寻找的东西是我可以浏览的,并决定哪种结构/算法最适合特定情况。在处理新项目或作为学习指南时,它会有所帮助。
答案 0 :(得分:6)
图表或表格不会是特别有用的参考。
如果您要使用特定的算法或数据结构来解决问题,那么您最好从内到外了解和理解它。这包括了解(并了解如何推导)各自的效率。这并不是特别困难。大多数标准算法都具有简单,直观的运行时间,如N^2
,N*logN
等。
话虽这么说,运行时Big-O并非一切。以排序为例。堆排序具有比快速排序更好的Big-O,但快速排序在实践中表现更好。 Big-O中的常数因素也可以产生巨大的差异。
当你谈论数据结构时,对他们而言远远超过了眼睛。例如,哈希映射看起来只是一个具有更好性能的树图,但是您可以获得带有树图的其他排序结构。
了解要使用的最佳算法/数据结构是知识体验问题,而不是查找表。
虽然回到你的问题,我不知道有任何这样的参考。尽管如此,做一个人是一个很好的练习。维基百科有关于常见算法/数据结构的相当不错的文章以及一些不错的分析。
答案 1 :(得分:5)
我不相信任何此类列表存在。众所周知的算法和数据结构数量惊人,而且新的算法和数据结构一直在不断发展。此外,这些算法和数据结构中的许多都是专用的,这意味着即使您面前有一个列表,也很难知道哪些适用于您尝试解决的特定问题。
这样一个清单的另一个问题是如何量化效率。如果您要根据渐近复杂度(big-O)对算法进行排名,那么您可能最终会将某些算法和数据结构渐近地放在最优的但是在算法之前的小输入上实际上很慢。已知对于实际案例来说很快但可能在理论上并不完美。例如,考虑查找线性时间序列统计的中位数中值算法,其具有如此巨大的常数因子,其他算法在实践中往往更好。或者考虑快速排序,在最坏的情况下是O(n 2 )但实际上具有平均复杂度O(n lg n)并且很多比其他排序算法更快
另一方面,如果您尝试按运行时效率列出算法,列表会产生误导。运行时效率基于机器和输入特定的许多因素(例如位置,输入的大小,输入的形状,机器的速度,处理器架构等)。它通常可能是有用的但是在许多情况下,当另一个算法远远优于时,你可能会被数字误导以选择一种算法。
还需要考虑实施的复杂性。许多算法仅存在于论文中,或者具有未优化的参考实现,或者使用的语言不是您正在寻找的语言。如果你发现一个完全符合你想要但却没有实现的Holy Grail算法,那么编写和调试你自己的版本可能是不可能的。例如,如果没有优势的红/黑树实现,你认为你能够自己编写代码吗? Fibonacci怎么样?或者(来自个人经历)van Emde Boas树?通常,选择一个“足够好”但更容易在更复杂的算法上实现的更简单的算法可能是个好主意。
简而言之,我希望这样的表可以存在,真正拥有所有这些信息,但实际上我怀疑它可以以一种有用的方式构建。来自@ hammar评论的维基百科链接实际上非常好,但是学习在实践中使用哪种算法和数据结构的最佳方法是通过练习来尝试它们。
答案 2 :(得分:4)
收集所有算法和/或数据结构基本上是不可能的 - 即使在我写这篇文章时,毫无疑问有人在某处发明了一些新的算法或数据结构。在更大的方案中,它可能没什么重要意义,但它仍然可能是新的,并且(稍微有点)与以前任何人所做的任何事情都不同(当然,它总是可能它会结果是一件很重要的事情。)
尽管如此,美国国家标准与技术研究院的Dictionary of Algorithms and Data Structures列出了大多数人所知道或关心的内容。它涵盖了大多数人都知道的明显“大”的,以及大量鲜为人知的。坎特伯雷大学another对我来说(或者至少在我看来)有点谦虚,但仍然涵盖了典型程序员可能关心的大部分内容,而且对于找到要解决的算法更有条理一个特殊的问题,而不是主要基于已经知道你想要的算法的名称。
还有各种更专业的集合/列表。例如,The Stony Brook Algorithm Repository主要(专门用于)组合算法。它基于Algorithm Design Manual,因此如果您拥有/使用该书,它会特别有用(如果您想知道,这本书通常被高度重视)。
答案 3 :(得分:0)
计算机程序的第一优先级是正确性,第二优先级是程序员时间 - 与可持续性和可扩展性直接相关的东西。
正因为如此,有一个编程学派主张使用简单的东西,如记录数组,除非它恰好是一个性能敏感的部分,在这种情况下你不仅需要考虑数据结构和算法,还需要“ architechture“这导致你首先遇到这个问题。