Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从4个不同序列的元素中求和x_Algorithm_Performance_Sum_Sequences - Fatal编程技术网

Algorithm 从4个不同序列的元素中求和x

Algorithm 从4个不同序列的元素中求和x,algorithm,performance,sum,sequences,Algorithm,Performance,Sum,Sequences,这是我的问题: 给定一个数字x和4个序列a、B、C和D,每个序列都是n个数字,确定是否存在a中的一些数字a、B中的一些数字B、C中的一些数字C和D中的一些数字D,这样x=a+B+C+D。下面的操作是比较、添加和交换。设计一个有效的算法来解决这个问题,最坏情况下的运行时间小于n^4 我不知道从哪里开始,希望能得到一些帮助 您可以执行以下操作: 创建对和数组AB=A+B,CD=C+D,方法是对A和B之间的每一对进行求和,并对C和D进行求和(AB和CD各为n^2个元素的数组)O(n^2) 排序数组AB

这是我的问题:

给定一个数字x和4个序列a、B、C和D,每个序列都是n个数字,确定是否存在a中的一些数字a、B中的一些数字B、C中的一些数字C和D中的一些数字D,这样x=a+B+C+D。下面的操作是比较、添加和交换。设计一个有效的算法来解决这个问题,最坏情况下的运行时间小于n^4


我不知道从哪里开始,希望能得到一些帮助

您可以执行以下操作:

  • 创建对和数组AB=A+B,CD=C+D,方法是对A和B之间的每一对进行求和,并对C和D进行求和(AB和CD各为n^2个元素的数组)O(n^2)
  • 排序数组AB,CD-O(n^2 log(n))(这种方法归功于。早些时候,我提出了一种不同的方法,我认为这种方法会更复杂,但他指出了我的错误。)
  • 分配索引abi=(n^2-1),cdi=0
  • 调查AB[abi]+CD[cdi],检查条件和增量/减量指标

  • 计算和=AB[abi]+CD[cdi]
  • 如果和等于x:这样的组合存在!(停止算法)
  • 如果总和
  • 如果总和>x:减量abi(--abi)
  • 如果(abi<0)或(cdi>=n^2):不存在这样的组合!(停止算法)
  • 回到4.1
  • 每次执行第4步时,索引要么递增,要么递减(或者算法停止),因此我们最多执行第4步2*n^2次(两个数组中的元素数)O(n^2)


    总之,我们有O(n^2 log(n))

    您可以执行以下操作:

  • 创建对和数组AB=A+B,CD=C+D,方法是对A和B之间的每一对进行求和,并对C和D进行求和(AB和CD各为n^2个元素的数组)O(n^2)
  • 排序数组AB,CD-O(n^2 log(n))(这种方法归功于。早些时候,我提出了一种不同的方法,我认为这种方法会更复杂,但他指出了我的错误。)
  • 分配索引abi=(n^2-1),cdi=0
  • 调查AB[abi]+CD[cdi],检查条件和增量/减量指标

  • 计算和=AB[abi]+CD[cdi]
  • 如果和等于x:这样的组合存在!(停止算法)
  • 如果总和
  • 如果总和>x:减量abi(--abi)
  • 如果(abi<0)或(cdi>=n^2):不存在这样的组合!(停止算法)
  • 回到4.1
  • 每次执行第4步时,索引要么递增,要么递减(或者算法停止),因此我们最多执行第4步2*n^2次(两个数组中的元素数)O(n^2)


    总之,我们有O(n^2 log(n))

    你需要找到每个组合吗?他们不需要找到每个组合,只需要满足x=a+b+c+d的组合。但是,如果存在最坏情况下运行时间小于n^4的组合,则检查每个组合将找到解决方案。我认为他们可能需要改进。你需要找到每个组合吗?他们不需要找到每个组合,只需要满足x=a+b+c+d的组合。但是,如果存在最坏情况下运行时间小于n^4的组合,则检查每个组合将找到解决方案。我想他们可能希望在这方面有所改进。这主意不错,但。。。计算最小值是
    O(n)
    ,因此合并阶段是
    O(n^3)
    。使用优先级队列将使其
    O(n^2 log(n))
    。这也是通过更简单的方法实现的:跳过步骤1;将
    AB=A+B
    计算为一个线性数组,并对其排序;与
    CD
    相同;按照第3步和第4步操作。关于最小值,您是对的,我会更新它。但请注意,对大小为n^2的数组进行排序是O(n^2 log(n^2)),因此如果优先级队列产生O(n^2 log(n))复杂度,则优先级队列会更好。
    log(n^2)=2 log(n)
    。它只影响一个渐近常数,我们对此一无所知。这是正确的想法,但。。。计算最小值是
    O(n)
    ,因此合并阶段是
    O(n^3)
    。使用优先级队列将使其
    O(n^2 log(n))
    。这也是通过更简单的方法实现的:跳过步骤1;将
    AB=A+B
    计算为一个线性数组,并对其排序;与
    CD
    相同;按照第3步和第4步操作。关于最小值,您是对的,我会更新它。但请注意,对大小为n^2的数组进行排序是O(n^2 log(n^2)),因此如果优先级队列产生O(n^2 log(n))复杂度,则优先级队列会更好。
    log(n^2)=2 log(n)
    。它只影响一个渐近常数,对此我们几乎一无所知。