【发布时间】:2021-09-04 06:43:13
【问题描述】:
我正在尝试对大量数组使用分而治之来计算 inversion(for eg.,for array [2,5,4,1] the inversion count is=4 namely (2,1),(5,4),(5,1),(4,1),当函数执行每个合并排序时,我得到了一个递归计数值。我将所有计数值存储在一个向量中,然后再次使用求和运算,它适用于 70,000 的数组大小,但在它之后失败。我觉得我不必要地将大量值存储到vector,相反,我正在寻找一种直接计算相同值的方法,但我没有办法做到这一点,请帮助我实现它。
ps:文件链接为this。 我的代码看起来像;
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
long long greater_v(long long *array,long long ap,long long p){
long long numx=0;
for(long long i=0;i<p;i++){
if(array[i]>ap){
numx++;
}
}
return numx;
}
long long merge(long long U[],long long Lu,long long V[],long long Lv,long long S[],long long count1){
long long uf=0;long long vf=0;
for(long long sb=0;sb<Lu+Lv;sb++){
if(uf<Lu && vf<Lv){
if(U[uf]<V[vf]){
S[sb]=U[uf];uf++;}
else{
S[sb]=V[vf];
count1=count1+=greater_v(U,V[vf],Lu);
vf++;
}
}
else if(uf<Lu){
S[sb]=U[uf];uf++;
}
else{
S[sb]=V[vf];vf++;
}
}
return count1;
}
在这部分中,我正在寻求将值存储在向量中的帮助,相反,我想要一种直接计数的方法。
vector<unsigned long long int>v_val;
void MergeSort(long long arr[],long long n){
long long count=0;
//cout<<"sorting ";print(arr,n);
if(n==1)
return;
long long U[n/2];long long V[n-n/2];
for(long long i=0;i<n/2;i++){
U[i]=arr[i];
}
for(long long i=0;i<n-n/2;i++){
V[i]=arr[i+n/2];
}
MergeSort(U,n/2);
MergeSort(V,n-n/2);
count+=merge(U,n/2,V,n-n/2,arr,count);
v_val.push_back(count);
}
主要功能是;
int main(){
long long test_count=0;
ifstream file_num("pr_as_2.txt");
long long arr_num[100000];
for(long long i=0;i<100000;i++){
file_num>>arr_num[i];
}
unsigned long long int sum_val=0;
MergeSort(arr_num,70000);
for(size_t i=0;i<v_val.size();i++){
sum_val+=v_val[i];
}
cout<<sum_val;
}
【问题讨论】:
-
您的代码中有一些magic numbers。他们甚至不匹配。如果文件中没有
100000值怎么办?如果有更多呢?如果文件中甚至没有70000值怎么办? -
另外请花一些时间刷新the help pages,采取SO tour,阅读How to Ask,以及this question checklist。 如何你的程序“失败”了?发生什么了?应该发生什么?而且您知道局部变量(包括数组)通常放在堆栈上,而且堆栈的大小是有限的(可能只有 1MiB)?
-
@ 一些程序员老兄 非常感谢先生,它 100% 确定的文件有 100000 个值,这是斯坦福的编程作业,我使用蛮力计算了答案,我看到我的优化算法在价值提升方面效果很好到 70,000,可能是我犯了错误,所以它无法进一步工作。
-
先生,我已经添加了我正在寻求帮助的部分,实际上我必须将合并的返回计数值存储在向量中,例如,mergesort(arr_num,10) 输出为 28,我在向量中的存储值为(4,1,1,2,2,1,1,2,3,15)。我想计算这些而不存储它,因为我的代码递归运行我很困惑找到一种直接计算这些的方法。
-
看起来您的
merge函数应该返回long long,但其中甚至没有返回语句。作为提示,您应该在启用警告的情况下进行编译。如果根本不使用预期的返回值,该程序适用于小情况,我很惊讶。
标签: c++ algorithm divide-and-conquer