我为自己编写了这段代码(这不是家庭作业)我想知道这是正确的吗?谢谢
具有时间Θ(nlogn)的算法,它可以提供n个成员的数组,以确定数组中的两个元素是否等于x然后返回那些元素
Algorithm Sum(arr,1,n):
MergeSort(arr)
For i<-- 1 to n
m<-- BinarySearch(arr,arr[i],i+1,n)
return m and arr[i]
//end of the sum algorithm
Algorithm BinarySearch(arr,arr[i],p,q)
J<--[p+q/2]
If (arr[j]+arr[i]=x)
Return arr[j]
else if (i<j)
Return BinarySearch(arr,arr[i],p,j-1)
else
Return BinarySearch(arr,arr[i-j],j+1,q)
// end of BinarySearch algorithm
答案 0 :(得分:4)
您的二进制搜索不正确。
您不应该将i
与j
进行比较,您应该比较总和。此外,如果您二进制搜索x - arr[i]
,则会更容易。
Algorithm BinarySearch(arr,arr[i],p,q)
if (p == q)
if (arr[p] == x - arr[i])
return p
else
return NO_SOLUTION
j<--[(p+q)/2] // you forgot parentheses
If (arr[j] = x - arr[i])
Return arr[j]
else if (arr[j] > x - arr[i]) // our number is too big, restrict the search to smaller numbers
Return BinarySearch(arr,arr[i],p,j)
else
Return BinarySearch(arr,arr[i],j+1,q) // arr[i] doesn't change
此外,您还会在主要功能中覆盖m
。你需要这样的东西:
Algorithm Sum(arr,1,n):
MergeSort(arr)
m = NO_SOLUTION
For i<-- 1 to n - 1
if (m = NO_SOLUTION)
m<-- BinarySearch(arr,arr[i],i+1,n)
else
break;
if (m = NO_SOLUTION)
return NO_SOLUTION
else
return m and arr[i]
这确保您在找到解决方案后停止。在您的情况下,算法将始终返回NO_SOLUTION
,因为没有任何内容可以将最后一个元素分组。此外,出于同样的原因,您只需要前往n - 1
。