当估算某种算法的时间复杂度时,用伪代码说以下内容:
{"tags":[{"scope":"allow_access","tag":"external"}, {"scope":"test","tag":"text"}]}
{"tags":[{"scope":"allow_access","tag":"external"}]}
{"tags":[{"scope":"allow_access","tag":"external"}]}
{"tags":[{"scope":"allow_access","tag":"external"}]}
{"tags":[{"scope":"allow_access","tag":"external"}]}
{"tags":[{"scope":"allow_access","tag":"external"}]}
{"tags":[{"scope":"allow_access","tag":"external"}]}
在这种情况下,这些指令的时间复杂度为for (int i=0; i<n; i++) ---> O(n)
//comparison? ---> ?
//substitution ---> ?
for (int i=0; i<n; i++) ---> O(n)
//some function which is not recursive
,因为我们在输入O(n)
上进行迭代,但是比较和替换操作是恒定时间,因为它们不依赖于{ {1}}?
谢谢
答案 0 :(得分:3)
其他两个答案均假设您正在比较某种固定大小的数据类型,例如32位整数,双精度数或字符。如果您以Java之类的语言使用<
之类的运算符,而这些运算符只能在固定大小的数据类型上使用,并且不能重载,那么这是正确的。但是您的问题不是特定于语言的,您也没有说您正在使用此类运算符进行比较。
通常,比较操作的时间复杂度取决于您要比较的数据类型。例如,比较64位整数,双精度数或字符需要O(1)时间。但作为反例,按字典顺序比较字符串在最坏的情况下需要O(min( k , k'))时间,其中<em> k , k'是字符串的长度。
例如,这是OpenJDK 7中String.compareTo
方法的Java源代码,显然不需要花费固定的时间:
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
因此,在分析基于比较的排序算法的时间复杂度时,我们经常根据比较和替换的次数而不是基本操作的次数来分析其复杂度。例如,selection sort做O( n )替换和O( n ²)比较,而merge sort做O( n ²< / em> log n )替换和O( n log n )比较。
答案 1 :(得分:2)
首先,阅读this书。这是对该主题的很好的解释。
a==b
这样做时,我们只需从内存中取出 a 和 b 并进行比较。让我们将“ c ”定义为内存成本,将“ t ”定义为时间成本。在这种情况下,我们使用 2c (因为我们使用了两个存储单元)和 1t (因为只有一个操作具有不变的成本),因此 1t -是常量。因此,时间复杂度是恒定的。答案 2 :(得分:1)
但是比较和替换操作如何 恒定的时间,因为它们不依赖n?
是。比较和替换操作是一个恒定因素,因为它们的执行时间不取决于输入的大小。它们的执行时间很耗时,但又与输入大小无关。
但是,for
循环的执行时间与项n
的数量成比例地增加,因此其时间复杂度为O(n)
。
更新
正如@ kaya3正确指出的那样,我们假设我们处理的是固定大小的数据类型。如果不是,请检查@ kaya3的答案。