如何有效地比较列表并获得最频繁的对?
Posted
技术标签:
【中文标题】如何有效地比较列表并获得最频繁的对?【英文标题】:How to compare lists and get most frequent pairs efficiently? 【发布时间】:2011-12-02 12:12:59 【问题描述】:我有很多列表,我想比较它们并获得最佳配对。如果两个不同的数字一起存在于一个列表中,它们是成对的。
列表 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)
如何有效地做到这一点?
注意:列表中没有相同的数字。列表中的所有数字都是不同的。
【问题讨论】:
你累了什么&&在这种情况下“配对”是什么意思? 你想要这个用什么编程语言? 如何定义“对”? IE。对“1,5”不是在列表 1 中出现两次吗,因为 5 出现了两次?列表可以包含任意数字还是可能的数字范围有限? 我认为“对”意味着 2 个值(通常是这样),我认为它们必须是不同的(但这是一个好问题) @soulcheck 例如; 1 和 6 一起存在于每个列表中。我的意思是 1,6 是一对,这对存在 3 次。 【参考方案1】:您将列表用作集合。为了更好地匹配使用,首先对所有列表进行排序并删除重复项(或使用集合数据结构,如果可用)。
从每个集合中生成所有对,计算哈希表中出现的次数,其中对作为键,整数作为值。生成可以通过一个简单的嵌套循环来完成。按哈希表中的值对键进行排序。
【讨论】:
我更新了问题。每个列表中没有任何相同的值。您可以假设此列表已设置。【参考方案2】:一个可能的解决方案。
对每个列表进行排序并转换为10位二进制数
例如
列出一个
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 DetailsPair = "0,1", Value = 3,
new DetailsPair = "0,2", Value = 5,
new DetailsPair = "1,5", Value = 34,
new DetailsPair = "1,6", Value = 66,
new DetailsPair = "2,3", Value = 12,
new DetailsPair = "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();
这将为您提供列表中出现次数最多的所有对的列表。
第,
艾伦。
【讨论】:
以上是关于如何有效地比较列表并获得最频繁的对?的主要内容,如果未能解决你的问题,请参考以下文章