问题描述
请先阅读此内容,然后再将其标记为重复! -这与实际修改无关,而是与检查是否已计算出特定的反转有关。
因此,在流行的CLRS的算法入门书中有一个问题,要求您修改合并排序以计算数组中的反转数。作者还慷慨地为这个问题2-4 here提供了解决方案,我在下面附上了其屏幕截图:
我的问题:在第二张屏幕截图中,作者使用了布尔值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
解决方法
我认为你是对的。解决方案作者是一位经验丰富的算法专家,但是要解决一整套练习,不可避免的是某些答案并不完美。
为什么不写信给作者?