软件算法实践 - 二进制搜索

时间:2015-03-06 23:43:54

标签: algorithm

我是算法新手。发现了这个问题,我被困了一半。我对关键比较次数的猜测是T(n)= 2n-2。即O(n)有什么建议吗?升值。

给定n个元素的排序数组,A [0..n - 1]和常数C.我们想确定是否存在 是一对元素A [i]和A [j],i!= j,这样A [i] + A [j] = C.(我们想要一个布尔函数 返回TRUE / FALSE答案。) (a)概述如何通过使用二进制搜索算法BS(A,lef t,right,key)来解决这个问题。 (不要给BS提供代码。这是一个给定的函数,你可以调用它。)分析这种方法的时间复杂度。 (b)描述一种更有效的O(n)算法来解决这个问题。给出伪代码。解释算法的工作原理,并提供数值说明。

1 个答案:

答案 0 :(得分:0)

a)您可以遍历数组中的所有元素(在O(n)时间内)并调用二进制搜索以在同一数组中找到数字C - A [i](在O(log n)时间内)如果存在这样的数字,则两个数字将总和为C.此操作的总运行时间为O(n log n)

b)您可以使用一个集合来存储数组中的所有值,然后对于您遇到的每个数字,您可以检查该集合是否包含数字C-A [i]。然后,将数字A [i]添加到集合中。检查集合是否包含数字是O(1)(假设它是一个散列集),并且遍历数组是O(n),给出O(n)的最终运行时间。

伪代码:

set S to a new set
for i in list A:
    if S contains C-A[i]:
        return true
    add A[i] to set
 return false
编辑:我看到你正在使用T(n)。在编程世界中,每个人都使用O(n),这是一个重要的主题,可以理解你是否想要精通算法。我建议你在进展之前先学习它。