SortedList

SortedListsortedcontainers 库中的一个数据结构,它提供了一个有序列表,能够自动对存储的元素进行排序,并且支持高效的插入、删除和查找操作。下面从多个方面详细解释 SortedList

安装

在使用 SortedList 之前,需要先安装 sortedcontainers 库,可以使用以下命令进行安装:

bash 复制代码
pip install sortedcontainers

基本使用示例

python 复制代码
from sortedcontainers import SortedList

# 创建一个空的 SortedList
sorted_list = SortedList()

# 向 SortedList 中添加元素
sorted_list.add(3)
sorted_list.add(1)
sorted_list.add(2)

print(sorted_list)  # 输出: SortedList([1, 2, 3])

从上述示例可以看出,即使元素是无序添加的,SortedList 会自动将它们排序。

主要特性

1. 自动排序

每次向 SortedList 中添加或删除元素时,它都会自动维护元素的有序性。无论何时访问列表中的元素,它们始终是按升序排列的。

python 复制代码
from sortedcontainers import SortedList

sl = SortedList([5, 2, 8])
print(sl)  # 输出: SortedList([2, 5, 8])

sl.add(3)
print(sl)  # 输出: SortedList([2, 3, 5, 8])
2. 高效的插入和删除操作

SortedList 内部使用了一种平衡树(通常是 B 树)来存储元素,这使得插入和删除操作的时间复杂度为 O(logn)O(log n)O(logn),其中 nnn 是列表中元素的数量。

python 复制代码
from sortedcontainers import SortedList

sl = SortedList([1, 2, 3, 4, 5])
sl.remove(3)
print(sl)  # 输出: SortedList([1, 2, 4, 5])
3. 支持索引访问

可以像普通列表一样通过索引来访问 SortedList 中的元素,索引从 0 开始。

python 复制代码
from sortedcontainers import SortedList

sl = SortedList([10, 20, 30, 40, 50])
print(sl[2])  # 输出: 30
4. 支持切片操作

SortedList 也支持切片操作,返回一个新的 SortedList 对象。

python 复制代码
from sortedcontainers import SortedList

sl = SortedList([1, 2, 3, 4, 5])
sliced = sl[1:3]
print(sliced)  # 输出: SortedList([2, 3])
5. 支持查找操作

可以使用 bisect_leftbisect_right 方法来查找元素的插入位置,时间复杂度为 O(logn)O(log n)O(logn)。

python 复制代码
from sortedcontainers import SortedList

sl = SortedList([1, 3, 5, 7, 9])
index = sl.bisect_left(4)
print(index)  # 输出: 2

常用方法

1. add(value)

SortedList 中添加一个元素,并自动对列表进行排序。

2. remove(value)

SortedList 中移除指定的元素,如果元素不存在会抛出 ValueError 异常。

3. pop(index=-1)

移除并返回指定索引位置的元素,默认移除最后一个元素。

4. clear()

清空 SortedList 中的所有元素。

5. bisect_left(value)bisect_right(value)

分别返回元素 valueSortedList 中应该插入的最左和最右位置。

应用场景

  • 需要频繁插入、删除元素并保持有序性的场景 :例如,在实现优先队列、事件调度器等场景中,SortedList 可以高效地维护元素的顺序。
  • 查找元素的插入位置 :可以利用 bisect_leftbisect_right 方法快速找到元素应该插入的位置,而无需手动遍历列表。

总之,SortedList 是一个功能强大且高效的数据结构,适用于需要自动排序和高效操作的场景。

相关推荐
乱写代码4 小时前
Pydantic学习--BaseModel
python
fu15935745684 小时前
【边缘计算实战】P1:从零搭建边云任务卸载仿真实验台(Python 可复现)
数据库·python·边缘计算
蜡台5 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
智能体与具身智能6 小时前
TVA 本质内涵与核心特征(系列)
人工智能·python·智能体视觉
云雾J视界6 小时前
SST:高频变压器设计实战:铁氧体 vs 纳米晶 vs 非晶,磁性材料怎么选
python·acdc·dab·sst
第一程序员6 小时前
Rust trait 入门:把 AI 客户端抽象成可替换接口
python·rust·github
Ulyanov6 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
小小的木头人7 小时前
Python 批量解析 Excel 经纬度,调用高德地图 API 获取中文地址
开发语言·python·excel
金銀銅鐵7 小时前
[Python] 为 Vole 机器语言实现图形化界面
python·程序员
小林ixn8 小时前
Python基础全梳理:从注释到函数,这些细节你都掌握了吗?
python·编程语言