在尝试计算来自非常大的数据集的反转时,我从以下过程得到了错误的答案。
我还尝试了一些在相关帖子上给出/建议的其他代码,并且在我的代码本身中尝试了很多操作[以获得正确答案]但被拒绝了。如果我不知道正确答案,我只能验证我是否有答案。
另外,为了更多地帮助自己,我用O(n^2)
方式试了一下,以便至少得到答案,但我得到的答案被拒绝了。
代码生成错误输出:-1887062008
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int mergeAndCount(vector<int> & arr, int first, int second, int last) {
vector<int> temp;
int i = first, j = second;
int invCount = 0;
while( i < second && j <= last ) {
if( arr[i] > arr[j] ) {
invCount += second - i;
temp.push_back( arr[j] );
j++;
}
else {
temp.push_back( arr[i] );
i++;
}
}
while( i < second ) {
temp.push_back( arr[i++] );
}
while ( j <= last ) {
temp.push_back( arr[j++] );
}
copy( temp.begin(), temp.end(), arr.begin()+first);
return invCount;
}
int sortAndCount( vector<int>& arr, int low, int high ) {
if( low >= high )
return 0;
int mid = low + (high-low)/2;
int lic = sortAndCount( arr, low, mid );
int ric = sortAndCount( arr, mid+1, high);
int ic = mergeAndCount( arr, low, mid+1, high);
return lic+ric+ic;
}
int getInversionCount(vector<int>& arr ) {
if( arr.size() > 0 )
return sortAndCount( arr, 0, arr.size()-1 );
return 0;
}
void Test1() {
vector<int> arr;
ifstream inFile;
inFile.open("w2.txt");
if (!inFile) {
cout << "Unable to open file datafile.txt";
}
int value;
while(inFile >> value) {
arr.push_back(value);
}
cout << getInversionCount( arr) << endl;
}
int main() {
Test1();
return 0;
}
答案 0 :(得分:0)
我只是一个学生,我必须制作相同的算法,所以不要太相信我;但我认为在 sortAndCount
中,您必须为元素数量设置条件。喜欢:
int sortAndCount( vector<int>& arr, int low, int high ) {
if( air.size()==1){
return 0;
}
else if( arr.size() >=2){
int mid = low + (high-low)/2;
int lic = sortAndCount( arr, low, mid );
int ric = sortAndCount( arr, mid+1, high);
int ic = mergeAndCount( arr, low, mid+1, high);
}
return lic+ric+ic;
}