2016-05-03 14 views
0

Ich habe eine Liste von Listen. L1 = [[...] [...] [.....] .....] Wenn ich alle Elemente nach dem Reduzieren der Liste und Extrahieren von eindeutigen Werten nehme, dann erhalte ich eine Liste L2 . Ich habe eine andere Liste L3, die eine Teilmenge von L2 ist.algorithm- zum Zählen von paarweisen gegenseitigen Vorkommen

Ich mag das paarweise gegenseitige Vorkommen der Elemente der L3 in L1 zu finden. Die Beziehung ist nicht gerichtet. dh a, b ist gleich wie b, a

EG- L1 = [[abcd] [abdgf] [cdg] [dg] ....] L2 = [abcdgf] sagen L3 = [cdg]

Ich möchte paarweise gemeinsame Vorkommen von L3 in L1 finden. d.h. diese Werte. c, d: 2 d, g: 3 c, g: 1

Ich erhalte O (n * n * m * p); wo- Nr. von Listen in L1, m - avg. Nein. von Elementen in jeder Liste von L1. n - nein. von Elementen in L3.

Kann ich eine verbesserte Komplexität erhalten?

-Code für oben in Python ist:

Hier sig_tags ist L3 und Tags L1 ist.

x=[] 
    for i in range(len(sig_tags)): 
     for j in range(i+1,len(sig_tags)): 
      count=0 
      for k in tags: 
       if (sig_tags[i] in k) and (sig_tags[j] in k): 
        count+=1 
      if count>param:   
       x.append([sig_tags[i],sig_tags[j],count]) 
    return x 
+0

Wenn also der L3 10 Buchstaben enthält, sollte er alle Paare aus den 10 Buchstaben ausdrucken? 45 Paare? –

+0

ja, sollte es alle 45 Paare haben. –

+0

Ich glaube nicht, dass Sie dann die Komplexität verbessern können. Es wird n * (n-1)/2 Paare geben, was O (n²) ist und du musst mindestens alle Elemente in L1 lesen, so dass es O (n2m) ist, was du hast. Vielleicht könnten Sie, wenn Sie Ihren Algorithmus teilen, einen Blick darauf werfen und Verbesserungen anbieten. –

Antwort

1

Ja, Sie können.

jedes Element Geben Sie ein ID, wandeln dann die Liste L1 in eine Liste von Bit-Vektoren, in denen ein Bit wahr ist, wenn die Liste die entsprechenden Buchstaben constains. Dies ist O (m * p) oder O (M * p * log | Alphabet |), je nachdem, wie Sie es implementieren. wenn cerain 2 Bits

nun zu prüfen, ob ein Paar müssen Sie eine Liste gehört zu überprüfen, wahr sind, die O (1) ist. Also werden alle Überprüfungen O (n^2 * p) sein.

Insgesamt ist die Komplexität O (n^2 * p + m * p).

Sie können die Zuweisung von IDs überspringen, wenn Sie eine Hash-Funktion verwenden. Seien Sie vorsichtig, manchmal ist die Berechnung der Hash-Funktion teuer.

+0

Ich denke, dass dieser Ansatz im Weltraum teuer werden würde. Nur um eine Idee zu geben - die Anzahl der Listen in L1 ist riesig, ihre In-Lakhs (wächst jede Woche.). Und die Größe jeder Liste darin ist sehr, sehr viel kleiner als L1 irgendwo um 10. Anzahl der Einträge in L3 ist um 1000. –

+0

Wie viele verschiedene Gegenstände hast du, oder wie groß ist L2? – Sorin

+0

Sie können die Reihenfolge filtern, so dass Sie eine Liste von L1 nehmen, diese in einen Vektor von Bits (Boole) umwandeln und dann alle Kombinationen von L3 überprüfen. Die Komplexität bleibt gleich, aber Sie müssen nur O (Alphabet) zusätzlichen Speicher speichern. – Sorin

Verwandte Themen