以下代码可能是更好的时间复杂度?

时间:2017-10-29 12:20:05

标签: time-complexity

Input: Array A consisting n distinct integers, and an integer k
Output: an integer l
l = 0
for i = 1 to n
  for j = 1 to n
    if A[i] == A[j] + k then l = l + 1
  endfor
endfor
return l

如何将复杂度降低到低于O(n ^ 2)

3 个答案:

答案 0 :(得分:0)

我首先对值列表进行排序,然后假设k为正,你知道两件事:

  • 在你的内循环中,你只需要从A [i + 1]向上搜索,因为你知道只有A [i]之后的值才能大于A [i]
  • 一旦A [j]>停止内循环中的搜索过程A [i] + k,如您所知,所有其他值也将大于A [i] + k

对于一小组数据,O(log(n))搜索的开销可能会导致算法比n ^ 2方法更昂贵。但是,随着数据的增长,相对于n ^ 2,开销将减少,而相当多的比较将为您带来整体收益。

显然,如果k为负数,则可以应用相同的原理,你只需要调整一些逻辑,或者简单地否定k和你的值。

另外 - 只是注意到,因为你的整数是不同的,你也可以在找到匹配时突破内循环,因为你知道每个条目只能有1个匹配。

这就是我要做的事情!

编辑:以下是一些示例代码:

{     输入:数组A由n个不同的整数和一个正整数k组成     输出:整数l     A = sortascending(A)     l = 0     对于i = 1到n         #calculate目标值         target = A [i] + k

    #iterate through remaining entries
    for j = i+1 to n
        if target == A[j] then
            #got a match, inc l then bail out
            l++
            break
        elseif target < A[j]
            #now impossible for any further data points
            #to match, so bail out
            break
        endif
    endfor

endfor
return l

}

-Chris

答案 1 :(得分:0)

好吧,我认为我最终得到了比O(n2)更好的解决方案。 首先建立一个BST O(N log N) 然后搜索O(Log N)。

答案 2 :(得分:0)

如果我可以使用任何数据结构,我选择 hash-set 结构来存储不同的值。 哈希集通常可以创建O(n)时间复杂度,并且可以以O(1)时间复杂度进行访问。

 B =hashset(A) // requires O(n) time
 for i = 1 to n
     if B.contains(A[i]+k) then l= l+1
 endfor // also requires n×O(1) = O(n) time
 return l

我认为这段代码的时间复杂度为O(n)。