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)
答案 0 :(得分:0)
我首先对值列表进行排序,然后假设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)
答案 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)。