【发布时间】:2016-03-12 02:59:07
【问题描述】:
我正在学习算法,并且正在阅读“算法简介第 3 版”这本书,并在问题部分描述了下一个问题:
描述一个 O(n*log(n)) 时间的算法,给定一个包含 n 个整数的集合 S 和另一个整数 x,确定 S 中是否存在两个和正好为 x 的元素。
而且我不知道它是提出有序集合还是无序集合?
【问题讨论】:
-
集合 S 最初是无序的。
标签: algorithm
我正在学习算法,并且正在阅读“算法简介第 3 版”这本书,并在问题部分描述了下一个问题:
描述一个 O(n*log(n)) 时间的算法,给定一个包含 n 个整数的集合 S 和另一个整数 x,确定 S 中是否存在两个和正好为 x 的元素。
而且我不知道它是提出有序集合还是无序集合?
【问题讨论】:
标签: algorithm
让 x 是你想要的总和。首先对数组进行排序。然后对于数组 (a[i]) 中的每个元素,使用二进制搜索查找数组中是否存在 (x-a[i])。
伪代码:
sort(a,n)
for i : 1 to n
if(binary_search(a,i+1,n-1,x-a[i]))
return true
return false
其他方法: 排序后,用first和last两个指针检查:
while(first < last) {
if(a[first]+a[last] == x) return true;
else if(a[first]+a[last] < x) first++;
else if(a[first]+a[last] > x) last--;
}
return false;
【讨论】:
while(first < last) 否则当 x/2 出现在数组中时你会返回 true。
给定一个排序数组,您可以通过 O(n) 算术运算找到是否存在与 x 相加的对。
i := 0
j := len(A) - 1
while i < j {
if A[i] + A[j] < x {
i += 1
} else if A[i] + A[j] == x {
return true
} else if A[i] + A[j] > x {
j -= 1
}
}
return false
鉴于此,您可以使用 O(n log n) 算术运算确定任何数组是否包含一对总和为 x 的元素,方法是对数组进行排序,然后使用上述算法。
【讨论】: