Laden...

Suche Jedes-mit-Jedem Algorithmus

Erstellt von saio vor 16 Jahren Letzter Beitrag vor 16 Jahren 5.236 Views
S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren
Suche Jedes-mit-Jedem Algorithmus

Hallo liebe Kollegen,

ich arbeite zur Zeit an einem Scheduler-Programm.

Jedoch hänge ich momentan an einer Stelle, für die eine bestimmter Algorithmus benötigt wird.

Folgendes Problem soll der Algo lösen können:

-ich habe ein array mit n Feldern int[] myArr = new int[n];
-jetzt sollen alle Wert von allen Feldern einzeln miteinanander verglichen werden
->sagen wir einfach mal n ist 5 dann müssen folgende Felder verglichen werden:

         myArr[0] mit myArr[1]  
         myArr[0] mit myArr[2]  
         myArr[0] mit myArr[3]  
         myArr[0] mit myArr[4]  

                                           myArr[1] mit myArr[2]  
                                           myArr[1] mit myArr[3]  
                                           myArr[1] mit myArr[4]  

                                                                             myArr[2] mit myArr[3]  
                                                                             myArr[2] mit myArr[4]  

                                                                                                                                                                                                                   myArr[3] mit myArr[4]  

Ich habe da an eine Art verschachtelte Schleifenstruktur gedacht, aber leider komme ich nicht auf die Lösung, weil ja die Anzahl der Arrayfelder erst zur Laufzeit bekannt wird.

Kann mir bitte jemand einen Tip geben?

Grüße saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

Gelöschter Account
vor 16 Jahren
foreach(int i in iarry1)
{
foreach(int j in iarray2)
{
}
}

oder als forschleife gegen den length der arrays

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Besten Dank für deine Hilfe habs jetzt so gemacht:

            foreach (DateTime i in date)
            {
                foreach (DateTime j in date)
                {
                    i +=j;
                    ...
                }
            }

Jedoch brauche ich noch den Index des momentanen Arrays.

In php ging das irgendwie mit key=>var oder so ähnlich.

Geht das auch irgendwie in C#?

Gruß saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

Gelöschter Account
vor 16 Jahren

date.IndexOf(i);

oder

date.IndexOf(j);

oder du machst das wie gesagt gegen die länge des arrays.

for(int i = 0; i < myarray.Length; i++)
{
for(int j = 0; j < myarray2.Lenth; j++)
{blubb}
}
S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Das Zauberwort lautet myarray.Length 😁

Hast mich echt gerettet JAck30lena - Danke für das schöne Wochenende 🙂

Viele liebe Grüße

saio 8)

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

O
778 Beiträge seit 2007
vor 16 Jahren

ständig IndexOf zu benutzen ist aber nicht so toll, weil man dann (wenn der Compiler das nicht wegoptimiert) ständig das gesamte Array durchsucht. Ein Zugriff auf ein diskretes Arrayelement per Index ist dagegen deutlich schneller.

Gelöschter Account
vor 16 Jahren

kommt auf die art des array an aber prinzipiell hast du schon recht. wenn man den index braucht, dann ist eine foreachschleife eh nur kontraproduktiv und man sollte deshalb die forschleife nehmen.

1.361 Beiträge seit 2007
vor 16 Jahren

Nur mal als Frage, wozu willst du den jedes mit jedem Vergleichen ?!?!?!?!?!

beste Grüße
zommi

Gelöschter Account
vor 16 Jahren

ich könnte mir vorstellen das man so herausbekommt welches der beiden arrays den z.b. höchsten wert hat und auch die indexposition kann man dadurch herausfiltern.

1.361 Beiträge seit 2007
vor 16 Jahren

aber er sprach doch sowieso nur von einem einzigen Array, und nich zwei.

Wenn es ihm möglich ist, für seine Objekte nicht bloß die Gleichheit/Ungleichheit festzulegen sondern irgendwie noch ne Ordnung reinbringt (also größer/kleiner zwischen zwei Objekten)
Dann wär es ja für seine Aktion vielleicht auch sinnvoll mit dieser Ordnung zu sortieren.
Und das würde nur einen Aufwand von O(n*logn) anstatt von O(n^2) bedeuten.

Und das "höchsten Wert" rausfinden geht ja eh nur, wenn er ne Ordnung definiert hat.
Und da wäre das sortieren schonmal sinnvoller 🙂
Wobei das höchster Wert rausfinden dann ja sogar in O(n) geht

Gerade deshalb ist es ja interessant zu wissen, was saio wirklich damit machen will 🙂

beste Grüße
zommi

Gelöschter Account
vor 16 Jahren

oh ja richtig. das ist mir noch garnicht aufgefallen.
ich hab mich auf das problem selbst konzentriert^^

aber wenn ich mir den letzten post von ihm ansehe dann gehe ich mal davon aus das wir es erst am montag erfahren ^^

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Hallo Ihr Lieben,

finds echt toll, dass Ihr Euch so viele Gedanken gemacht habt, leider war ich da schon im Wochenende... 😁

Ich brauche die Sache, da ich ein Datumsarray mit unbestimmt vielen Feldern habe.

Jetzt soll aus diesem array: date[n], dass früheste Datum in die Variable tempDate gespeichert werden.

Ich habe das jetzt so gelöst:


        private DateTime tempDate;
        public DateTime nextDate;
        private DateTime[] date;
        private int[] resID;
        public int nextRes;

public void calcNextDate()
        {
            tempDate = new DateTime(9999, 12, 31);
            if (date.Length > 1)
            {
                for (int i = 0; i < date.Length; i++)
                {
                    for (int j = 0; j < date.Length; j++)
                    {
                        if (i != j)
                        {
                            if (date[i] <= date[j] && date[i] < tempDate)
                            {
                                tempDate = date[i];
                            }
                            else if (date[j] <= date[i] && date[j] < tempDate)
                            {
                                tempDate = date[j];
                            }
                        }
                    }
                }
            }
            else
            {
                tempDate = date[0];
            }

            for (int d = 0; d < date.Length; d++)
            {
                if (date[d] == tempDate)
                {
                    nextDate = date[d];
                    nextRes = resID[d];
                }
            }
        }

Für eine performantere Lösung halt ich gern die Lauscher bzw. Augen auf... =)

Liebe Grüße saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

1.378 Beiträge seit 2006
vor 16 Jahren

Du müsstest es noch durchtesten, aber ich denke folgender Code erledigt die gleiche Aufgabe nur halt kürzer.


        public DateTime nextDate;
        private DateTime[] date;
        private int[] resID;
        public int nextRes;

        public void calcNextDate()
        {
            int j = 0;
            for (int i = 1; i < date.Length; i++)
            {
                if (date[i] < date[j])
                    j = i;
            }
            
            nextDate = date[j];
            nextRes = resID[j];
        }

Lg XXX

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo xxxprod,

ganz stimmt dein Algorithmus noch nicht.

Wenn das Array mehr als ein Element hat und das erste das kleinste ist, wird es nicht gefunden. Außerdem knallt es, wenn das Array gar keine Elemente hat.

Aber es stimmt natürlich, dass es nicht nötig und erst recht nicht sinnvoll ist, alle Elemente mit allen zu vergleichen, nur weil man das kleinste Element finden will. Da ist dein Ansatz deutlich besser.

herbivore

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Hallo,

besten Dank für euer Engagement.

@herbivore:

wie sollte ich deiner Meinung nach den Code gestalten?

Greetz saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

1.378 Beiträge seit 2006
vor 16 Jahren

Hallo Herbivore,

Wenn das Array mehr als ein Element hat und das erste das kleinste ist, wird es nicht gefunden.

ich denke schon das der Algorythmus dieses Element finden würde, da j ja mit 0 initialisiert wird. Das heißt, wenn das erste Element das jüngste ist, dann bleibt j immer 0 🙂

Lg XXX

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Hallo xxxProd,

ich habe mal versucht deinen Code mit meinem zu erstzen.

Von der Perfomance her ist es um einiges schneller, jedoch ist nicht unbedingt gesagt, dass date[0] das jüngste Datum als Wert hat.

Trotzdem dank ich Dir für deine Mühe 🙂

LG saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

1.378 Beiträge seit 2006
vor 16 Jahren

Ich hab nicht gesagt das date[0] das jüngste Datum hat, sondern das j aufs jüngste Datum zeigt, und wenn date[0] das jüngste Datum ist, dann bleibt j auch auf 0.

Lg XXX

Gelöschter Account
vor 16 Jahren

also wenn das array 0 oder 1 element hat, dann fliegt so ein indexzugriff auf die schnauze ^^

deshalb lieber ein foreach verwenden und man muss sich nicht mehr darum kümmern....

hier mal mein ansatz:

private DateTime GetEarliestNewDate(DateTime[] dateArray)
        {
            if(dateArray == null)
            {
                throw new ArgumentNullException("dateArray");
            }
            long tempTicks = DateTime.MaxValue.Ticks;
            foreach (DateTime dtime in dateArray)
            {
                if(dtime.Ticks < tempTicks)
                {
                    tempTicks = dtime.Ticks;
                }
            }
            return new DateTime(tempTicks);
        }
        private DateTime GetEarliestDateObject(DateTime[] dateArray)
        {
            if (dateArray == null)
            {
                throw new ArgumentNullException("dateArray");
            }
            DateTime tempDate = DateTime.MaxValue;
            foreach (DateTime dtime in dateArray)
            {
                if (dtime.Ticks < tempDate.Ticks)
                {
                    tempDate = dtime;
                }
            }
            return tempDate;
        }

einmal mit der version das es ein komplett neues datetimeobjekt erzeugt und einmal die version die das bereits existierende datetime objekt zurückgibt. das einbinden in deinen quellcode (weil deine private fields nicht gesetzt werden) überlasse ich dir (voraussgesetzt du möchtest diesen lösungsansatz verwenden).

liebe grüsse
Jack

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

@xxxprod: hm, mit deinem code tut es jetzt anscheinend funktionieren,muss aber noch erst alle eventualitäten prüfen - Gracias 🙂

@Jack: WOW - ok so sieht es wohl aus wenn man alles beim Programmieren berücksichtigt. Aber die Funktion wird eh nur dann aufgerufen, wenn auch wirklich schon ein Wert im Array gesetzt worden ist. Danke Dir Jack... 🙂

Ich versuchs jetzt mal mit prods Variante - schneller ist es auf jeden Fall hoffentlich auch Fehlerfrei.

Bin mal prüfen....

Danke nochmals Euch allen für die Hilfe 👍

Viele liebe Grüße

saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo xxxprod,

Das heißt, wenn das erste Element das jüngste ist, dann bleibt j immer 0

stimmt, ich ziehe den Einwand mit dem ersten Element zurück.

herbivore

4.221 Beiträge seit 2005
vor 16 Jahren

Nur so als Anmerkung am Rande

Wieso das Rad selber erfinden ?

Array.Sort und dann das Item-0 ziehen

Also insgesamt 2 Zeilen Code

🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

1.378 Beiträge seit 2006
vor 16 Jahren

So wie mir das aussieht, stehen die 2 Arrays durch ihre Index-Positionen in Relation.

Dadurch würden es dann wohl wieder mehr als 2 Zeilen werden oder?

Lg XXX

4.221 Beiträge seit 2005
vor 16 Jahren

@xxxprod

Ich habe es nur überflogen... aber so weit ich gesehen habe handelt es sich nur um 1 Array...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

1.361 Beiträge seit 2007
vor 16 Jahren

Hi Programmierhans,
Das Rad neu erfinden würde ich ja nun nich sagen 😉

Und das gesamt Array zu sortieren nur um den größten Wert zu erhalten is halt auch wie mit Kanonen auf Spatzen😉

(Ich nehm ja auch nich Reflection nur um ne Property über GetType, GetProperty und SetValue zu setzen - nur der eleganz willen 😉

beste Grüße
zommi

4.221 Beiträge seit 2005
vor 16 Jahren

Hi Programmierhans,
Und das gesamt Array zu sortieren nur um den größten Wert zu erhalten is halt auch wie mit Kanonen auf Spatzen😉
beste Grüße
zommi

Je nach Grösse des Array und Häufigkeit des Aufrufes 🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...