根据数据连续性排序

时间:2018-10-12 03:38:20

标签: algorithm sorting time-complexity

假设像下面的伪代码一样有一类数据。

class Data
    decimal Addition
    decimal Result
end

并且有一个数组或数据列表。例如:

[0] --> { Addition = 0.0, Result = 60.0 }
[1] --> { Addition = -10.0, Result = 50.0 }
[2] --> { Addition = 5.0, Result = 65.0 }
[3] --> { Addition = 30.0, Result = 80.0 }
[4] --> { Addition = -20.0, Result = 60.0 }

第i个成员的结果应等于第(i-1)个成员的结果+第i个成员的加法。在上面的示例中,顺序应为0、1、3、4、2,如下所示:

[0] --> { Addition = 0.0, Result = 60.0 }
[1] --> { Addition = -10.0, Result = 50.0 }
[3] --> { Addition = 30.0, Result = 80.0 }
[4] --> { Addition = -20.0, Result = 60.0 }
[2] --> { Addition = 5.0, Result = 65.0 }

如果有2个或更多具有相同结果的成员,则将对最早的数组成员进行优先级排序。 O(N lg N)如何对该类型的数据进行排序?

2 个答案:

答案 0 :(得分:2)

数据本质上是一个图形。将每个成员从重写为:

[0] --> { Addition = 0.0, Result = 60.0 }   --> { From =  0.0, To = 60.0 }
[1] --> { Addition = -10.0, Result = 50.0 } --> { From = 60.0, To = 50.0 }
[2] --> { Addition = 5.0, Result = 65.0 }   --> { From = 60.0, To = 65.0 }
[3] --> { Addition = 30.0, Result = 80.0 }  --> { From = 50.0, To = 80.0 }
[4] --> { Addition = -20.0, Result = 60.0 } --> { From = 80.0, To = 60.0 }

使用值标记图节点,每个成员都是一条边。

现在开始阅读图遍历算法和欧拉路径。

答案 1 :(得分:2)

假定,该序列必须由值Addition = 0.0的数据开始。我们可以发现,通过使用

为每个数据找到先前的值
PreviousValue = Addition-Result

例如

[0] --> { Addition = 0.0, Result = 60.0, PreviousValue = 60.0 }
[1] --> { Addition = -10.0, Result = 50.0, PreviousValue = 60.0 }
[2] --> { Addition = 5.0, Result = 65.0, PreviousValue = 60.0 }
[3] --> { Addition = 30.0, Result = 80.0, PreviousValue = 50.0 }
[4] --> { Addition = -20.0, Result = 60.0, PreviousValue = 80.0 }

然后我们可以O(n lg n)按照其上一个值对该列表进行排序

[3] --> { Addition = 30.0, Result = 80.0, PreviousValue = 50.0 }
[0] --> { Addition = 0.0, Result = 60.0, PreviousValue = 60.0 }
[1] --> { Addition = -10.0, Result = 50.0, PreviousValue = 60.0 }
[2] --> { Addition = 5.0, Result = 65.0, PreviousValue = 60.0 }
[4] --> { Addition = -20.0, Result = 60.0, PreviousValue = 80.0 }

此后,从初始节点(值为Addition = 0.0的数据)开始,我们可以在排序列表上使用O(lg n)二分查找来查找下一个序列的数据,其结果等于当前的PreviousValue。因此,这个问题可以用O(n + 2 n lg n)复杂度来解决