整理路口清单

时间:2019-06-12 15:09:58

标签: algorithm sorting

我有一个对象

total_spent_time

现在这些路口具有以下格式

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"]

但是,如果我有一个无序列表,该如何排序?什么是Java中执行此操作的最佳算法。快速排序将不起作用,因为枢轴和上下限的概念实际上并不适用。如果连接点都已链接,则无法计算出更高的值。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用哈希图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中当然可以轻松地做到这一点。)