algorithm - 提供一个用 O(nlogn) 执行的算法来解决以下问题

标签 algorithm analysis

编写一个复杂度为 O(n lg n) 的算法,该算法接收一个由 n 个实数组成的数组 A(按非递减顺序排列)和一个值 val 作为输入。如果存在不同的索引 i 和 j 使得 a[i] + a[j] = val,则算法返回 true,否则返回 false。

我想到了下面的伪代码,但意识到它只适用于相邻元素

checkArray(Array A, val)    
if  A.length==2        
if A[0] + A[1] =val
return true;        
else  
return false       
else   
L1 = checkArray (A[0 : n/2],val) 
L2 = checkArray(A[n/2 : n], val)

最佳答案

评论中的提示几乎给出了 O(nlogn) 答案 - 遍历每个元素 a[i],并对数组进行二分查找查看 val - a[i] 是否存在。我不打算详细介绍这个算法,因为它看起来相当简单。相反,我想阐明 O(n) 解决方案,它可能不是那么明显。

简而言之,O(n) 使用两个指针,它们从末端向中间移动,不断检查两者之和是否为 val。如果它们的总和大于 val,我们通过将其指针向左移动一位来减少两者中较大的一个(最右边的指针)。如果它更小,我们通过向右移动它的指针来增加两者中较小的一个。如果两个指针相互传递,我们知道不存在解决方案。

checkArray(Array A, val)
    indexLo = 0
    indexHi = len(A) - 1
    while indexLo <= indexHi
        sum = A[indexLo] + A[indexHi]
        if sum == val
            return True

        if sum < val
            indexLo += 1
        else
            indexHi -= 1
    return False

关于algorithm - 提供一个用 O(nlogn) 执行的算法来解决以下问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095879/

相关文章:

java - 最坏情况分析循环

java - 在数组中找到最大值的预期赋值次数

memory - 如何使用现有的 Eclipse MAT 索引进行交互式分析

algorithm - 将集合划分为两个子集,使之和的差值最小并返回两个子集

java - 在 java 中我们可以使用 list.remove(int index) 来删除该索引中的项目,如果列表很大而我们只能使用 long 来存储索引怎么办?

algorithm - 使用 Horner 算法的高效多项式评估

java - 请使用 "Hugo Elias"算法生成波形! java

analysis - Web服务器日志分析工具

在 Θ(n) 时间内对列表进行排序的算法

algorithm - 将项目重新排列到一个数组中,彼此之间没有相似的项目