假设像下面的伪代码一样有一类数据。
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)如何对该类型的数据进行排序?
答案 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)复杂度来解决