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 是一个功能强大且高效的数据结构,适用于需要自动排序和高效操作的场景。

相关推荐
A__tao10 分钟前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
研究点啥好呢14 分钟前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
迷藏49430 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
明日清晨1 小时前
python扫码登录dy
开发语言·python
bazhange1 小时前
python如何像matlab一样使用向量化替代for循环
开发语言·python·matlab
人工干智能1 小时前
科普:python中你写的模块找不到了——`ModuleNotFoundError`
服务器·python
unicrom_深圳市由你创科技2 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
小敬爱吃饭2 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
宸津-代码粉碎机2 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
知行合一。。。2 小时前
Python--04--数据容器(集合)
python