Zähle vorhandene Ereignisse und geordnete Abläufe getrennt.
Eine Menge merkt sich, ob ein Ereignis vorkommt, aber nicht wann. Ein sequenzieller Vertrag muss zusätzlich Reihenfolge, Zeitbezug und den Umgang mit Wiederholungen festlegen. In unserem Modell sind Listen bereits nach einer eindeutigen Ereignisreihenfolge sortiert. Ein Vorgang erfüllt öffnen → speichern, wenn mindestens ein speichern nach einem öffnen liegt. Bei Wiederholungen reicht also ein passendes Paar. Für denselben Datensatz ist die Menge geordneter Treffer eine Teilmenge der Vorgänge mit beiden Ereignisarten. Eine weitere notwendige Bedingung kann eine kumulative Schnittmenge nur gleich groß lassen oder verkleinern.
Ein Beispiel
Synthetische Folgen: sample-1=[öffnen,speichern], sample-2=[speichern,öffnen], sample-3=[öffnen]. Zwei Vorgänge enthalten beide Arten; nur sample-1 erfüllt die Reihenfolge. Mit sample-4=[speichern,öffnen,speichern] gibt es drei Mengen- und zwei Reihenfolgentreffer. Das erste speichern bei sample-4 liegt zu früh, das zweite bildet aber ein gültiges Paar.
Python 3.11 · Lehrbeispiel
def ordered(events, first, second):
seen_first = False
for event in events:
if event == second and seen_first:
return True
if event == first:
seen_first = True
return False
samples = [["öffnen", "speichern"], ["speichern", "öffnen"],
["öffnen"], ["speichern", "öffnen", "speichern"]]
print(sum({"öffnen", "speichern"} <= set(row) for row in samples))
print(sum(ordered(row, "öffnen", "speichern") for row in samples))
Erwartete Ausgabe
3
2