xaotikos Δημοσ. 4 Ιουνίου 2004 Δημοσ. 4 Ιουνίου 2004 Λοιπόν έχω ένα πλήθος αριθμών i και ψάχνω να βρώ όλους τους πιθανούς συνδιασμούς μεταξύ τους... Αναλυτικότερα: Έχω έναν μονοδιάστατο πίνακα έστω Array και ψάχνω μια ρουτίνα που θα μπορώ αλλάζοντας μόνο μια μεταβλητή να βρω όλους τους πιθανούς συνδιασμούς. Από ανα 2 εως και ανα i. Για παράδειγμα έστω πίνακας Array[4]: Αρχικά όλους τους πιθανούς ανα 2: Array[0] &Array[1], Array[0] &Array[2], Array[0] &Array[3], Array[1] &Array[2], Array[1] &Array[3], Array[2] &Array[3] Το πλήθος των συνδιασμών είναι Ν!/κ!(Ν-κ)! όπου Ν το πλήθος των στοιχείων του πίνακα στο παράδειγμα 4 και κ οι συνδιαζόμενοι αριθμοί-2 Άρα στο παράδειγμα έχουμε 6 συνδιασμούς και τα αποτελέσματα κρατιούνται σε έναν πίνακα πχ **Results (που τώρα είναι Results[6][2]) Επομένω ψάχνω να φτιάξω μια ρουτίνα που να δίνω μόνο τον συνδιασμό (ανα 2,3 κ.ο.κ)και να μπορεί να μου βρίσκει όλους τους αντίστοιχους συνδιασμούς του μονοδιάστατου πίνακα (ο συνδιασμός 0,1 είναι ίδιος με το 1,0). Φυσικά θα πρέπει ο πίνακας που θα κρατάει τους συνδιασμούς να γίνεται realloc ώστε να μπορεί να κρατάει από 2άδες μέχρι και πχ 40άδες αναλόγως το μέγεθος του μονοδιάστατου πίνακα και τα συνδιαζόμενα στοιχεία . Υποψιάζομαι ότι θέλει μια recursive ρουτίνα αλλά όσο και να έσπασα το κεφάλι μου δεν μπόρεσα να φτιάξω κάποιο αλγόριθμο... Πεδεύομαι αρκετά με ένα project (πτυχιακή μου είναι) και τώρα το έχω βάλει να κάνει συνδιασμούς μέχρι ανα 4 (με λούπες και επαναλήψεις) πράγμα που πέρα από σωστό δεν μπορεί να χρησιμοποιηθεί για όλους τους πιθανούς συνδιασμούς... Ευχαριστώ προκαταβολικά.
nobody Δημοσ. 5 Ιουνίου 2004 Δημοσ. 5 Ιουνίου 2004 Des sto Numerical recipes in C. Parexetai dwrean se pdf&exei polles routines c gia mathimatika provlhmata.
xaotikos Δημοσ. 5 Ιουνίου 2004 Μέλος Δημοσ. 5 Ιουνίου 2004 Ευχαριστώ φίλε μου. (αν υπάρχει κάπου μαζεμένο το pdf να το κατεβασω.....) Το κοίταξα στα πεταχτά αλλα δεν είδα τίποτα σχετικό. Θα το ψάξω περισσότερο...
baxter Δημοσ. 5 Ιουνίου 2004 Δημοσ. 5 Ιουνίου 2004 file eiha ki egw to idio provlima kapote kai meta apo kabosi skepsi to katafera... mou pire ligi wra na to xanathimithw gia na sou ftiaxw to example... apo 10 ana 10 sindiasmous kai panw argei poly... to programmataki afto sou zitaei to i (arithmos stoiheiwn) kai tis times twn i stoiheiwn kai sou typwnei se ena file (results.txt) olous tous dynatous sindiasmous apo : i ana 2 -ews- i ana i skepsou to san ena noito pinaka, an as poume eihes 4 stoiheia arr[0] = 1 , arr[1] = 2 , arr[2] = 3 , arr[3] = 4 tote tha eihes afton ton pinaka : 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 aftos o pinakas einai noitos , dld den ton ylopoieis to mono pou hreiazesai einai ena allo array p[4] pou tha periehei enan arithmo deikti gia kathe stili. arhika tha ehoume : p[0] = 0 , p[1] = 0 , p[2] = 0 , p[3] = 0 ara o sindiasmos tha einai 1 1 1 1 sti sineheia kathe fora tha afxanoume to p[3] kata 1, ara sti sineheia tha ehoume : 1 1 1 2 an to p[3] ginei megalitero tou 3 tote to p[3] tha ginei 0 kai to p[2]++ ... san to dekadiko systima doulevei... des kai to example kai tha katalaveis hrisimopoiw pinakes egw edw gia na kanw ti douleia mou twra an esy thes kati me "reallocation" tha prepei na to kaneis monos sou edw einai mono i lisi gia tous sindiasmous > include <stdio.h> int main() { int arr[9]; //to array pou periehei ta stoiheia mas (max 9,to megalwneis an thes alla den to sinistw giati argei) int p[9]; //o pinakas me tous deiktes mas ston noito pinaka (an ehoume arr[i] tote tha ehoume p[i]) int i,k,x,y,print_it,done,total; FILE *f1; printf("Dwse i : "); scanf("%d",&i); //o arithmos twn stoiheiwn (mehri 6 edw giati ehoume arr[6] ) for (x=0;x<i;x++) { printf("Dwse arr[%d] : ",x); scanf("%d",&arr[x]); // diavazoume ta stoiheia apo to keybord } printf("\n\n"); if ((f1=fopen("results.txt","w"))==NULL) { //anoigoume to arheio pou tha apothikefsoume printf("cannot open file..."); return 0; } for (k=2;k<=i;k++) { // gia k apo 2 mehri i , dld o arithmos twn sindiasmwn for (x=0;x<i;x++) p[x]=0; //thetoume olous tous deiktes sto prwto stoiheio kathe stilis tou noitou pinaka total = 0; //to total sto telos tha periehei tous total sindiasmous do { //epanelave done = 1; //eleghoume an ehoun teleiwsei oi sindiasmoi for (x=0;x<k;x++) //dld an oloi oi deiktes einai isoi me i-1 (dld me to teleftaio stoiheio) if (p[x] != i-1) done = 0; //an nai tote typwnoume ton teleftaio sindiasmo kai sinehizoume print_it = 1; for (x=0;x<k;x++) //eleghoume an se afton ton sindiasmo ehoume idia stoiheia for (y=x+1;y<k;y++) //dld an 2 or perissoteroi deiktes ehoun tin idia timi if (p[x] == p[y]) print_it = 0; //an nai, tote den typwnoume ton sindiasmo if (print_it) { // an ohi for (x=0;x<k;x++) fprintf(f1,"%d ",arr[p[x]]); // tote typwnoume ton current sindiasmo fprintf(f1,"\n"); total ++; } p[k-1]++; //afxanoume ton teleftaio deikti kata 1 for (x=k-1;x>0;x--) //eleghoume apo ton teleftaio deikti mehri ton 2o an kapoios perase to orio if (p[x] > i-1) { //an nai, tote thetoume ton deikti pou perase to orio iso me 0, kai afxanoume kata 1 ton amesws proigoumeno p[x] = 0; p[x-1]++; } } while (!done); //an den teleiwsame tote pame gia ton epomeno sindiasmo alliws sinehizoume fprintf(f1,"\nSindiasmoi twn %d ana %d -> %d\n\n\n",i,k,total); //typwnoume kapoia info } // sinehizoume gia perissoterous sindiasmous fclose(f1); printf("\n\nResults saved in results.txt ..."); return 0; }
xaotikos Δημοσ. 5 Ιουνίου 2004 Μέλος Δημοσ. 5 Ιουνίου 2004 Ωραίος!!! Ευχαριστώ για το χρόνο σου. Ελπίζω να βρω χρόνο να το υλοποιήσω αύριο...θα στείλω αποτελέσματα
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.