Time complexity 在实践和理论上,O(1)和O(n)之间的界限在哪里?
假设我们有以下问题以及一个java方法可以提供帮助 用户输入的密码长度在5个字符到35个字符之间(含5个字符)。我们需要确保他们不会连续重复相同的字符3次Time complexity 在实践和理论上,O(1)和O(n)之间的界限在哪里?,time-complexity,complexity-theory,Time Complexity,Complexity Theory,假设我们有以下问题以及一个java方法可以提供帮助 用户输入的密码长度在5个字符到35个字符之间(含5个字符)。我们需要确保他们不会连续重复相同的字符3次 boolean has3CharsInARow(char [] password){ for(int left=0, middle=1, right=2; right < password.length; left++, middle++, right++){ if(password[left]==password[midd
boolean has3CharsInARow(char [] password){
for(int left=0, middle=1, right=2; right < password.length; left++, middle++, right++){
if(password[left]==password[middle] && password[middle]==password[right]){
return true;
}
}
return false;
}
该算法的时间复杂度为
O(n)
。这里真的没有回旋的余地。这是数学和算法分析。为了完整起见,最佳情况是O(1)
,平均情况和最坏情况是O(n)
我认为这种混乱来自于人们不理解大O符号的含义以及如何解释它。你说(我的意思是):“但是如果我将输入的大小限制为一个常数,那么复杂性实际上是一个常数,不是吗?”答案是:不是。时间复杂性是对算法执行时间如何随着输入的增长而增长的“描述”。即使输入范围为[5,35]
或[5,Integer.MAX_值]
或[5,∞)代码>。它是运行时和输入大小之间的(协同)关系
时间复杂度并不能告诉您alg运行所需的时间,它告诉您更改输入大小对运行时的影响有多大
让我们看看时间复杂性如何在您的案例中帮助您:
时间复杂度是线性的。对于如此小的输入大小,您可以得出一个合理的结论,即算法是正确的,您不必太担心它
但是,例如,如果算法的时间复杂度类似于O(2^n)
然后,这将告诉您,运行时可能会在一个很小的输入大小下爆炸,您实际上必须看看大小35
是否仍然可以接受。我编辑了我的问题。您是否愿意说等效方法也会在O(n)中运行?@fgharo91是的,操作的数量随着输入的大小而线性增长。复杂性仍然是O(n)
@fgharo91对于大小为35的密码,您执行的操作比大小为34的密码多,而大小为34的密码的操作又比大小为33的密码多,依此类推。这样看:has3CharsInARow(“asd”)
将比has3CharsInARow(“asdfghijkl”)
执行的操作要少,而has3CharsInARow(“asdfghijklmopqrstuvxyz”)将比has3CharsInARow(“asdfghijjkl”)执行的操作要少。随着输入大小的增加,您的函数将执行更多的操作。@fgharo91使函数成为O(1)
那么它所执行的操作数将不取决于输入大小。如果更改密码的最大长度或要检查的最大连续字符数,则可能会重复,对性能有什么影响?例如,另一家公司将其密码限制为15个字符,而您希望验证1000个密码s、 在最坏的情况下(所有密码都是最大长度的),对检查的持续时间会有什么影响?显然,如果你进行时间分析,你想知道一些可能变化的因素对时间的影响,如O(1)操作可能类似于修改字符串中索引i处的字符所需的时间,因为如果字符串长度为1个字符或1000个字符,则所需时间基本相同。如果要计算字符串中a
的数量,则时间将与字符串的长度成比例。易于理解。
boolean has3CharsInARow(char [] password){
switch(password.length){
case 0:
case 1:
case 2:
return false;
case 3: return password[0] == password[1] && password[1] == password[2];
case 4: return password[0] == password[1] && password[1] == password[2] ||
password[1] == password[2] && password[2] == password[3];
...
case 35: return ...;
}
}