Gra*_*ntJ 58
您的大O要求有特殊原因吗?或者你只是希望它快?所述sortedcontainers模块是纯Python和快速(如在快速作为-C实现比如blist和rbtree).
在性能比较显示其基准测试速度更快或与blist的排序列表类型相提并论.另请注意,rbtree,RBTree和PyAVL提供了已排序的dict和set类型,但没有排序列表类型.
如果要求性能,请始终记住基准测试.在证明基准比较之前,应该怀疑用Big-O符号表示快速声明的模块.
免责声明:我是Python sortedcontainers模块的作者.
安装:
pip install sortedcontainers
Run Code Online (Sandbox Code Playgroud)
用法:
>>> from sortedcontainers import SortedList
>>> l = SortedList()
>>> l.update([0, 4, 1, 3, 2])
>>> l.index(3)
3
>>> l.add(5)
>>> l[-1]
5
Run Code Online (Sandbox Code Playgroud)
Mar*_*wis 50
标准Python列表未以任何形式排序.标准heapq模块可用于将O(log n)附加到现有列表中并删除O(log n)中的最小值,但不是定义中的排序列表.
Python的平衡树有各种实现,可满足您的要求,例如rbtree,RBTree或pyavl.
ジョー*_*ョージ 32
虽然我还没有检查过基本Python列表操作的"大O"速度,但bisect
标准模块在这方面可能也值得一提:
import bisect
L = [0, 100]
bisect.insort(L, 50)
bisect.insort(L, 20)
bisect.insort(L, 21)
print L
## [0, 20, 21, 50, 100]
i = bisect.bisect(L, 20)
print L[i-1], L[i]
## 20, 21
Run Code Online (Sandbox Code Playgroud)
PS.啊,对不起,bisect
在引用的问题中提到了.不过,我认为如果这些信息会在这里不会有太大的危害)
PPS.而CPython的名单实际上是数组(不是,比方说,skiplists或等).嗯,我想他们必须是简单的东西,但就我而言,这个名字有点误导.
所以,如果我没有弄错的话,bisect/list的速度可能是:
UPD.在评论中讨论之后,让我在这里链接这些SO问题:如何实现Python的列表以及python列表函数的运行时复杂性是什么
import bisect
class sortedlist(list):
'''just a list but with an insort (insert into sorted position)'''
def insort(self, x):
bisect.insort(self, x)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
75115 次 |
最近记录: |