SortedList.add 在内部使用 insort 时,怎么会有 o(log(n)) 的时间复杂度?
How can SortedList.add have o(log(n)) time complexity when it uses insort internally?
sortedContainers中规定SortedList.add
的时间复杂度约为O(log(n)),但我们可以看到源码中使用了insort()
,即O(n ):
def add(self, value):
"""Add `value` to sorted list.
Runtime complexity: `O(log(n))` -- approximate.
>>> sl = SortedList()
>>> sl.add(3)
>>> sl.add(1)
>>> sl.add(2)
>>> sl
SortedList([1, 2, 3])
:param value: value to add to sorted list
"""
_lists = self._lists
_maxes = self._maxes
if _maxes:
pos = bisect_right(_maxes, value)
if pos == len(_maxes):
pos -= 1
_lists[pos].append(value)
_maxes[pos] = value
else:
insort(_lists[pos], value)
self._expand(pos)
else:
_lists.append([value])
_maxes.append(value)
self._len += 1
有人可以解释为什么尽管使用了 insort
,该方法仍然近似于 O(log(n)) 吗?
好的,从我在代码中看到的,SortedList 使用一组列表来存储排序后的列表。 add
先找到相关的子列表,然后用insort
插入其中,所以它与子列表的长度成线性关系,而不是整个列表。我怀疑 SortedList 试图保持每个子列表的长度受 log(whole list)
.
限制
sortedContainers中规定SortedList.add
的时间复杂度约为O(log(n)),但我们可以看到源码中使用了insort()
,即O(n ):
def add(self, value):
"""Add `value` to sorted list.
Runtime complexity: `O(log(n))` -- approximate.
>>> sl = SortedList()
>>> sl.add(3)
>>> sl.add(1)
>>> sl.add(2)
>>> sl
SortedList([1, 2, 3])
:param value: value to add to sorted list
"""
_lists = self._lists
_maxes = self._maxes
if _maxes:
pos = bisect_right(_maxes, value)
if pos == len(_maxes):
pos -= 1
_lists[pos].append(value)
_maxes[pos] = value
else:
insort(_lists[pos], value)
self._expand(pos)
else:
_lists.append([value])
_maxes.append(value)
self._len += 1
有人可以解释为什么尽管使用了 insort
,该方法仍然近似于 O(log(n)) 吗?
好的,从我在代码中看到的,SortedList 使用一组列表来存储排序后的列表。 add
先找到相关的子列表,然后用insort
插入其中,所以它与子列表的长度成线性关系,而不是整个列表。我怀疑 SortedList 试图保持每个子列表的长度受 log(whole list)
.