Python setzt die Schnittpunktfrage

7

Ich habe drei Sets:

%Vor%

Ich möchte eine Funktion, die True zurückgibt, wenn jeder Satz in der Liste sich mit mindestens einem anderen Satz in der Liste überschneidet. Gibt es dafür ein eingebautes oder einfaches Listenverständnis?

    
Eric Schoonover 01.10.2010, 08:05
quelle

8 Antworten

2

Es ist ein wenig ausführlich, aber ich denke, es ist eine ziemlich effiziente Lösung. Es nutzt die Tatsache, dass, wenn zwei Sätze sich schneiden, wir sie beide als verbunden markieren können. Dies geschieht, indem eine Liste von Flags so lange wie die Liste der Sets beibehalten wird. Wenn i gesetzt und j sich überschneiden gesetzt wird, wird das Flag für beide gesetzt. Anschließend wird die Liste der Sätze übersprungen und nur eine Schnittmenge für Mengen gesucht, die noch nicht geschnitten wurden. Nachdem ich die Kommentare gelesen habe, denke ich, dass @Victor davon sprach.

%Vor%

Ich entschied, dass eine leere Liste von Mengen verbunden ist (Wenn Sie ein Element der Liste erzeugen, kann ich ein Element erzeugen, das es schneidet;). Eine Liste mit nur einem Element wird trivial getrennt. In beiden Fällen ist eine Zeile zu ändern, wenn Sie nicht zustimmen.

    
aaronasterling 01.10.2010, 08:27
quelle
13
%Vor%     
jchl 01.10.2010 08:32
quelle
5

Hier ist eine sehr einfache Lösung, die für große Eingaben sehr effizient ist:

%Vor%     
jchl 01.10.2010 12:50
quelle
2

Hier ist eine effizientere (wenn auch viel kompliziertere) Lösung, die eine lineare Anzahl von Schnittpunkten und eine Anzahl von Vereinigungen der Ordnung O (n * log (n)) ausführt, wobei n die Länge von s : %Vor%

Beachten Sie, dass diese Lösung nur mit Python & gt; = 2.6 funktioniert.

    
jchl 01.10.2010 11:23
quelle
1

Wie immer möchte ich die unvermeidliche itertools Lösung geben; -)

%Vor%

Das ist wirklich faul und macht nur die notwendigen Überschneidungen. Es kann auch ein sehr verwirrender und unleserlicher oneliner sein ;-)

    
Jochen Ritzel 01.10.2010 13:18
quelle
1

Um Ihre Frage zu beantworten, nein, es gibt kein integriertes oder einfaches Listenverständnis, das das tut, was Sie wollen. Hier ist eine weitere itertools basierte Lösung, die sehr effizient ist - überraschend etwa doppelt so schnell wie @ THC4k itertools antwortet mit groupby() in Timing-Tests mit Ihrer Beispieleingabe. Es könnte wahrscheinlich ein bisschen weiter optimiert werden, ist aber wie dargestellt sehr gut lesbar. Wie @AaronMcSmooth habe ich willkürlich entschieden, was zurückgegeben werden soll, wenn keine oder nur ein Satz in der Eingabeliste vorhanden ist.

%Vor%     
martineau 01.10.2010 14:22
quelle
0

Diese Strategie ist wahrscheinlich nicht so effizient wie @ Victors Vorschlag, könnte aber effizienter sein als jchls Antwort aufgrund der verstärkten Verwendung der Mengenarithmetik ( union ).

%Vor%     
intuited 01.10.2010 09:30
quelle
0

Dies kann je nach Verteilung der Sets zu einer besseren Leistung führen.

%Vor%     
dheerosaur 01.10.2010 10:44
quelle

Tags und Links