【问题标题】:sorting a list of road junctions对道路交叉点列表进行排序
【发布时间】:2019-06-12 23:45:37
【问题描述】:

我有一个对象

class Junction {
   private String name;
   private String previous;
   private String next;
}

现在这些联结具有以下格式

Junction[name="T1H", previous="T0F", next="T345"]
Junction[name="K109", previous="TRH", next="JHD"]
Junction[name="LM89", previous="T1H", next="D679"]
Junction[name="TRH", previous="LM89", next="T345"]

上面的顺序如下:

T1H->LM89->TRH->K109

但是如果我有一个无序列表,我该如何排序呢?什么是java中最好的算法来做到这一点。快速排序不起作用,因为枢轴和更高和更低的概念并不真正适用。您无法计算出某些东西是否更高,因为连接点都是链接的。

冒泡排序似乎是合乎逻辑的。

有什么想法吗?

【问题讨论】:

  • 这是一个拓扑排序问题。
  • 交汇点总是会产生这样的“链”,还是有两个交汇点具有相同的“上一个”或“下一个”?相反,“前一个”必须是直接前任,还是只是列表中较早的某个位置?
  • 它始终是一个链条。它永远不会形成一个环。

标签: algorithm sorting


【解决方案1】:

您可以使用哈希映射来存储每个路口的后继者,使用这些路口previous 属性。使用Nonenull 或任何其他特殊值,如果“前一个”连接不在列表中。这假设所有结点都是直接后继结点或其他结点,并且没有两个结点具有相同的“先前”结点。对于 n 个结点,复杂度将为 O(n)。

from collections import namedtuple
Junction = namedtuple("Junction", "name previous next")
junctions = [
    Junction(name="T1H", previous="T0F", next="T345"),
    Junction(name="K109", previous="TRH", next="JHD"),
    Junction(name="LM89", previous="T1H", next="D679"),
    Junction(name="TRH", previous="LM89", next="T345")
]

d = {j.name: j for j in junctions}  # map names to junctions
succ = {j: None for j in junctions} # map previous to successor
for j in junctions:
    p = d.get(j.previous, None)
    succ[p] = j

然后,从None 的后继结点开始,迭代所有结点:

j = succ[None]
while j:
    print(j)
    j = succ[j]

输出:

Junction(name='T1H', previous='T0F', next='T345')
Junction(name='LM89', previous='T1H', next='D679')
Junction(name='TRH', previous='LM89', next='T345')
Junction(name='K109', previous='TRH', next='JHD')

(这里使用 Python,因为您没有专门要求 Java 解决方案,但当然可以在 Java 中轻松完成。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2019-08-17
    相关资源
    最近更新 更多