先按 x1 排序,然后按 x2 排序的时间复杂度?
Time complexity of sort by x1, then x2?
标准排序函数文献会告诉您排序通常可以(合并、快速)在 N log N
中完成。
例如,如果我有这个列表:[1,6,3,3,4,2]
NlogN次排序为:[1,2,3,3,4,6]
如果我有一个按第一个 属性 然后第二个排序的列表怎么办?
像这样:[(1,1),(6,3),(3,4),(3,1),(2,8)]
到这样:[(1,1),(2,8),(3,1),(3,4),(6,3)]
它的时间复杂度是多少?
我想出的是,如果所有第一个索引都相同,那么您只是再次执行 N log N
,所以相同。如果有一堆不同的第一个索引,你正在重新排序一堆小集合。
合并排序(或快速排序)执行 O(N log N)
比较。它的时间复杂度是O(N log N * time_to_compare_two_elements)
。比较一对元素的时间复杂度是常数(如果比较两个元素的时间是常数)。因此,对数组进行排序的时间复杂度也是 O(N log N)
。
首先,您将比较每对的第一个元素和 sort.Takes NlogN。如果第一个元素相同,现在将比较第二个元素。这需要 NlogN。总共 2Nlogn 就是 NlogN
希望对您有所帮助!!
如果您对您的数据一无所知,则无法保证比 O(N log(N))
更好:所有第一个元素可能相同,然后您将无法将第二个元素排序为正常。
这就是 O(N log(N))
界限的含义:如果您必须对数据进行通用比较排序,则无法对此进行改进。句号。
如果您 有更多信息,那么(正如您的直觉推理)您或许可以对此进行改进。例如,假设任何 x
作为一对中的第一个元素至少出现一次,大约有 log(N)
对以 x
作为它们的第一个元素。在这种情况下,你的第一遍可以更有效率:
d = {}
for x, y in L:
xL = d.setdefault(x, [])
xL.append(y)
xs_sorted = sorted(d.keys())
这是(大约)O(N)
,因为 d.keys()
有 N / log(N)
个元素。接下来,您可以对每个 N / log(N)
子列表进行排序,每个子列表的大小为 log(N)
:
L_sorted = []
for x in xs_sorted:
ys_sorted = sorted(d[x])
for y in ys_sorted:
L_sorted.append((x, y))
这是 O(N log(log(N)))
,它控制运行时 - 但比 O(N log(N))
好!
Nlog(N) 复杂度中有一个常数因子,它取决于计算机在决定顺序之前如何进行比较。例如,如果对字符进行排序,则 Nlog(N) 的复杂度将变为
Nlog(N) * length of maximum string size
标准排序函数文献会告诉您排序通常可以(合并、快速)在 N log N
中完成。
例如,如果我有这个列表:[1,6,3,3,4,2]
NlogN次排序为:[1,2,3,3,4,6]
如果我有一个按第一个 属性 然后第二个排序的列表怎么办?
像这样:[(1,1),(6,3),(3,4),(3,1),(2,8)]
到这样:[(1,1),(2,8),(3,1),(3,4),(6,3)]
它的时间复杂度是多少?
我想出的是,如果所有第一个索引都相同,那么您只是再次执行 N log N
,所以相同。如果有一堆不同的第一个索引,你正在重新排序一堆小集合。
合并排序(或快速排序)执行 O(N log N)
比较。它的时间复杂度是O(N log N * time_to_compare_two_elements)
。比较一对元素的时间复杂度是常数(如果比较两个元素的时间是常数)。因此,对数组进行排序的时间复杂度也是 O(N log N)
。
首先,您将比较每对的第一个元素和 sort.Takes NlogN。如果第一个元素相同,现在将比较第二个元素。这需要 NlogN。总共 2Nlogn 就是 NlogN
希望对您有所帮助!!
如果您对您的数据一无所知,则无法保证比 O(N log(N))
更好:所有第一个元素可能相同,然后您将无法将第二个元素排序为正常。
这就是 O(N log(N))
界限的含义:如果您必须对数据进行通用比较排序,则无法对此进行改进。句号。
如果您 有更多信息,那么(正如您的直觉推理)您或许可以对此进行改进。例如,假设任何 x
作为一对中的第一个元素至少出现一次,大约有 log(N)
对以 x
作为它们的第一个元素。在这种情况下,你的第一遍可以更有效率:
d = {}
for x, y in L:
xL = d.setdefault(x, [])
xL.append(y)
xs_sorted = sorted(d.keys())
这是(大约)O(N)
,因为 d.keys()
有 N / log(N)
个元素。接下来,您可以对每个 N / log(N)
子列表进行排序,每个子列表的大小为 log(N)
:
L_sorted = []
for x in xs_sorted:
ys_sorted = sorted(d[x])
for y in ys_sorted:
L_sorted.append((x, y))
这是 O(N log(log(N)))
,它控制运行时 - 但比 O(N log(N))
好!
Nlog(N) 复杂度中有一个常数因子,它取决于计算机在决定顺序之前如何进行比较。例如,如果对字符进行排序,则 Nlog(N) 的复杂度将变为
Nlog(N) * length of maximum string size