Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time complexity 在实践和理论上,O(1)和O(n)之间的界限在哪里?_Time Complexity_Complexity Theory - Fatal编程技术网

Time complexity 在实践和理论上,O(1)和O(n)之间的界限在哪里?

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

假设我们有以下问题以及一个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[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 ...;

  }
}