在谈论时间复杂度时,我们通常使用 n 作为输入,这不是对实际输入大小的精确测量。我无法证明,当使用特定大小的输入( s )时,算法仍保留在相同的复杂性类别中。
例如,采用简单的顺序搜索算法。在最坏的情况下,它需要W(n)时间。如果我们应用特定的输入大小(在基数2中),则顺序应为W(lg L),其中L是最大整数。
如何显示顺序搜索或任何算法仍然是相同的复杂性类,在这种情况下是线性时间?我知道需要进行某种替换,但是我对如何得出结论感到不满。
修改
我想我可能找到了我想要的东西,但我并不完全确定。
如果将最坏情况时间复杂度定义为W(s),则算法对输入大小为s的最大步数,则根据输入 size 的定义,s = lg n ,其中n是输入。然后,n = 2 ^ s,得出时间复杂度为W(2 ^ s)的结论,指数复杂度。因此,算法在二进制编码时的性能是指数级的,而不是线性的,因为它在数量上。
答案 0 :(得分:3)
在谈论时间复杂度时,我们通常使用n作为输入,这不是对实际输入大小的精确测量。我无法证明,当使用特定大小的输入时,算法仍保持相同的复杂性类别。
例如,采用简单的顺序搜索算法。在最坏的情况下,它需要W(n)时间。如果我们应用特定的输入大小(在基数2中),则顺序应为W(lg L),其中L是最大整数。
L 是表示最大整数的变量。 n 是一个表示输入大小的变量。 L 不再是 n 的特定值。
当您应用特定值时,您不再是在讨论复杂性类,而是在讨论该类的实例。
假设您正在搜索500个整数的列表。换句话说, n = 500
顺序搜索的最坏情况复杂性类是 O(n)
复杂性为 n
最坏情况复杂性的具体实例是500
编辑:
您的值将以编码每个值所需的位数统一。如果输入是32位整数的列表,则c = 32,即每个整数的位数。复杂度为32 * n =>为O(n)。
就L而言,如果L是最大值,并且lg L是编码L所需的位数,则lg L是常数c。您在位方面的复杂性是O(n)= c * n,其中c = lg L是常量特定输入大小。
答案 1 :(得分:1)
正如Lucia Moura所述:“除了一元编码,所有其他编码为自然 数字的长度与多项式相关“
Here是来源。看一看第19页。
答案 2 :(得分:1)
我所知道的是最大数量 顺序搜索完成的步骤是, 显然,cn ^ 2 + nlg L. cn ^ 2是 增加循环的步骤数 并做分支。
这根本不是真的。顺序搜索所完成的最大步数将为c * n,其中n是列表中的项数,c是常量。那是最糟糕的情况。没有n ^ 2组件或对数组件。
例如,简单的顺序搜索将是:
for (int i = 0; i < NumItems; ++i)
{
if (Items[i] == query)
return i;
}
return -1;
使用该算法,如果搜索每个项目,则一半搜索将需要少于NumItems/2
次迭代,一半搜索将需要NumItems/2
次或更多次迭代。如果您搜索的项目不在列表中,则需要NumItems
次迭代才能确定。最坏的情况是运行时间为NumItems
次迭代。平均情况是NumItems/2
次迭代。
执行的实际操作数是一些常数C
,乘以迭代次数。平均而言是C*NumItems/2
。