Löschen eines Arrays mit definierten Element(en) - Seite 21

 
Ich weiß nicht, wie es sich mit
ArraySetAsSeries(array,true);
Bei der letzten Variante habe ich auch einen Scheck dafür ausgestellt. Wer es braucht, kann es nutzen.
Dateien:
 
Реter Konow:

Richtig. Aber woher wissen wir, dass die bereitgestellten Algorithmen keine Leerstellen hinterlassen? Die Prüfsumme beweist es nicht. Auch die Anzahl der Elemente spielt keine Rolle. Schließlich zählt die Funktion die Elemente, die vor der Größenänderung des Arrays vorhanden waren.

In fast allen vorgestellten Fällen wird dies ohne Probleme durch das Senden einer Abfrage mit NULL umgesetzt.

Der Tag Konow:

Es gibt noch eine weitere Anforderung an den Algorithmus - die korrekte Platzierung von Elementen innerhalb des Arrays nach dem Entfernen unnötiger Elemente. Diese Prüfung muss zuvor durchgeführt worden sein. Dann wird die Geschwindigkeit überprüft.

Der Code erklärt, welche davon was zurückgeben. Es gibt gemischte Arrays. Sie befinden sich in einem anderen Bereich.

P.S. Und nur fürs Protokoll. Meine Funktion hat einige Prüfungen, aber sie werden nicht verwendet. Aber das alles und noch viel mehr hat sie bereits.

 

Ich stelle die Professionalität der Teilnehmer und ihrer Plätze nicht in Frage. Ich habe lediglich auf einen Fehler in der Prüfsummenüberprüfung hingewiesen und auf die Notwendigkeit einer zusätzlichen Überprüfung der Richtigkeit der Anordnung der Elemente in der neuen Anordnung.

Wenn das alles stimmt, habe ich verdientermaßen den vorletzten Platz belegt.

In meiner Praxis mache ich mir selten Gedanken über die Geschwindigkeit bestimmter Vorgänge. Mir geht es mehr um die Prägnanz und Klarheit der Lösung. Es hat mich überrascht, dass dieser Eintrag

if(Arr[q]==val){deleted++; q--;}

könnte langsam sein.

Aber wenn wir ein weiteres Kriterium für die Bewertung von Algorithmen hinzufügen - die Kompaktheit der Lösung - bin ich wahrscheinlich an erster Stelle.

Wenn man die beiden Kriterien - Geschwindigkeit und Komprimierung - kombiniert und den Durchschnittswert des Algorithmus berechnet, dann nehme ich einen höheren Platz in der Tabelle ein.

Fedoseyevs Version ist allerdings noch komprimierter als meine.
 
Реter Konow:

Wenn man jedoch ein weiteres Kriterium zur Bewertung von Algorithmen hinzufügt, nämlich die Lösungskomprimierung, liege ich wahrscheinlich an erster Stelle.

Ihre Version der Hauptschleife:

for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val)
        {
         deleted++; 
         q--;
        }
      q++;
     }

und das ist das von Fedoseyev:

for(;i<sz;i++)
     {
      if(a[i]!=v)
        {
         a[j]=a[i];
         j++;
        }
     }

Beide Varianten bewirken das Gleiche. Wer hat die meiste Prägnanz?

 
Nikolai Semko:

Ihre Version des Hauptzyklus:

und das ist das von Fedoseyev:

Beide tun das Gleiche. Wer hat die prägnanteste?

Er. Er hat es anstelle von...

for(int a1=0; a1<ArraySize(Arr); a1++)
for(;i<sz;i++)

Das ist prägnanter.)

 
Реter Konow:

Das hat er. Er hat es anstelle von...

Das ist prägnanter.))

Das Gleiche gilt für den Compiler.

Sie haben einfach eine Menge unnötiger Dinge, so dass sie langsamer arbeiten als alle anderen (ich ziehe nicht einmal die erste Option des Themas in Betracht).

Fedoseyevs Code hat eine Prüfung, eine Zuweisung und ein Inkrement in einem Schleifendurchlauf (ich zähle Prüfungen und Inkremente für die Schleifenorganisation nicht mit).

Im Gegensatz dazu haben Sie zwei Prüfungen, eine Summe von zwei Variablen, drei Inkremente und eine Zuweisung.

 
for(int a1=0; a1<ArraySize(Arr); a1++)

Es bleibt nur zu hoffen, dass der Compiler optimiert, sonst wird ArraySize bei jeder Iteration ausgeführt.

 
Aleksey Lebedev:

Es bleibt nur zu hoffen, dass der Compiler optimiert, sonst wird ArraySize bei jeder Iteration ausgeführt.

Ja, der Compiler scheint zu prüfen, ob sich die Größe des Arrays in der Schleife nicht ändert, und ersetzt diese Funktion selbständig durch einen Wert und berechnet diese Funktion nur einmal.
Auf jeden Fall, wenn Sie das tun:

const int size=ArraySize(Arr);
for(int a1=0; a1<size; a1++)

wird sich die Ausführungszeit der Funktion nicht ändern.

Aus Gründen der Kompaktheit ist es also sinnvoll, es genau so zu schreiben, wie Peter es getan hat :)
Aber ich stimme zu, mir persönlich brennt es auch in den Augen. Es fühlt sich an, als würde die Funktion jedes Mal aufgerufen werden.

 
Nikolai Semko:

Aber ich stimme zu, mich persönlich schreckt das auch ab. Es fühlt sich an, als würde die Funktion jedes Mal aufgerufen werden.

imho ist es besser, dem Compiler keine Wahl zu lassen)

Lassen Sie mich Ihnen eine Frage stellen,

if(Anzahl>6) { ArrayCopy

mehr als sechs - ist der Wert nach wissenschaftlichem Bauchgefühl ermittelt worden oder gibt es eine Begründung dafür?)
 
Aleksey Lebedev:

Imho ist es besser, dem Compiler keine Wahl zu lassen)

Lassen Sie mich Ihnen eine Frage stellen,

if(Anzahl>6) { ArrayCopy

mehr als sechs - der Wert wird durch ein wissenschaftliches Bauchgefühl ermittelt, oder was ist die Begründung dafür?)

Ja, das ist genau das Richtige. Die Methode des wissenschaftlichen Bauchgefühls. Nach meinen Beobachtungen sind es zwischen 5 und 8. Sie können diesen Vorgang automatisieren, indem Sie diese Zahl jedes Mal automatisch einstellen. Schließlich kann diese Zahl für verschiedene Prozessoren und Systeme unterschiedlich sein.

Wenn Sie zum Beispiel alle ArrayCopy und ArrayFill in der CCanvas-Klasse nach diesem Prinzip ändern, können Sie einen schönen Gewinn an Geschwindigkeit der Leinwand erhalten.