[英]Worst and best case in making comparisons
给定两个按升序排列的
double
值数组,一个数组包含100个元素,另一个数组包含10个元素,采用最佳算法将这些数组合并成一个排序的数组(在最佳情况下和最坏情况下)需要进行多少次比较案件?
答案是:
最佳案例:10个比较
最坏的情况:109比较
在将我标记为家庭作业问题或愚蠢问题之前,请听我说完。 我将解释自己的理由,并以标题为标题,就好像有人对迭代/比较有类似的问题,他们可以看看。
我了解10个比较的最佳情况,因为较短数组中的所有值都必须小于100值较大数组中的所有值。 然后,您将只进行一个比较并对其进行排序。
但对于最坏的情况,我无法进行109次比较。 我不知道问题是否要求使用合并排序进行比较,其中短数组中的每个数字都会进行7次比较(log2 ^ 100 = 6.64),而7乘以10则是70而不是109。
难道我做错了什么? 这个问题的答案也无济于事。 如果大家都能理解和解释,将不胜感激。
即使有了答案,我也不明白如何进行比较以及使用哪种类型的排序(如果使用了排序)。 有人可以再看一次吗?
在最坏的情况下,请考虑以下情况:
Array-1
: 1,2,3,4,5,6,7,8,9,110
。
Array-2
: 10,11,12,13,14,15,.....,109
。
合并这两个数组的最佳方法是比较两个数组的第一个元素(如果有),然后取最小的一个并在该数组中继续进行。
因此,这里,如果我们计数总的比较, First 9
的元件Array-1
将被与第一元件相比Array-2
因为first
元件Array-2
大于first 9
的元件Array-1
所以Total Comparisons = 9
到现在。
现在array-1
最后一个元素在所有元素中最大,因此很明显它最终将在合并中出现array-2
存在all
元素,并将其与array-1
元素进行比较。
因此,总共需要进行100
比较。 现在, Total Comparisons = 100 + 9 = 109
。 因此,在这种情况下,最坏情况下最多只能进行109
比较。
编辑:
合并代码:
Merge(int array1[],int array2[])
{
int array3[]=new int[array1.length+array2.length];
int point1=0; //indicating current element of array1
int point2=0; //indicating current element of array2
int point3=0; //indicating current element of resultant array3
while(point1<array1.length && point2<array2.length)
{
if(array1[point1]>array2[point2]) //This is to be counted as a comparison
{
array3[point3]=array2[point2]; //Take element of array2
point2++; //move to the next element of array2
point3++; //move to the next element of array3
}
else
{
array3[point3]=array1[point1]; //Take element of array3
point1++; //move to the next element of array1
point3++; //move to the next element of array2
}
}
while(point1<array1.length)
{
array3[point3]=array1[point1]; //Take element of array3
point1++; //move to the next element of array1
point3++; //move to the next element of array2
}
while(point2<array2.legnth)
{
array3[point3]=array2[point2]; //Take element of array2
point2++; //move to the next element of array2
point3++; //move to the next element of array3
}
}
所以在这里,当我们比较两个数组的元素时,将被视为比较。 最好的情况是
Array-1
= 1,2,3,4,5,6,7,8,9,10
。
Array-2
= 11,12,13,14,.....,110
。
因此,这里的总比较为10
,经过10
次比较, Array-1
将为空(采用所有元素)。 因此,将不再进行更多比较。 因此,最佳情况下的总比较为10
。
如果要打印任何输入的总比较,请在算法中进行很少的更改。
定义一个变量int total_comparisons=0;
然后每次进行比较时,都要增加它。 因此,请更改比较条件:
if(total_comparisons++ && array1[point1]>array2[point2]) //This is to be counted as a comparison
然后最后打印total_comparisons
。 这是您了解逻辑的更好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.