为啥这个计数器以这种方式增加,而不是在这个分而治之的算法中一个一个增加?

Posted

技术标签:

【中文标题】为啥这个计数器以这种方式增加,而不是在这个分而治之的算法中一个一个增加?【英文标题】:Why is this counter increasing in this way and not one by one in this divide and conquer algorithm?为什么这个计数器以这种方式增加,而不是在这个分而治之的算法中一个一个增加? 【发布时间】:2015-03-30 21:35:06 【问题描述】:

我正在阅读以下问题的算法解决方案:

此文件包含 1 到 100,000(含)之间的所有 100,000 个整数,按某种顺序排列,没有重复的整数。 您的任务是计算给定文件中的反转次数,其中文件的第 i 行表示数组的第 i 个条目。 由于这个数组很大,你应该实现视频讲座中介绍的快速分治算法。 给定输入文件的数字答案应在下面的空格中输入。

所以问题给了你文件,但这里是解决方案:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#define SIZE 100000

using namespace std;

long long splitInv(long *arr, long l, long u)

     long *tarr = new long[u-l+2];
     long i=l, j=(u-l)/2+l+1, k;
     long long count=0;
     for(k=1; (k<=u-l+1) && (i<=(u-l)/2+l) && (j<=u); k++)
     
              if(arr[i]<arr[j]) tarr[k]=arr[i++];
              else
              
                  tarr[k]=arr[j++];
                  count=count+((u-l)/2+l-i+1);
              
     
     for(; k<=u-l+1 && i<=(u-l)/2+l; k++) tarr[k]=arr[i++];
     for(; k<=u-l+1 && j<=u; k++) tarr[k]=arr[j++];
     for(k=1, i=l ; k<=u-l+1 && i<=u; k++, i++) arr[i]=tarr[k];
     delete tarr;
     return count;


long long numInv(long *arr, long l, long u)

     if(u<=l) return 0;
     return numInv(arr, l, (u-l)/2+l) + numInv(arr, (u-l)/2+l+1, u) + splitInv(arr, l, u);


int main(int argc, char *argv[])

    long *arr=new long[SIZE+1];
    char a[10];
    FILE *f=fopen("IntegerArray.txt","r");
    for(long i=1; i<=SIZE; i++)
    
            fgets(a,10,f);
            arr[i]=atol(a);
    
    fclose(f);
    cout<<"Number of Inversions: "<<numInv(arr,1,SIZE)<<endl;
    delete arr;
    system("PAUSE");
    return EXIT_SUCCESS;

所以,我想知道为什么计数器按以下方式增加,而不是一个一个地增加,因为它只是计算反转的次数:

count=count+((u-l)/2+l-i+1);

所以,对我来说应该是:

count=count+1;

【问题讨论】:

如您所知,它使用的是分治算法,如果您的 if 条件不成立,它需要忽略前半部分,因此它必须偏移您的数组,如您的程序中所示,而不是像您一样假设 @quetzalcoatl 我会回答的。 【参考方案1】:

如您所知,它使用的是分治算法,如果您的 if 条件不成立,则需要忽略前半部分,因此它必须按照程序中所示偏移您的数组,而不是像您假设的那样。

【讨论】:

以上是关于为啥这个计数器以这种方式增加,而不是在这个分而治之的算法中一个一个增加?的主要内容,如果未能解决你的问题,请参考以下文章

在 ng build --prod 之后,为啥我在 main.js:1 和 polyfills.js:1 中出现错误,而不是在我创建的组件中,如何撤消这个?

为啥链表使用指针而不是在节点内存储节点

sql server 2005 死锁在生产中超时,而不是在测试环境中:为啥?

Java中的垃圾回收

为啥这个 if 语句在这种情况下不起作用? [关闭]

为啥查询的数据在结果集中返回而不是在数组中?