如何根据此代码制作更好的算法?

时间:2016-06-04 13:33:52

标签: algorithm pseudocode

我有这个算法,我想知道是否可以使它更好(复杂性更低):

 for i = 3 to A.length 
  for j = 2 to i − 1
    for k = 1 to j − 1
      if |A[i] − A[j]| = = |A[j] − A[k]| or |A[i] − A[k]| = = |A[j] − A[k]|
           return true
 return false

复杂度必须是O(n ^ 3),“或”之后的句子才是      A [i] = A [j]的

我不确定是否可以存在更好的算法...

2 个答案:

答案 0 :(得分:1)

您可以通过散列差异计数来缩短到O(n^2)时间(但会增加空间复杂度)。

答案 1 :(得分:1)

您可以预先对数组进行排序,并使用二进制搜索将时间复杂度从 O(N ^ 3)降低到 O(N ^ 2 logN)

伪代码 -

sort(A)

for i = 1 to A.length - 2
    for j = i + 1 to A.length - 1
        //search for an element A[k] such that A[k]-A[j] == A[j]-A[i]
        if binary_search(A, 2 * A[j] - A[i], j + 1, A.length)
            return True
return False

binary_search(A, x, i, j)如果true出现在x指数Ai之间,则会返回j

与涉及散列的其他解决方案不同,您不需要任何额外的空间。