c# - 在两个数据集中寻找最佳匹配

标签 c# algorithm sorting

我在一个文件中有两组数据:

a a0 x:7 y:7 z:10
a a1 x:2 y:1 z:1
a a2 x:7 y:6 z:4

b b0 x:3 y:9 z:2 a2,a0,a1
b b1 x:4 y:3 z:7 a0,a2,a1
b b2 x:4 y:0 z:10 a0,a2,a1
b b3 x:10 y:3 z:8 a2,a0,a1
b b4 x:6 y:10 z:1 a0,a2,a1
b b5 x:6 y:7 z:7 a0,a2,a1
b b6 x:8 y:6 z:9 a2,a1,a0
b b7 x:7 y:1 z:5 a2,a1,a0
b b8 x:8 y:2 z:3 a1,a0,a2
b b9 x:10 y:2 z:1 a1,a2,a0
b b10 x:6 y:4 z:5 a0,a2,a1
b b11 x:8 y:4 z:7 a0,a1,a2

我必须在集合 B 中为集合 A 中的每一行找到最佳匹配行,而不重复其中的任何行 - 必须根据 x、y、z 值进行匹配。我必须考虑到集合 B 具有优先于值的“首选”行。

这就是我开始处理这个问题的方式:

public struct SetValues
        {
            public string x;
            public string y;
            public string z;
        }
        public static Dictionary<string, SetValues>[] ReadFile(string fileName)
        {
            Dictionary<string, SetValues>[] dictionary = new Dictionary<string, SetValues>[]{
                new Dictionary<string, SetValues>(),
                new Dictionary<string, SetValues>()
            };
            string[] fileLines = System.IO.File.ReadAllLines(fileName);
            string[] delimitersDict1 = new string[] { "a ", " ", " ", " " };
            string[] delimitersDict2 = new string[] { "b ", " ", " ", " " };

            foreach (string line in fileLines)
            {
                if (line != string.Empty)
                {
                    char[] str = line.ToCharArray();

                    if (str[0].ToString() == "a")
                    {
                        string[] tmp = line.Split(delimitersDict1, StringSplitOptions.None);
                        dictionary[0].Add(tmp[1], new SetValues { x = tmp[2], y = tmp[3], z = tmp[4] });
                    }
                    else if (str[0].ToString() == "b")
                    {
                        string[] tmp = line.Split(delimitersDict2, StringSplitOptions.None);
                        dictionary[1].Add(tmp[1], new SetValues { x = tmp[2], y = tmp[3], z = tmp[4] });
                    }
                }
            }
            return dictionary;
        }

这就是我目前所拥有的 - 2 个以行名作为键和值 (x,y,z) 的字典。

我的问题是:我应该在这里识别一些常见的算法吗? 解决这个问题最简单的方法是什么? 我从 C# 开始,所以我希望能提供一些易于理解的提示或引用资料 :)

我忘了补充一点,我的预期输出应该是这样的:

a2
    b6  a2:128 a1:31 a0:188
    b3  a2:120 a0:171 a1:31
    b10 a0:120 a2:86 a1:21
    b0  a2:83 a0:104 a1:17 
a1
    b9  a1:23 a2:86 a0:94
    b8  a1:21 a0:100 a2:80
    b7  a2:75 a1:20 a0:106
    b1  a0:119 a2:74 a1:18 
a0
    b5  a0:161 a2:112 a1:26
    b11 a0:154 a1:27 a2:108
    b2  a0:128 a2:68 a1:18
    b4  a0:122 a2:106 a1:23

我认为 a2:128 的值来自 (a2 x * b6 x) + (a2 y * b6 y) + (a2 z * b6 z)

最佳答案

您描述的问题似乎是 matching problem您要在其中尝试找到 A 数据集和 B 数据集之间的最低成本匹配。

您可以将此问题表述为最小成本匹配,如下所示。对于 A 列表中的每个条目,计算将其与 B 数据集中的某个元素匹配的“成本”。这形成了一个二分图,其中所有 A 元素都在第一类中,所有 B 元素都在第二类中。从那里,您可以使用任何您想要找到 A 到 B 的最佳分配的最小成本匹配算法。

希望这对您有所帮助!

关于c# - 在两个数据集中寻找最佳匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27794679/

相关文章:

c# - 尝试加载格式不正确的程序 (.dll)

javascript - 如何将 JSON 从 AngularJS 发布到 C# Controller

algorithm - maxheap 和在头部存储最大值的链表有什么区别?

java - 如何计算排序链表(数字)上的频率 Java

python - 排序列表时避免不必要的键评估

c# - .ASP.NET Core 仅在 Controller 上存在策略时运行策略处理程序

c# - Windows.UI.Xaml.UiElement.IsVisibleChanged 不存在

c++ - 在循环排序算法中,我正在寻找一种情况,在这种情况下我们观察到算法的不稳定特性

c# - 为 Web 请求实现限速算法的最佳方法是什么?

python - Pandas 数据框中的值未排序