【问题标题】: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 次。

标签: c# .net algorithm list


【解决方案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 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(); 

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

第,

艾伦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多