Angenommen, ich habe eine Liste von Teilmengen von { 1 , . . . , n } . Bei Bedarf kann ich diese Liste vorverarbeiten. Nach dieser Vorverarbeitung wird mir eine weitere Menge A ⊆ { 1 , . . . , n } . Ich möchte alle Mengen B ∈ X mit B ⊆ A identifizieren .
Der offensichtliche Algorithmus (ohne Vorverarbeitung) benötigt Zeit - Sie testen A einfach gegen jedes B ∈ X separat. Gibt es etwas Besseres als das?
Wenn es hilft, können Sie davon ausgehen, dass für jedes die Gesamtzahl der Übereinstimmungen B ∈ X durch etwas wie O ( 1 ) begrenzt ist .
quelle
Vielleicht können Sie eine "Information Retrieval" -Technik verwenden: Erstellen Sie in der Vorverarbeitungsphase einen invertierten Index (in Ihrem Fall reicht ein einfaches zweidimensionales Array aus), der ein Element abbildet zu den Mengen in , die es enthalten: .n×|X| xi∈{1,...,n} X inv(xi)={Xj∈X|xi∈Xj}
Set eines Integer - Array up der Länge.occ |X|
Dann für jede abrufen , und für jede doyi∈A inv(yi) Xj∈inv(yi) occ[j]=occ[j]+1
Am Ende benötigen Sie die Mengen, für die .|Xj|=occ[j]
Sie können den Prozess beliebig beschleunigen (auf Kosten des exponentiellen Raums), indem Sie zwei oder mehr Elemente zusammen indizieren.
quelle