Ok, nicht sicher, ob das der beste Titel war, aber ich habe zwei Python-Listen. L1 und L2, die beide Elemente vom Typ T haben und nicht die gleiche Länge haben.Für zwei Listen, l1 und l2, wie man das für alle e1 ∈ l1, ∃p (e1, e2), wo e2 ist ein Element in l2, effizient in Python?
I eine Funktion p (T, T), das ein Prädikat eine Eigenschaft über zwei Elemente vom Typ T. Überprüfung
Ich mag würde, dass für alle Elemente e in L1 überprüfen, p (e, e ') hält, wo e' ist ein Element in L2. also gehe ich grundsätzlich für jedes Element in L1 über die zweite Liste und prüfe, ob das Prädikat für eines der Elemente gilt. Aber ich möchte das gleiche für die andere Liste überprüfen.
p (T, T) symmetrisch ist. Also wenn p (e, e ') dann p (e', e). Ich möchte das wegen dieser Symmetrie nicht zweimal machen. Ich muss irgendwie aufzeichnen, wenn ich p (e, e ') sehe, dann weiß ich p (e', e) und muss nicht noch einmal nach der zweiten Liste suchen.
Was ist der beste Weg, dies in Python zu tun? Ich dachte darüber nach, ein weiteres Feld für jedes Element e1 in jeder Liste zu haben, und teilte uns mit, ob p (e1, e2) gilt, wobei e2 ein Mitglied der anderen Liste ist. Aber ich denke, das erfordert das Kopieren beider Listen, damit ich sie nicht mutiere. Gibt es einen guten Weg, dies zu tun?
Wenn Sie bereit sind, etwas precomputation zu tun, wie Sie vorschlagen, können Sie immer tun, um die Check-in O (1) Zeit für jedes Element von L1. Erstelle einfach zwei weitere Listen LL1 und LL2, so dass LL1 [i] == 1 genau dann, wenn für das i-te Element e1 von LL1 e1 in L2 existiert, so dass p (e1, e2). Sie können die Antwort auf die Gesamtfrage aufzeichnen (für alle e1 in L1 existiert ...) auch – Alejandro
Ok, ich habe meine Frage mit diesem Code bearbeitet. Ich bin mir nicht sicher, ob das genau das ist, was du meintest, aber wenn es das ist, dann macht es für mich sehr viel Sinn. – Lana
@Alejandro: Das spart wirklich keine Arbeit; Die Vorberechnung ist "O (n ** 2)", und es ist nicht sehr wiederverwendbar. – user2357112