Algorithm 为什么对固定长度的数组(例如只有五个元素的数组)进行排序需要O(1)?

Algorithm 为什么对固定长度的数组(例如只有五个元素的数组)进行排序需要O(1)?,algorithm,sorting,big-o,Algorithm,Sorting,Big O,我的理解是,当n固定时,对n个元素进行排序的成本是O(1) 例如,在对线性时间中值查找算法的解释中,它说: # Next, we sort each chunk. Each group is a fixed length, so each sort # takes constant time. Since we have n/5 chunks, this operation # is also O(n) 我不明白为什么。我应该想象有一个函数覆盖了所有可能的5!元素如何定位的组合?大O符号用于

我的理解是,当n固定时,对n个元素进行排序的成本是O(1)

例如,在对线性时间中值查找算法的解释中,它说:

# Next, we sort each chunk. Each group is a fixed length, so each sort
# takes constant time. Since we have n/5 chunks, this operation
# is also O(n)


我不明白为什么。我应该想象有一个函数覆盖了所有可能的5!元素如何定位的组合?

大O符号用于描述运行时间或空间如何随着输入的增长而增长。如果您正在排序的内容的数量没有随着输入的增长而增长,那么您正在评估的算法的排序步骤是
O(1)


示例:假设您的输入是一个长度
n>=10
的数组,您的输出是相同的数组,但前10个元素按排序顺序排列,其余元素不变。然后,因为您花费在排序上的时间不会随着输入的增长而增长(n变得更大),所以排序步骤是O(1)。

根据定义,任何有界的运行时间都称为常数

例如,解决十亿个城市的旅行推销员问题需要固定的时间


这是因为Big-O表示法指的是没有时间单位(不涉及真正的计算机),任何固定的数量都相当于1。

一个很好的实践,让您了解为什么(作为遵循其他人告诉您的内容的替代方法)可以从两个方面分析例程的复杂性:一个是定义排序5个元素的复杂性,另一个是给定的方式。然后将分析应用于几个不同的输入长度,看看哪一个更有意义。

确定。这是一件很难想象的事情吗?它不需要一步操作。对固定长度子数组进行排序可能需要10或20个步骤,但如果不能超过20个步骤,则仍然是O(1)。@Sneftel我想问的是,这有什么意义?如果我能说5英镑,那么我就可以说100万英镑。为什么仅仅说“n是固定的”就将一万亿元素的排序从O(nlogn)更改为O(1)?似乎有误导性…大O符号总是取决于我们如何测量输入的大小,以及什么是步骤。是的,对一万亿个元素进行排序的算法可以称为O(1)。它要么有完全不合理的存储需求(通过查阅一个不可能的巨大查找表(比如,严重地超过了大宇宙的大小)),要么O(1)符号隐藏的“常量”不合理地巨大。大O表示法是一种抽象,是一种工具,如果不合理地应用,它可能会产生误导。引用材料中的重要一点是,我们认为排序是O(1)的,因为在一个较大的、n大小的集合中有5个块。在这种情况下,说每个块都按O(1)排序并非不合理。或者,也许更清楚,你可以说它需要5*O(n/5),这当然仍然只是O(n)的总数。谢谢,这很清楚。但这意味着可能有许多“昂贵”的操作在纸上是O(1)。在设计或分析算法(理论上和行业上)时,有没有办法解释这些问题?@SándorDéS,……big-O不是用来分析现实世界成本的工具,只是用来分析比例因子。这个问题只是因为误解了它的目的才提出来的。分析真实世界的成本是剖析器的用途——像这样的工具比任何纸张分析都能更好地理解CPU成本(折合成big-O作为常量因子)。@charlesduff这是有道理的。我经常使用Valgrind,但我不知道Cachegrind。即使
n
是常数,大O的时间复杂度也应该是相同的。对于OP的问题,考虑排序不同大小的两个不同的固定大小的数组的时间复杂度,说明两个时间复杂度O(1)都是误导性的。看一看,它将时间复杂度建立在输入大小的基础上,即使输入大小是固定的。时间复杂性的要点是了解运行时间与输入大小的关系。