我有很多清单,我想比较他们,并得到顶级对。如果两个不同的数字同时存在于一个列表中,它们是对的。
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)
如何有效地做到这一点?
注意:列表中没有相同的数字。所有的数字在一个列表中都是不同的。
发布于 2011-12-02 12:23:12
你用这些列表作为集合。为了更好地匹配使用,首先对所有列表进行排序并删除重复项(如果可用,则使用set数据结构)。
从每个集合生成所有对,计算哈希表中出现的次数,以对作为键,以整数作为值。生成可以通过简单的嵌套循环来完成。根据哈希表中的值对键进行排序。
发布于 2011-12-02 13:27:30
一种可能的解决办法。
对每个列表进行排序,并转换为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
预生成对的所有可能值。
i.e
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,
艾伦。
https://stackoverflow.com/questions/8356167
复制相似问题