如何解决SortedList.add 如何在内部使用 insort 时具有 o(log(n)) 时间复杂度?
在 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)
为界的子列表的长度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。