我目前正在研究一個涉及大量迭代(準確地說是2^32)的項目。我主要在我的大部分計算中都使用了mathematica,但它無法處理這種數量的過程。有人建議,我認爲C++將能夠處理它,所以昨天晚上我學過C++,並寫了下面的代碼:爲大量迭代優化代碼
//old code
的代碼運行正常,(我查了小參數),但我已經開始運行它爲4294967295 = 2^32-1步驟,我認爲這將需要數百小時。如果有人能告訴我是否有辦法優化代碼的某些部分,以便它運行得更快,我會非常感激的。我對這種語言沒有經驗,所以我如何構建這些功能可能看起來相當混亂。我認爲我的Ca2step函數運行得非常有效(我可能是錯誤的),並且我認爲它的主要部分中的循環會放慢一切。我認爲我想要完成的工作必須有更快的方法,所以任何幫助都會很棒。 謝謝, 理查德。
======= UPDATE ========
非常感謝大家,我真的很感激。好的,我對我來說都很新,所以我很難理解有些事情的意思。以下是我更新的代碼。不過,我感覺它仍然很慢。有人建議「並行」,但我不知道這是什麼,我會怎麼做?再次感謝理查德。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//parameters
int a[32] = {0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,
1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1};
int b[32] = {1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1,
1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
// Create vector of vectors from arrays to be input into function.
vector<int> va (a, a + sizeof(a)/sizeof(int));
vector<int> vb (b, b + sizeof(b)/sizeof(int));
vector< vector<int> > ca2step (long int r, vector< vector<int> > vec)
{
int rulearray[32] = { 0 };
for (int pos = 31; pos >= 0; --pos){
if (r % 2)
rulearray[pos] = 1;
r /= 2;
}
int arraya[32] = {0};
int arrayb[32] = {0};
for (int i = 0; i < 32; i++) {
arraya[i] = vec[0][i];
arrayb[i] = vec[1][i];
}
vector< vector<int> > output;
typedef int t_array[32];
t_array vll, vl, vr, vrr, vx;
rotate_copy(arrayb,arrayb+2,arrayb+32,vll);
rotate_copy(arrayb,arrayb+1,arrayb+32,vl);
rotate_copy(arrayb,arrayb+31,arrayb+32,vr);
rotate_copy(arrayb,arrayb+30,arrayb+32,vrr);
for (int i = 0; i < 32; i++) {
vx[i] = (arraya[i] + rulearray[(31 - (vll[i] + (2 * vl[i])
+ (4 * arrayb[i]) + (8 * vr[i]) + (16 * vrr[i])))]) % 2;
}
output.push_back(vector<int>(arrayb, arrayb+32));
output.push_back(vector<int>(vx, vx+32));
return (output);
}
int caevolve (long int r, vector< vector<int> > vector){
int count;
for(int j=0; j<20; j++){
//run function
vector = ca2step(r, vector);
}
if (vector[0] == va || vector[1] == va) {
count = 1;
}
else{
count=0;
}
return (count);
}
int main()
{
vector< vector<int> > vinput;
vinput.reserve(32);
vinput.push_back(va);
vinput.push_back(vb);
int counter = 0;
for(unsigned long long int i=0;i<4294967295;i++){ //4294967295
counter += caevolve(i, vinput);
}
cout<< "Counter : " << counter << endl;
return 0;
}
以防萬一:IO(如'cout'尤其是'endl')也有很大的成本,應避免在生產算法。 – pmr 2012-07-20 16:32:31
'ca2step'應該完成什麼?如果可能的話,我的直接反應就是消除'rotate_copy'。至少從目前來看,它看起來像是單獨放置矢量,並且在下標中使用'%'可以避免相當多的複製。 – 2012-07-20 16:33:01
if if(vinput [0] == va | vinput [1] == va){'be change into'if(vinput [0] == va || vinput [1] == va){' – timrau 2012-07-20 16:48:46