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

C# 如何有效地比较列表并获得最频繁的对?,c#,.net,algorithm,list,C#,.net,Algorithm,List,我有很多列表,我想比较它们,得到最上面的一对。如果列表中同时存在两个不同的数字,则它们是成对的 列表1=>1 4 5 6 0 7 列表2=>2 3 8 6 1 9 列表3=>4 7 1 3 5 6 配对 1,6-3次(列表1、列表2、列表3)顶对 1,5-2次(列表1、列表3) 4,5-2次(列表1、列表3) 2,3-1次(仅列表2) 如何有效地做到这一点? 注意:列表中没有相同的数字。列表中的所有数字都是不同的。您将列表作为集合使用。为了更好地匹配使用情况,首先对所有列表进行排序并删除重复项(

我有很多列表,我想比较它们,得到最上面的一对。如果列表中同时存在两个不同的数字,则它们是成对的

列表1=>1 4 5 6 0 7

列表2=>2 3 8 6 1 9

列表3=>4 7 1 3 5 6

配对

1,6-3次(列表1、列表2、列表3)顶对

1,5-2次(列表1、列表3)

4,5-2次(列表1、列表3)

2,3-1次(仅列表2)

如何有效地做到这一点?


注意:列表中没有相同的数字。列表中的所有数字都是不同的。

您将列表作为集合使用。为了更好地匹配使用情况,首先对所有列表进行排序并删除重复项(或者使用一个集合数据结构,如果可用)

从每个集合生成所有对,以对为键,以整数为值计算哈希表中的出现次数。生成可以通过简单的嵌套循环完成。按哈希表中的值对键进行排序

一个可能的解决方案

对每个列表进行排序,并将其转换为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

创建一个值和计数的列表(为了方便起见,我已经包含了对的文本表示)

e、 g

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

嗯,


Alan.

你厌倦了什么?&在这种情况下,“配对”是什么意思?你想用什么编程语言?如何定义“配对”?也就是说,列表1中的“1,5”对不是出现了两次,因为5出现了两次吗?列表中可以包含任意数字,或者可能的数字范围有限吗?我认为“配对”意味着2个值(通常是这样),我认为它们必须是不同的(但这是一个好问题),例如@soulcheck;1和6同时存在于每个列表中。我的意思是1,6是一对,这对存在3次。我更新了问题。每个列表中没有相同的值。您可以假定此列表已设置。
 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();