如何比较列表并有效地获得最频繁的对?

时间:2011-12-02 12:13:00

标签: c# .net algorithm list

我有很多列表,我想比较它们并得到顶对。如果列表中存在两个不同的数字,则它们是成对的。

列表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次(list1,list3)

2,3 - 1次(仅限list2)

如何有效地执行此操作?

注意:列表中没有相同的号码。所有数字在列表中都是不同的。

2 个答案:

答案 0 :(得分:0)

您将列表用作集合。为了更好地匹配使用情况,首先对所有列表进行排序并删除重复项(或使用设置数据结构,如果可用)。

生成每个集合中的所有对,计算哈希表中的出现次数,其中对为键,整数为值。生成可以通过简单的嵌套循环完成。按哈希表中的值对键进行排序。

答案 1 :(得分:0)

可能的解决方案。

对每个列表进行排序并转换为10位二进制数

e.g

列出一个

  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

创建值和计数的列表(为了方便,我已经包含了对的文本表示)

e.g。

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,

艾伦。