给定点对数组,对它们进行排序,使终点与下一个起点匹配

时间:2019-03-02 11:14:35

标签: algorithm recursion dynamic-programming greedy

给出一对点对的数组,例如

[19, 11], [11,44] ,[ 98,101], [44,98], [12,32],[44,12],[44,98],[98,101],[33,39]

排列数组,使终点等于下一个起点。如果不相等,则成本=1。我们必须将成本降到最低。例如,我们可以将以上内容安排为

[19,11],[11,44],[44,12],[12,32],[44,98],[98,101],[44,98],[98,101],[33,39]

因此,这里的费用为[12,32],[44,98] = 1 + [98,101],[44,98] = 1 + [98,101],[33,39] = 1因此总计= 3。

我尝试了一些解决方案,该解决方案首先匹配精确对,然后尝试匹配非精确对,但是我觉得我的贪婪方法不是最优的,可以使用动态编程来找到最优的解决方案。

否则我感觉是要计算所有可能的序列,但是复杂度很高!!

有人可以帮助我提出一个动态编程解决方案吗

2 个答案:

答案 0 :(得分:1)

我认为这实际上是著名的Travelling Salesman问题的一个实例。这意味着您的解决方案不是最优的,并且在多项式时间内也没有最优的解决方案。尽管动态编程does seem to稍微降低了时间复杂度,但仍然是NP-Hard。

要了解原因,我们需要使用图论来重新表述此问题。在这里,每个点都是一个节点。每个节点(即点)通过具有成本1的定向加权边彼此连接。除非源节点的结束值与邻居节点的起点匹配,否则边的权重为0。现在创建一个虚拟起点,该起点具有一个直接边缘连接到每个节点,以及到每个节点

现在,如果您从起始节点运行TSP,则将以最小的成本获得所需的序列。

答案 1 :(得分:0)

如果我们要形成一个有向图,那么问题似乎就是图分区问题:找到适当的边去除方法,以使每个顶点最多具有一个输入边和一个输出边,同时最小化生成的图形组件数。

[19,11], [11,44], [98,101], [44,98], [12,32],
[44,12], [44,98], [98,101], [33,39]


    33,39   
                   44,98
                ⇗   ⇙  ⇘
              ⇗  98,101 98,101
             ↑      ⇖  ⇗
19,11 -> 11,44 --> 44,98
            ↓
            44,12 -> 12,32

结果将比组件数少一。

也许进行回溯搜索?