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

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(); 

这将为您提供列表中出现次数最多的所有对的列表。

第,

艾伦。

【讨论】:

以上是关于如何有效地比较列表并获得最频繁的对?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sqlalchemy 有效地管理频繁的模式更改?

spark有效地找到一组列的最频繁值

如何获得R中分类变量的最频繁级别

如何更有效地将嵌套列表扁平化为一个列表而不是使用 unlist 方法?

如何通过查询获得主组内最频繁值(MODE)的计数/频率?

如何最有效地向服务器发送连续的帧流