修改合并排序以计算反转次数

问题描述

请先阅读此内容,然后再将其标记为重复! -这与实际修改无关,而是与检查是否已计算出特定的反转有关。

因此,在流行的CLRS的算法入门书中有一个问题,要求您修改合并排序以计算数组中的反转数。作者还慷慨地为这个问题2-4 here提供了解决方案,我在下面附上了其屏幕截图:

The MergeSort recursive function

The Merge function

我的问题:在第二张屏幕截图中,作者使用了布尔值counted = FALSE来检查某个值R[j]的特定j对应的反转是否已经已经算不算。因为这个原因,我感到很困惑,因为我认为这是多余的。

我们在这里计算倒置量

    if counted == FALSE and R[j] < L[i]   
        inversions = inversions + n1 - i + 1
        counted = TRUE 

如此计数仅在R[j] < L[i]时为 TRUE ,这也是下面的else部分:

    ...
    else
        A[k] = R[j]
        j = j + 1
        counted = FALSE
    

因此,只要我们有R[j] < L[i],我们就将R[j]复制到A[k]中,并将j的值加1,这样可以确保我们永远不会遇到前一个{{1 }}再次进入循环。在我看来,这使R[j]布尔值变得多余。

或者还有其他东西吗?如果我们删除counted布尔值,是否有任何特定的示例会中断:

counted

解决方法

我认为你是对的。解决方案作者是一位经验丰富的算法专家,但是要解决一整套练习,不可避免的是某些答案并不完美。

为什么不写信给作者?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...