【问题标题】:Worst and best case in making comparisons进行比较时最坏和最好的情况
【发布时间】:2017-04-27 19:24:18
【问题描述】:

给定两个由double 值组成的数组,按升序排序,一个有 100 个元素,另一个有 10 个元素,在最优算法中将这些数组合并为一个排序数组需要多少次比较,最好情况和最坏的情况?

答案是:

最佳案例:10 次比较

最坏情况:109 次比较

在将我标记为作业问题或愚蠢问题之前,请听我说完。我会解释我的推理,我把标题写成好像有人对迭代/比较有类似的问题,他们可以看看这个。

我理解 10 次比较的最佳情况,因为较短数组中的所有值都必须小于包含 100 个值的较大数组中的所有值。然后,您将只进行一次比较并对其进行排序。

但在最坏的情况下,我没有得到 109 次比较。我不知道问题是否要求使用合并排序进行比较,其中短数组中的每个单个数字将进行大约 7 次比较(log2^100 = 6.64),7 乘以 10 是 70 而不是 109。

我做错了吗?问题的答案也无济于事。如果大家能理解并解释,将不胜感激。

即使有答案,我也不明白如何进行比较以及使用哪种类型的排序(如果使用的话)。有人可以再看一遍吗?

【问题讨论】:

  • 既然它们都已排序,那么最好的情况不应该是 1 次比较吗?如果第一个数组的最大元素小于第二个数组的最小元素,则只需连接数组即可,无需任何额外比较。
  • @wotanii 计算机不知道这一点,ofc 当我们说这是一个比较,因为我们很聪明,但计算机不知道它的顺序。我只是没有得到第二个选择。哈!

标签: java arrays algorithm sorting


【解决方案1】:

考虑最坏的情况

Array-1:1,2,3,4,5,6,7,8,9,110。
Array-2:10,11,12,13,14,15,.....,109。

合并它们的最佳方法是比较两个数组的第一个元素(如果可用),然后取最小值并在该数组中进一步处理。

所以在这里,如果我们计算总比较,Array-1 的 First 9 元素将与 Array-2 的第一个元素进行比较,因为 Array-2 的 first 元素大于 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,在10th 比较之后,Array-1 将变为空(所有元素都被取走)。所以不再做进一步的比较。因此,最佳情况下的总比较是10。

如果您想打印任何输入的总比较,请对算法进行一些更改。

定义一个变量int total_comparisons=0;,然后每次进行比较时,将其递增。所以改变比较条件:

if(total_comparisons++ &amp;&amp; array1[point1]&gt;array2[point2]) //This is to be counted as a comparison

然后最后打印total_comparisons。这是您理解逻辑的更好方法。

【讨论】:

  • 这是合并排序吗?这是一种什么样的比较?如果是这样,它将如何实现最佳方案,因为我认为我对此也感到困惑。
  • 在合并排序中,我们有相同大小的分区,而这里我们有 1 个大小为 10 的分区和其他大小为 100 的分区,但在两种排序中合并将是相同的。
  • 在最佳情况下,Array-1 的范围为 1-10,而 Array-2 的范围为 11-110。所以这里只需要 10 次比较,因为在第 10 次比较之后,Array-1 为空,所以我们只需将 Array-2 附加到最终列表而不进行任何比较。
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多