【问题标题】:Calculating sum of array using O(logn) time complexity使用 O(logn) 时间复杂度计算数组的总和
【发布时间】:2020-07-03 18:42:19
【问题描述】:

我有一个 n 个字符的数组。为了计算数组的总和,我使用了以下代码 sn-p:

  var arr = [1,2,3,4,5,6]
  var i = 0;
  var j = arr.length - 1;
  var sum = 0;
  while(i<j || i==j){
     sum = sum + ((i==j) ? arr[i] : arr[i] + arr[j])
     i++;
     j--;
  }

我使用了两个指针 ij 从两个方向遍历数组并找到总和。我想知道这是否是一种正确的方法,它是否以 O(log n) 时间复杂度运行?

谢谢

【问题讨论】:

  • 您的代码以 n/2 => O(n) 时间复杂度运行。
  • 您可以简单地在您的 while 循环中放置一个计数器。对于 100 的数组,该计数器将是 50,而如果它是 O(log n),它将更接近 Math.log2(100) ~= 6。如果您可以在 O(log n) 中为任意数组执行此操作,您会出名的。
  • 由于您需要读取所有 n 个值来计算总和,因此无论您读取这些值的顺序如何,您都不可能低于 O(n)。跨度>

标签: javascript arrays data-structures time-complexity big-o


【解决方案1】:

虽然看起来你的算法的复杂度低于O(N),但实际上仍然是O(N)。由于您只是增加/减少 1 倍,因此循环中的迭代次数约为 N / 2,即 O(N)

如果您在每次迭代后忽略 N 的一半,如二分搜索等算法所示,您将获得 O(log N) 时间复杂度。

对于这个求和问题,您实际上可以使用数学在O(1) 时间内解决。请参阅:this wikipedia page

编辑:您只能将数学用于 1 到 N

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多