Algorithm 软件算法实现二进制搜索

Algorithm 软件算法实现二进制搜索,algorithm,Algorithm,我对算法不熟悉。我发现这个问题,半天都被卡住了。我对关键比较次数的猜测是T(n)=2n-2。有什么建议吗?谢谢 给定一个由n个元素组成的排序数组,[0..n− 1] ,和一个常数C。我们要确定 是一对元素a[i]和a[j],i!=j、 这样A[i]+A[j]=C.(我们想要一个布尔函数。) 返回正确/错误答案。) (a) 概述如何使用二进制搜索算法BS(a,left,right,key)解决这个问题。 (不要给出BS的代码。这是一个给定的函数,你可以调用。)分析这种方法的时间复杂性。 (b) 描

我对算法不熟悉。我发现这个问题,半天都被卡住了。我对关键比较次数的猜测是T(n)=2n-2。有什么建议吗?谢谢

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

a)您可以迭代数组中的所有元素(在O(n)时间内)并调用二进制搜索来查找同一数组中的数字C-a[i](在O(logn)时间内)。如果存在这样一个数字,则两个数字将相加为C。此操作的总运行时间为O(n日志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),如果你想精通算法,这是一个需要了解的重要课题。我建议你在学习其他任何东西之前先学习它。

你应该正确格式化它。T(n)是什么?代表(a):如果列表中有特定的数字,二进制搜索将告诉您该数字。请尝试找出如何使用该数字。提示:您将需要遍历整个列表一次。对于b部分,不需要增加内存使用率…您不需要该集合。在O(n)中没有其他方法可以这样做时间。这是一种时空折衷。有了今天的内存功能,运行时比内存更有价值。你的意思是..你不知道用O(n)来做它的其他方法。当然有一种方法可以用O(n)时间和O(1)来做空间。事实上,它甚至在这个问题下面的一条评论中作为答案发布。抱歉——我忽略了在实现b部分时对它进行排序的事实。在这种情况下,评论中提供的解决方案将更节省空间。我应该修改我的解决方案还是保持原样?谢谢你纠正我,实际上我想使用T(n) 作为比较。对不起,我没有说清楚