这是我的问题:
给定数X和4序列A、B、C和D,n个数中的每一个,决定是否存在A、B从A、B从C和D从D中得到一些数字,使得x=a+b+c+d的操作是比较、加法和交换。设计一个有效的算法来解决最坏情况下运行时间小于n^4的问题。
我不知道从哪里开始,希望能得到帮助!

最佳答案

您可以执行以下操作:
创建对和数组a b=a+b,c d=c+d,方法是对a和b之间的每一对进行求和,对c和d进行求和(ab和cd分别是n^2个元素的数组)-o(n^2)
排序数组AB,CD-O(n^2 log(n))(对于这种方法,记入user58697早些时候,我提出了一种不同的方法,我认为它会有更好的复杂性,但他指出了我的错误。
分配索引abi=(n^2-1),cdi=0
调查AB[ABI]+CD[CDI],检查条件和增减指标
计算和=AB[abi]+CD[cdi]
如果和等于x:则存在这样的组合(停止算法)
如果和如果sum>x:递减abi(--abi)
如果(abi=n^2):不存在这样的组合!(停止算法)
回到4.1。
每次我们执行步骤4时,索引要么递增要么递减(或者算法停止),因此我们最多执行步骤4 2*n^2次(两个数组中的元素数)-o(n^2)
总而言之,我们有o(n^2 log(n))

关于algorithm - 从4个不同序列的元素中求和x,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41488254/

10-13 08:39