Pseudocode: if-then-else (Logikfrage) - Vereinfachung
-
Eigentlich kenne ich mich damit ganz gut aus, aber ...
Definiere Liste1 und Liste2 ... (Liste1 enthält "alle" Elemente, Liste2 ist "zu Beginn" leer) Für jedes A in Liste1: Wenn wertvoll(A) und A nicht in Liste2: Füge A in Liste2 ein Wenn A in Liste2: Tue etwas mit A
Kann die doppelte Überprüfung, ob A in Liste2 ist oder nicht, irgendwie geschickt vermieden werden?
E: Ups, noch etwas vergessen, Zeile 3 bis 7 wird periodisch mehrmals aufgerufen/durchgelaufen.
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Kann die doppelte Überprüfung, ob A in Liste2 ist oder nicht, irgendwie geschickt vermieden werden?
Ja, einfach weglassen.
Gemäss deiner Beschreibung ist schliesslich
A
nur dann inListe2
, wenn es vorher eingefügt wurde, also kannst du das in den selben Bedingungs-Block packen, wie das Einfügen.Falls du ferner die
Liste2
nur für diese Schleife benötigen solltest, kannst du die auch komplett weglassen und einfach direkt was mitA
"tun"
-
@Fragender sagte in [Pseudocode: if-then-else
Ja, einfach weglassen.
Gemäss deiner Beschreibung ist schliesslich A nur dann in Liste2, wenn es vorher eingefügt wurde, also kannst du das in den selben Bedingungs-Block packen, wie das Einfügen.
Da musst du aufpassen: A kann mehrmals in Liste1 vorkommen, daher musst du in jedem Fall handeln:
Wenn wertvoll(A): Wenn A nicht in Liste2: Füge A in Liste2 ein Tue etwas mit A
Aber dies setzt voraus, dass
wertvoll(A)
eine konstante Eigenschaft ist, was ja eventuell auch nicht gegeben ist. Fallswertvoll(A)
von anderen Dingen als nurA
abhängt, könnte man es so machen:bool_A_in_liste2 := A in Liste 2 bool_wertvoll_A := wertvoll(A) Wenn bool_wertvoll_A und nicht bool_A_in_liste2: Füge A in Liste2 ein Wenn bool_wertvoll_A oder bool_A_in_liste2 : Tue etwas mit A
Das sollte mit allen anzunehmenden Nebeneffekten klar kommen. Wenn die Nebeneffekte was absichtlich verrücktes sind aber nicht, z.B. wenn
wertvoll(A)
davon abhängt, wie oft die Liste2 durchgezählt wurde.Wie ich den Fragestelle aber kenne, ist das vermutlich eher ein Fall von unpassender Datenstruktur und die eigentlich Vereinfachung ist etwas ganz anderes, etwa ein Set zu nutzen.
E: Ups, noch etwas vergessen, Zeile 3 bis 7 wird periodisch mehrmals aufgerufen/durchgelaufen.
Soll das heißen, das ist nebenläufig? Dann musst du sowieso ganz anderes daran gehen.
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
E: Ups, noch etwas vergessen, Zeile 3 bis 7 wird periodisch mehrmals aufgerufen/durchgelaufen.
Bedeutet das, du möchtest bei jedem Aufruf etwas mit den Elementen in
Liste2
machen und nicht nur einmal, wenn sie als "wertvoll" erkannt wurden?In dem Fall bietet sich an, den zweiten Bedingungs-Block in einer zweite Schleife auzulagern, die nur über
Liste2
läuft. So spart man sich auch die Überprüfung.Vielleicht geht es ja auch ganz ohne Überprüfung, ob sich
A
in Liste2 oder nicht befindet:Für jedes A in Liste1: Wenn wertvoll(A): Füge A in Liste2 ein Entferne A aus Liste1 Für jedes A in Liste2: Tue etwas mit A
-
@SeppJ sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Da musst du aufpassen: A kann mehrmals in Liste1 vorkommen, daher musst du in jedem Fall handeln:
Ich bin davon ausgegangen, dass es keine mehrfachen Elemente gibt, aber das stimmt natürlich, dass das einen Unterscheid machen kann - je nachdem wie die Anforderungen sind. Es könnte ja auch sein, dass man für jedes
A
nur einmal etwas machen will, auch wenn es mehrmals in der Liste steht. Hier wären auf jeden Fall ein paar mehr Details hilfreich, @Fragender. Auch was das "mehrmals aufgerufen" angeht.
-
Ne, ihr trefft zu viele Annahmen, die dort nicht stehen...
Also, erstmal ist "wertvoll" eine Methode ohne Nebeneffekte, sie bestimmt einfach nur, wie wertvoll oder nicht ein Element ist.
Zweitens ist nicht nebenläufig gemeint gewesen, sondern nur, dass es mehrere Durchläufe gibt (normale Schleife).
Und zum Sinn: Ob ein Element wertvoll ist oder nicht, kann sich nach jedem Durchlauf der Schleife ändern. Sobald aber ein Element wertvoll ist oder schonmal wertvoll war, soll es in der Liste 2 sein und es soll etwas damit getan werden...
Einfach eine zusätzliche Variable einfügen, finde ich iwie "doppelt gemoppelt".
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Ne, ihr trefft zu viele Annahmen, die dort nicht stehen...
Weil du sie nicht angibst!
Also, erstmal ist "wertvoll" eine Methode ohne Nebeneffekte, sie bestimmt einfach nur, wie wertvoll oder nicht ein Element ist.
Und zum Sinn: Ob ein Element wertvoll ist oder nicht, kann sich nach jedem Durchlauf der Schleife ändern.
So so.
-
Sorry, schreibe gerade mit dem Smartphone... (etwas umständlich). Ich melde mich morgen wieder.
-
Und bzgl. zu wenigen Angaben... Es gibt das https://de.m.wikipedia.org/wiki/Principle_of_Least_Surprise (oder so ähnlich), wonach man, wenn etwas nicht eindeutig ist, die naheliegendste Annahme treffen sollte...
Zum Beispiel: Wenn die Straße nass ist, dann hat es wahrscheinlich geregnet. Unwahrscheinlich ist es hingegen, dass ein Lkw, der Flüssigkeiten geladen hatte umgekippt ist...
Also, ihr versteht schon, was ich meine.
-
Guten Morgen. Noch einmal etwas genauer (hoffe ich):
Definiere Liste1 und Liste2 ... (Liste1 enthält "alle" Elemente, Liste2 ist "zu Beginn" leer) Wiederhole alle 30 Minuten sequenziell: Für jedes A in Liste1: Wenn wertvoll(A) und A nicht in Liste2: Füge A in Liste2 ein Wenn A in Liste2: Tue etwas mit A Die Gewichtigkeit (ob ein Element wertvoll ist) wird für alle Elemente in Liste1 aktualisiert ... Es kann also sein, dass Elemente nun nicht mehr wertvoll sind, oder umgekehrt.
Wenn ihr sagt, es kann nicht weiter vereinfacht werden, auch gut...
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Und bzgl. zu wenigen Angaben... Es gibt das https://de.m.wikipedia.org/wiki/Principle_of_Least_Surprise (oder so ähnlich), wonach man, wenn etwas nicht eindeutig ist, die naheliegendste Annahme treffen sollte...
Wenn keine weiteren Informationen vorliegen ist die richtige Vorgehensweise nicht, die "naheliegendste" Annahme zu treffen, sondern gar keine und die allgemeinste Lösung zu finden. D.h. @SeppJ hats hier besser gemacht, da seine Lösung mehr mögliche Listen (eben auch die mit mehrfachen Elementen) äquivalent zum ursprünglichen Code bearbeitet.
Guten Morgen. Noch einmal etwas genauer (hoffe ich):
Ich denke die Lösung von @SeppJ ist hier ganz gut. Einfach das Ergebnis der (potentiell teueren) Abfrage in einer Variable zwischenspeichern, so dass man sie nur einmal machen muss. Man muss dann "etwas mit
A
tun", wenn es vorher in der Liste war oder wenn man es eingefügt hat.Ansonsten würde ich persönlich immer noch 2 Schleifen bevorzugen. Eine "Update"-Schleife über
Liste1
, welcheListe2
aktualisiert und anschliessend eine Schleife überListe2
die "etwas mit den Elementen tut". Da spart man sich nämlich auch die zweite Prüfung, obA
inListe2
ist, da man ja über eben diese Liste iteriert und die Bedingung folglich für alle Elemente gilt.
-
Danke @Finnegan !
Also, zwei Schleifen und nicht in-situ vorgehen/bearbeiten.
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Danke @Finnegan !
Also, zwei Schleifen und nicht in-situ vorgehen/bearbeiten.
Überleg auch, ob du
Liste2
tatsächlich brauchst. Wenn du z.B. nur etwas mit Elementen machen willst, die aktuell wertvoll sind - und nicht auch mit denen, die in der Vergangenheit wertvoll waren - dann kann man es sich vielleicht sparen die zweite Liste überhaupt zu konstruieren. Nicht dass du da noch ein insert/delete-Overengineering machst, wenn am Ende lediglich sowas hier reichen würde:Für jedes A in Liste1: Wenn wertvoll(A): Tue etwas mit A
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Sobald aber ein Element wertvoll ist oder schonmal wertvoll war, soll es in der Liste 2 sein und es soll etwas damit getan werden
Hab ich zwar am Handy getippelt, aber ist deshalb nicht weniger richtig
-
@Fragender Dann müsstest du die Elemente aber auch aus Liste1 wieder entfernen, oder?
Definiere Liste1 und Liste2 ... (Liste1 enthält "alle" Elemente, Liste2 ist "zu Beginn" leer) Wiederhole alle 30 Minuten sequenziell: Für jedes A in Liste1: Wenn wertvoll(A): Entferne A aus Liste1 Füge A in Liste2 ein Für jedes A in Liste2: Tue etwas mit A Die Gewichtigkeit (ob ein Element wertvoll ist) wird für alle Elemente in Liste1 aktualisiert ... Es kann also sein, dass Elemente nun nicht mehr wertvoll sind, oder umgekehrt.
Da ein Element für immer in Liste 2 bleibt, bringt es ja nichts jedes mal aufs neue wertvoll zu überprüfen. (Edit 2: Außerdem musst du auch weniger Gewichte dann anpassen)
Edit: Sehe grade, das hat Finnegan auch schon weiter oben geschrieben
-
Diese Frage hat einen Bezug zu: https://www.c-plusplus.net/forum/topic/354198/multi-charts-wie-mit-0-werten-umgehen/2
Einmal wertvoll gewesene Elemente sollen für immer in der Liste 2 bleiben ... in Liste 2 sollen aber keine Elemente doppelt vorkommen.
-
@Fragender sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Diese Frage hat einen Bezug zu: https://www.c-plusplus.net/forum/topic/354198/multi-charts-wie-mit-0-werten-umgehen/2
Einmal wertvoll gewesene Elemente sollen für immer in der Liste 2 bleiben ... in Liste 2 sollen aber keine Elemente doppelt vorkommen.
Ja, dann passt doch, was ich bzw. Finnegan vor mir geschrieben hat. Wenn du die Elemente schrittweise von Liste1 in Liste2 überträgst, hast du beide Sachen erfüllt. Vorausgesetzt Liste1 enthält keine Duplikate ... das war jetzt mal meine annahme
-
@Leon0402 sagte in Pseudocode: if-then-else (Logikfrage) - Vereinfachung:
Vorausgesetzt Liste1 enthält keine Duplikate ... das war jetzt mal meine annahme
Das trifft zu.
OK, Thema