为什么在做大O复杂度分析时,算法和数据结构没有一起考虑?
Why, algorithm and data structure, both are not considered together when doing Big O complexity analysis?
我一直在阅读算法和数据结构及其性能特征。我想了解 - 运行 程序的时间如何受到针对特定数据结构的特定算法的 Big O 复杂性分析的影响。例如在红黑树结构中,在最坏的情况下搜索可能需要 o(log (n)) 时间(http://bigocheatsheet.com/)。但是,如果为红黑树结构选择的 algorithm/sorting 方法很慢,例如冒泡排序或选择排序,那么它不会对程序的整体性能产生不良影响吗?在进行 Big O 复杂性分析时,将两者(算法和数据结构)一起考虑不是很重要吗?
你在这里混合了青苹果和红苹果。
以您为例 - 红黑树的插入和删除方法保持平衡。因此,当您搜索一个值时,最坏情况 O(log(n)) 是因为没有进行任何类型的排序。根据预定义的策略(树的不变性,如果你愿意的话)树已经 "sorted" 并且它的高度是 O(log(n)),所以搜索不超过 O(log(n))在性能上。它不是一个数组,而是一棵树。它在您构建时进行了排序。
如果你想看整个程序的性能,那么你应该主要考虑批量执行的一系列指令和操作(它们通常决定性能有多差)。在这种情况下,是的,你应该考虑所有可能影响你表现的变量。如果您在任何时候进行排序,那么,是的,请考虑到这一点。正如我所说,红黑树不按搜索排序。
检查整体批处理性能时,强烈建议考虑 摊销 性能。回到您的红黑树示例,您可能希望 n 插入到空树中(即构建树)需要 O(nlog(n)) 因为您正在执行 n O(log(n)) 操作,但是实际上它需要 O(n) 操作,因为您只在这些操作的一小部分中达到了最坏的情况。我建议您也阅读该主题。
不知道红黑树是不是一个很好的例子。但总的来说:
数据结构操作的复杂性取决于其中使用的算法(如果有的话)。但是你不想说"If I use a bad algorithm, the complexity would be ..."。您总是使用尽可能复杂的子算法。
实现可能与理论上的复杂性不同algorithm/complexity。也许你有一个特殊的用例,你可以使用更好的子算法,或者复杂度更差但常数因子更好的算法(这有时很重要)。
我一直在阅读算法和数据结构及其性能特征。我想了解 - 运行 程序的时间如何受到针对特定数据结构的特定算法的 Big O 复杂性分析的影响。例如在红黑树结构中,在最坏的情况下搜索可能需要 o(log (n)) 时间(http://bigocheatsheet.com/)。但是,如果为红黑树结构选择的 algorithm/sorting 方法很慢,例如冒泡排序或选择排序,那么它不会对程序的整体性能产生不良影响吗?在进行 Big O 复杂性分析时,将两者(算法和数据结构)一起考虑不是很重要吗?
你在这里混合了青苹果和红苹果。
以您为例 - 红黑树的插入和删除方法保持平衡。因此,当您搜索一个值时,最坏情况 O(log(n)) 是因为没有进行任何类型的排序。根据预定义的策略(树的不变性,如果你愿意的话)树已经 "sorted" 并且它的高度是 O(log(n)),所以搜索不超过 O(log(n))在性能上。它不是一个数组,而是一棵树。它在您构建时进行了排序。
如果你想看整个程序的性能,那么你应该主要考虑批量执行的一系列指令和操作(它们通常决定性能有多差)。在这种情况下,是的,你应该考虑所有可能影响你表现的变量。如果您在任何时候进行排序,那么,是的,请考虑到这一点。正如我所说,红黑树不按搜索排序。
检查整体批处理性能时,强烈建议考虑 摊销 性能。回到您的红黑树示例,您可能希望 n 插入到空树中(即构建树)需要 O(nlog(n)) 因为您正在执行 n O(log(n)) 操作,但是实际上它需要 O(n) 操作,因为您只在这些操作的一小部分中达到了最坏的情况。我建议您也阅读该主题。
不知道红黑树是不是一个很好的例子。但总的来说:
数据结构操作的复杂性取决于其中使用的算法(如果有的话)。但是你不想说"If I use a bad algorithm, the complexity would be ..."。您总是使用尽可能复杂的子算法。
实现可能与理论上的复杂性不同algorithm/complexity。也许你有一个特殊的用例,你可以使用更好的子算法,或者复杂度更差但常数因子更好的算法(这有时很重要)。