2016-05-03 7 views
0

私はリストのリストを持っています。 L1 = [[...] [.....] [.....] .....] リストを平坦化してからすべての要素を取り出し、そこから一意の値を抽出すると、リストL2が得られます。 私はL2のいくつかのサブセットである別のリストL3を持っています。アルゴリズム - 対の相互発生をカウントするため

私は、L1のL3の要素のペアごとの相互出現を見出したいと思います。関係は無向である。すなわち、bが、

EG-L1 = Bと同じである[ABCD] [abdgf] [CDG] [DG] ....] L2 = [abcdgf] はL3 = [CDG]を言います

L1でL3のペアの賢明な相互出現を見つけたいと思います。すなわちこれらの値。 C、D:2 D、G:3 C、G:1

Iは、O(N×n個×m個* pを)取得しています。どこにでもあります。 L1、m - 平均のリストの数。いいえ。 L1の各リスト内の要素の数。 n - no。 L3の要素の

複雑性は改善できますか?上記Pythonで用

コードである:ここ

はsig_tags L3とタグがL1です。

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

L3に10文字入っている場合は、10文字のうちすべてのペアを印刷する必要がありますか? 45ペア? –

+0

はい、すべて45ペアあります。 –

+0

私はあなたが複雑さを改善できるとは思わない。 O(n²)のn *(n-1)/ 2のペアがありますので、少なくともL1のすべての要素を読み込んで、O(n²m)というものを持っている必要があります。たぶんあなたがアルゴリズムを共有していれば、私たちは見て改善を提案するかもしれません。 –

答えて

1

はいできます。

各要素にidを与え、リストL1をビットベクトルのリストに変換します。リストが対応する文字を保持する場合は、ビットが真となります。これはO(m * p)、またはO(M * p * log | Alphabet |)です。

ペアがリストに属しているかどうかを確認するには、cerainの2ビットがO(1)であるかどうかを確認する必要があります。だから、すべての小切手はO(n^2 * p)になります。

全体的に複雑さはO(n^2 * p + m * p)です。

ハッシュ関数を使用する場合は、譲渡IDを省略することができます。ハッシュ関数の計算が高価な場合があることに注意してください。

+0

私はこのアプローチが空間的には高価になると思います。ちょうどアイデアを与えるために、L1のリストの数は膨大で、In lakhs(毎週増加し続けています)。その中の各リストのサイズはL1よりも非常に小さいです。L3のエントリ数は約1000です。 –

+0

いくつのアイテムがありますか、またはL2の大きさはどれくらいですか? – Sorin

+0

L1からリストを取り出し、それをビットのベクトル(bool)に変換し、L3のすべての組み合わせをチェックするように、注文をフィルタリングすることができます。複雑さは同じですが、O(アルファベット)の余分なメモリを保存するだけです。 – Sorin

関連する問題