Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有二级排序标准的模糊排序间隔_Algorithm_Sorting_Language Agnostic_Intervals - Fatal编程技术网

Algorithm 具有二级排序标准的模糊排序间隔

Algorithm 具有二级排序标准的模糊排序间隔,algorithm,sorting,language-agnostic,intervals,Algorithm,Sorting,Language Agnostic,Intervals,我想根据两个标准对项目列表进行排序。每个项目都包含一个间隔和一个数字 Items[0] = {Interval=[10..30], Number = 7} Items[1] = {Interval=[20..40], Number = 5} Items[2] = {Interval=[30..50], Number = 3} Items[3] = {Interval=[40..60], Number = 2} 我想根据时间间隔对这个列表进行“模糊排序”:一个顺序,其中较早项的时间间隔下限不大于

我想根据两个标准对项目列表进行排序。每个项目都包含一个间隔和一个数字

Items[0] = {Interval=[10..30], Number = 7}
Items[1] = {Interval=[20..40], Number = 5}
Items[2] = {Interval=[30..50], Number = 3}
Items[3] = {Interval=[40..60], Number = 2}
我想根据时间间隔对这个列表进行“模糊排序”:一个顺序,其中较早项的时间间隔下限不大于较晚项的时间间隔上限

例如,
项[3]
不应在
项[0]
之前排序,因为
[40..60]
严格大于
[10..30]
。但是
项[1]
可能出现在
项[0]
之前或之后,因为它们的间隔重叠

因此,有效的排序可以通过按下界、上界、中点或每个区间内的任意数字进行排序来实现

从所有这些可能的排序中,我想选择一个按
Number
排序的排序作为第二个标准。对于所有可以交换的项,由于它们的间隔重叠,我希望交换它们,以便Item.Number递增

因此,以下是一个有效的顺序,按
Interval
升序排序,然后按
Number
升序排序:

Items[2] = {Interval=[30..50], Number = 3}
Items[1] = {Interval=[20..40], Number = 5}
Items[0] = {Interval=[10..30], Number = 7}
Items[3] = {Interval=[40..60], Number = 2}
有多种同样有效的解决方案。这也是使用相同标准的有效订单:

Items[0] = {Interval=[10..30], Number = 7}
Items[3] = {Interval=[40..60], Number = 2}
Items[2] = {Interval=[30..50], Number = 3}
Items[1] = {Interval=[20..40], Number = 5}
除了暴力之外,有没有一种有效的算法来寻找这样的排序


这种类型或排序有名称吗?

制作一个图,其中每个顶点都是一个区间

对于每对顶点:如果它们不重叠,则在它们之间添加一条从较早间隔到较晚间隔的定向边

通过在所有对上循环,可以避免O(n²)运行时间。如果我们按结束时间对间隔进行排序,按此顺序迭代间隔将允许我们快速找到与我们遇到的任何给定间隔重叠的所有间隔(我们可以在该列表中查找该间隔开始时间之前的最新结束时间)。然后我们需要找出如何避免创建任何不必要的边-对于[1,2],[3,4]和[5,6],在[1,2]和[5,6]之间会有一条不必要的边,因为它们是通过[3,4]连接的

边表示排序列表中哪些间隔需要在哪些间隔之前

在没有剩余顶点之前,拾取没有传入边的顶点。使其成为排序列表中的下一个元素,并删除此顶点的所有传出边

对于以上内容,如果我们将所有没有传入边的顶点放入按编号排序的集合中,我们可以在每个点选取最小值以强制执行二级排序标准

这将是O(n²),但可能会优化为O(n logn)


以你为例:

Items[0] = {Interval=[10..30], Number = 7}
Items[1] = {Interval=[20..40], Number = 5}
Items[2] = {Interval=[30..50], Number = 3}
Items[3] = {Interval=[40..60], Number = 2}
图中唯一的边是[10,30]→ [40,60]

这意味着我们可以拾取除[40,60]之外的任何顶点

我们首先选择[30,50],因为它在其余元素之间的数量最少(3<5和3<7)

然后我们选择[20,40],因为5<7

然后我们选择[10,30]并将边移除到[40,60],这将允许我们选择[40,60]

最后我们选择[40,60]