002
22.04.2009, 18:07 Uhr
Manfred-BW
|
Hallo Hans,
erst mal danke für deine Antwort.
Daß ich von C generell wenig Ahnung habe, hatte ich ja extra erwähnt.
Deshalb bin ich ja mit Erklärungen auch zufrieden.
Vom Programmcode habe ich leider nicht mehr und alles ist ohne Kommentare. Die Kommentare habe ich vom Wissen solcher Problemstellungen selbst erfunden und die dürften nicht so falsch sein.
Ich dachte, daß zusammen mit der Problembeschreibung der Programmcode zu verstehen sein müßte bzw. nachentwickelt oder zumindest erklärt werden könnte.
Extra C++ zu lernen, einen Compiler zu installieren und tagelang rumzuprobieren und dann doch nichts zu verstehen ist dann doch wohl zu langwierig für mich, da ich ja auch noch berufstätig bin.
Natürlich ist es das sinnvollste, den Autor zu Fragen was er gemacht hat. Ich habe dem Autor deshalb schon Fragen gestellt, aber leider keine Antworten bekommen. Jeder Programmierer hat da wohl so seine Geheimnisse und ich verüble ihm das nicht. Deshalb wende ich mich ja an dieses Forum.
Vielleicht kommt sonst jemand mit meinen Beschreibungen weiter? Unten gibt es jetzt noch einige Zusatzinformationen.
Daß ein C++ Programm nur 5 Sekunden braucht und das schnelle GFA 32bit Basic viele Stunden, kann nicht nur an den verschiedenen Programmen liegen sondern muß mit der speziellen Programmroutine mit Matrizenrechnung oder Vektorprogrammierung zusammenhängen.
Ich kann in GFA32 Basic ebenfalls mit Matrizen und Zeigern programmieren, kann C-Code und Assemblercode einbinden. Habe das jedoch noch nie gemacht und brauche deshalb erst mal das Verständnis was den Beispielcode so schnell macht und wie er funktionieren könnte.
Weil das Beispiel in C++ ist, ist es doch wohl das sinnvollste, in einem C++ Expertenforum nachzufragen, oder?
Die Aufforderung, erst mal C++ zu lernen, bringt mich überhaupt nicht weiter. Da bitte ich doch um mehr Nachsicht.
Gruß, Manfred-BW
Ich habe noch folgende Informationen woraus man sieht nach welchem Prinzip er programmiert. Das erste Programm sucht in einer Matrix mit 6 Nummern in einer Reihe die 3er Kombinationen aus allen möglichen 18424 Dreierkombinationen heraus, die NICHT in der Matrix vorhanden sind. Ich möchte aber diese und nur diese welche vorhanden sind :
my program for missing triples use 3000 or 4000 triples and search in all 13 milions comb of 6 for that wich cover 20 triples because combs 6 to 3 =20;
but it doesn't seems like the process for 3 000 000 lines.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
the code for missing triple is very simple, this:
C++: |
#include<stdio> #include<iostream> #include <time> #include<stdlib> #include<math> #include<mbstring> #include<string>
void main() { int i,j,k,k1,b22; int **m; FILE *p,*q1; m=new int*[100000];
for(i=0;i<100000;i++) { m[i]=new int[60]; }
if( (q1=fopen("c:\\Temp\\triples_frank.txt","w"))==NULL) exit(1); else b22=0; if( (p=fopen("c:\\Temp\\triple.txt","r"))==NULL) exit(1); else b22=0;
int lcoloane=52;
i=1; j=1; while(fscanf(p,"%d",&k)==1) { m[j][i++]=k; if(i==4) { i=1; j++; } }//copiere fisier fclose(p); int lmax=j;
int n,n1,n2,j1,j2,s,s1,s2,s3,u1,cont; int x,x1,x2,x3,x4,x5,cont1;
n=0; for(x=1;x<=45;x++) for(x1=x+1;x1<=46;x1++) for(x2=x1+1;x2<=47;x2++) for(x3=x2+1;x3<=48;x3++) for(x4=x3+1;x4<=49;x4++) //for(x5=x4+1;x5<=49;x5++) { n++; cont1=0; for(k=1;k<lmax;k++) { cont=0; for(k1=1;k1<3>5) { fprintf(q1,"%d\t%d\t%d\t%d\t%d\t%d\n",x,x1,x2,x3,x4,cont1); cout<<n<<endl; } }
fclose(q1);
delete m; } }
|
read tre triples in a matrix; generate combs one by one and pass throught all triples to see if the combs has 20 triples covered.
if find, print them
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Folgender Programmausschnitt ermittelt innerhalb der 14Mio Zeilen von 6 aus 49 von der Zeile mit den Zahlen 2-4-20-32-39-41 (etwa Zeilen Nr. 2 Mio) bis zur Zeile mit den Zahlen 4-8-10-14- 15-48 etwa Zeilen Nr. 6Mio (ein Bereich von etwa 4Mio Zeilen) daraus 4126452 Dreierkombinationen die anschließend gezählt werden und dann nur 2960 verschiedene Dreierkombinationen ergeben:
I've found between 2 milions and 6 milions lines from combs 49 to 6 only 2960 different triples; I used the code for combs:
C++: |
for(y1=2;y1<=4;y1++) for(y2=y1+1;y2<=45;y2++) for(y3=y2+1;y3<=46;y3++) for(y4=y3+1;y4<=47;y4++) for(y5=y4+1;y5<=48;y5++) for(y6=y5+1;y6<=49;y6++)
|
because the comb with no 2 mil. = 2-4-20-32-39-41 and with 4mil. is = 4-8-10-14- 15-48 and the choosen range is little more than it; y1 between 2 and 4 ; I've obtain 4126452 combs and than 2960 different triples. XXXXXXXXXXXXXXXXXXXXXXXXXXXX Das ist der code vom ersten Posting ohne Kommentare:
I've obtained all triples from 3 000 000 lines with a matrix with 3 dimensions; here is that code but for all different triples:
C++: |
for(y1=2;y1<=4;y1++) for(y2=y1+1;y2<=45;y2++) for(y3=y2+1;y3<=46;y3++) for(y4=y3+1;y4<=47;y4++) for(y5=y4+1;y5<=48;y5++) for(y6=y5+1;y6<=49;y6++) { i++; m[i][1]=y1;m[i][2]=y2;m[i][3]=y3;m[i][4]=y4;m[i][5]=y5;m[i][6]=y6; if(i%1000000==0) cout<<i<<endl; nr[y1]=1;nr[y2]=1;nr[y3]=1;nr[y4]=1;nr[y5]=1;nr[y6]=1; cont1=0; for(z1=1;z1<=4;z1++) for(z2=z1+1;z2<=5;z2++) for(z3=z2+1;z3<=6;z3++) { if(m2[m[i][z1]][m[i][z2]][m[i][z3]]!=0) cont1=100; } if(cont1==0) { for(z1=1;z1<=4;z1++) for(z2=z1+1;z2<=5;z2++) for(z3=z2+1;z3<=6;z3++) { if(m2[m[i][z1]][m[i][z2]][m[i][z3]]==0) m2[m[i][z1]][m[i][z2]][m[i][z3]]++; } } }
|
perhaps in 5 sec
For this lines I've obtained 2960 different triples
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Bearbeitung von 0xdeadbeef: |
cpp-tags eingefügt, Code eingerückt. Nächstes mal selbst machen, sonst kann das keine Sau lesen.
|
Dieser Post wurde am 22.04.2009 um 18:15 Uhr von 0xdeadbeef editiert. |