2011-12-02 7 views
1

私は多くのリストを持っており、それらを比較してトップペアを取得したいと考えています。 2つの異なる数字がリストに一緒に存在する場合、それらはペアになります。リストを比較し、最も頻繁にペアを効率的に取得する方法は?

リスト1 => 1 4 5 6 0 7

リスト2 => 2 3 8 6 1 9

リスト3 => 4 7 1 3 5 6

ペア

1,6 - 3回(LIST1、LIST2、LIST3)トップペア

1,5 - 2回(LIST1、LIST3)

4,5 - 2回(リスト1、LIST3)

2,3 - 1回(のみLIST2)

どのように効率的にこれを行うには?

注:リストには同じ番号はありません。すべての数字はリスト内で区別されます。

+1

あなたは疲れました&&このコンテキストでは「ペア」は何を意味しますか? – soulcheck

+0

これはどんなプログラミング言語ですか? – ChrisBD

+0

C#でこれをしたいです。 – onurbaysan

答えて

0

あなたはリストをセットとして使用しています。使用法をよりよく一致させるには、まずすべてのリストをソートし、重複を削除します(または、使用可能な場合は、セットデータ構造を使用します)。

各セットからすべてのペアを生成し、ペアをキーとして、ハッシュテーブル内の出現を値としてカウントします。生成は簡単なネストループで行うことができます。ハッシュテーブルの値でキーをソートします。

+0

質問が更新されました。各リストには同じ値がありません。このリストをセットと見なすことができます。 – onurbaysan

0

可能な解決法。

ソート各リストと10ビットの2進数に変換

例えば

リスト1つの

9 8 7 6 5 4 3 2 1 0 
    N N Y Y Y Y N N Y Y = 243 

リストつ

9 8 7 6 5 4 3 2 1 0 
    Y Y N Y N N Y Y Y N = 846 

リスト三

9 8 7 6 5 4 3 2 1 0 
    N N Y Y Y Y Y N Y N = 250 

ペア

の事前生成可能なすべての値

0,1 = 3 
0,2 = 5 
... 
1,5 = 34 
... 
5,7 = 160 
... 
8,9 = 768 

すなわち値とカウントのリストを作成します(私は容易にするためにペアのテキスト表現を含めました)

public class Details { 
    public string Pair { get; set; } 
    public int Value { get; set; } 
    public int Count { get; set; } 
} 

// selection only 
public readonly static List<Details> PairDetails = new List<Details>() { 
    new Details{Pair = "0,1", Value = 3}, 
    new Details{Pair = "0,2", Value = 5}, 
    new Details{Pair = "1,5", Value = 34}, 
    new Details{Pair = "1,6", Value = 66}, 
    new Details{Pair = "2,3", Value = 12}, 
    new Details{Pair = "4,5", Value = 48} 
}; 

は、これはあなたのリストに倍の大半量を発生するすべてのペアのリストを与えるペアとリスト

foreach (var details in PairDetails) { 
    foreach (var value in values) { 
     if ((value & details.Value) == details.Value) { 
      details.Count++; 
     } 
    } 
} 

var most = PairDetails.Where(dtls => dtls.Count == PairDetails.Max(dt => dt.Count)).ToList(); 

を反復します。

hth、

アラン。

関連する問題