Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 Z的最佳三元组是三个不同索引i、j和k的集合,其中i≤;j≤;k、 这使得乘积Z[i]*Z[j]*Z[k]尽可能大_Algorithm - Fatal编程技术网

Algorithm Z的最佳三元组是三个不同索引i、j和k的集合,其中i≤;j≤;k、 这使得乘积Z[i]*Z[j]*Z[k]尽可能大

Algorithm Z的最佳三元组是三个不同索引i、j和k的集合,其中i≤;j≤;k、 这使得乘积Z[i]*Z[j]*Z[k]尽可能大,algorithm,Algorithm,我被要求用分而治之的方法解决一个问题。 问题是:设Z是n+整数的数组,n≥3.Z的最佳三元组是由三个不同的索引i、j和k组成的集合,其中i不需要对数组进行排序即可找到最大、第二大和第三大元素。您可以使用D&CO(n) 同样值得注意的是,找到三个最大的元素可以通过一个简单的算法来完成,算法的复杂性O(3n)=O(n)。如果只需要使用分治来完成,我可以想到一种方法,而不是另一种关于使用分治进行选择的方法 您需要首先解决以下问题: 数组中的最大值,我们称之为: 最大值(arr、开始、结束) 两个

我被要求用分而治之的方法解决一个问题。
问题是:设Z是n+整数的数组,n≥3.Z的最佳三元组是由三个不同的索引i、j和k组成的集合,其中i不需要对数组进行排序即可找到最大、第二大和第三大元素。您可以使用D&C
O(n)


同样值得注意的是,找到三个最大的元素可以通过一个简单的算法来完成,算法的复杂性
O(3n)=O(n)

如果只需要使用分治来完成,我可以想到一种方法,而不是另一种关于使用分治进行选择的方法

您需要首先解决以下问题:

  • 数组中的最大值,我们称之为:
最大值(arr、开始、结束)

  • 两个元素的最大乘积。让我们调用此方法:
maxTwoProduct(arr、开始、结束)

这可以使用分而治之的方法解决,如:

int maxTwoProduct(arr, start, end):
   if ( end - start + 1 < 2 ):
      return MIN_VALUE
   int mid = (end+start)/2;
   max_11 = maximum(arr, start, mid);
   max_12 = maxTwoProduct(arr, start, mid);
   max_21 = maximum(arr, mid+1, end);
   max_22 = maxTwoProduct(arr, mid+1, end);
   return Math.max(max_11*max_21, max_12, max_22)
int-maxTwoProduct(arr、start、end):
如果(结束-开始+1<2):
返回最小值
int mid=(结束+开始)/2;
最大值11=最大值(arr、start、mid);
max_12=maxTwoProduct(arr、start、mid);
最大值21=最大值(arr,中间+1,末端);
max_22=maxTwoProduct(arr、mid+1、end);
返回Math.max(max_11*max_21,max_12,max_22)
想法是将阵列分成两部分,maxTwoProduct可以通过以下方式之一出现:

  • 最大乘积可以完全位于左侧部分

  • max产品可以完全位于正确的位置

  • 最大乘积可以是左侧最大值和右侧最大值的乘积

这可以扩展到maxThreeProduct,如下所示:

int maxThreeProduct(arr, start, end):
   if ( end - start + 1 < 3 ):
      return MIN_VALUE
   int mid = ( end + start ) / 2;
   maximum_11 = maximum(arr, start, mid);
   maximum_12 = maxTwoProduct(arr, start, mid);
   maximum_13 = maxThreeProduct(arr, start, mid);
   maximum_21 = maximum(arr, mid+1, end);
   maximum_22 = maxTwoProduct(arr, mid+1, end);
   maximum_23 = maxThreeProduct(arr, mid+1, end);
   return Math.max( maximum_11*maximum_22, maximum_12*maximum_21, maximum_13, maximum_23);
int-maxtreeproduct(arr、start、end):
如果(结束-开始+1<3):
返回最小值
int mid=(结束+开始)/2;
最大值11=最大值(arr、start、mid);
最大_12=最大乘积(arr、start、mid);
最大_13=最大三乘积(arr、start、mid);
最大值_21=最大值(arr,中间+1,末端);
最大值22=最大乘积(arr、mid+1、end);
最大_23=最大三乘积(arr,中间+1,末端);
返回Math.max(最大值11*最大值22,最大值12*最大值21,最大值13,最大值23);
此处的最大值可以是以下四个选项之一:

  • 最多三个产品可以完全出现在左半部分

  • 它可以完全发生在右半部分

  • 它可以是左半部分maxTwoProduct和最大值的乘积 右半

  • 它可以是右半部分maxTwoProduct和最大值的乘积 左半


数组中是否有负值?@我知道我可以得到最大值3次,但我想知道是否有其他方法使用D&C而不找到最大值并对数组进行排序。获得三对(ind,val)并通过ind.3比较对它们进行排序。这是一个很好的解决方案。我想这就是这个问题的原作者所期望的。