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)
。如果只需要使用分治来完成,我可以想到一种方法,而不是另一种关于使用分治进行选择的方法
您需要首先解决以下问题:
- 数组中的最大值,我们称之为:
- 两个元素的最大乘积。让我们调用此方法:
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产品可以完全位于正确的位置
- 最大乘积可以是左侧最大值和右侧最大值的乘积
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和最大值的乘积 左半