簡體   English   中英

在兩個數據集中找到最佳匹配

[英]Finding best match in two data sets

我在文件中有兩組數據:

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)

您正在描述的問題似乎是一個匹配問題 ,您試圖在其中找到A數據集和B數據集之間的最小成本匹配。

您可以按如下所示將此問題表示為最低費用匹配項。 對於A列表中的每個條目,計算將其與B數據集中的某些元素進行匹配的“成本”。 這形成了二部圖,其中所有A元素都在第一類中,所有B元素都在第二類中。 在這里,您可以使用任何最小費用匹配算法來找到A與B的最佳分配。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM