我有很多列表,我想比较它们并得到顶对。如果列表中存在两个不同的数字,则它们是成对的。
列表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)
如何有效地执行此操作?
注意:列表中没有相同的号码。所有数字在列表中都是不同的。
答案 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,
艾伦。