如何计算具有可变长度

时间:2017-04-27 13:56:09

标签: algorithm big-o computer-science complexity-theory

假设我有一项任务是编写一个运行在字符串数组中的算法,并检查数组中的每个值是否包含s个字符。该算法将有两个嵌套循环,这里是伪代码:

for (let i=0; i < a.length; i++)
  for (let j=0; j < a[i].length; j++)
      if (a[i][j] === 'c')
         do something

现在,任务是确定算法的运行时复杂性。这是我的理由:

让数组中的元素数量为n,而字符串值的最大长度为m。所以复杂性的一般公式是

n x m

现在可能的情况。

如果字符串值的最大长度等于元素的数量,我会得到复杂性:

n^2

如果元素的最大长度小于某个数字a的元素数,则复杂性为

n x (n - a) = n^2 - na

如果元素的最大长度超过元素数a,则复杂性为

n x (n - a) = n^2 + na

由于我们放弃了较低的增长函数,因此算法的复杂性似乎为n^2。我的推理是否正确?

1 个答案:

答案 0 :(得分:1)

您的时间复杂度只是字符总数。哪些分析适用,完全取决于您对单词长度与单词数量之间关系的假设是否成立。特别要注意的是,你的时间复杂度为N x M的声明,其中M是数组中最大的名称,是不正确的(它的上限是正确的,但是上限不是紧,所以它不是很有趣;它的正确性与N ^ 2 x M ^ 2是正确的相同。

我认为在许多真正感兴趣的案例中,您的分析是不正确的。字符总数等于字符串数,乘以每个字符串的平均字符数,即字长(注意:平均值,不是最大值!)。随着字符串数量变大,平均样本字长将接近您采样的任何分布的均值。因此,至少对于采样为iid的任何表现良好的分布,时间复杂度仅为N.

一个很好的实际示例是存储名称的数据库。当然,这取决于人们碰巧在数据库中,但是如果你要存储说美国公民的名字,那么当N变大时,内部操作的数量将接近名称中平均字符数的N倍,我们。后者的数量根本不依赖于N,所以它在N中是线性的。