array,deque与bisect详解

bisect

bisect 模块提供了对有序列表进行二分查找的支持。它主要用于在有序列表中插入元素并保持列表的有序性。bisect 模块提供了两个主要函数:bisect_leftbisect_right,它们分别返回插入位置的左侧和右侧索引。

import bisect

# 示例列表
data = [1, 3, 4, 4, 6, 8]

# 使用 bisect_left 查找插入位置
index = bisect.bisect_left(data, 4)  # 返回 2
data.insert(index, 4)

# 使用 bisect_right 查找插入位置
index = bisect.bisect_right(data, 4)  # 返回 4
data.insert(index, 4)

print(data)  # 输出: [1, 3, 4, 4, 4, 4, 6, 8]

bisect 模块适用于需要频繁插入元素并保持列表有序的场景,如维护一个有序的日志列表或事件列表。

array

array 模块提供了一个数组类型,它比列表更高效地存储同类型的数据。它与列表最大的区别是,array 数组中的元素类型必须在创建时指定,且所有元素必须为同一类型。

import array

# 创建一个整型数组
arr = array.array([1, 2, 3, 4, 5])

# 添加元素
arr.append(6)# 输出: array('i', [1, 2, 3, 4, 5, 6])

# 访问元素
print(arr[-1])  # 输出: 6

# 删除元素
arr.pop()

print(arr)  # 输出: array('i', [1, 2, 3, 4, 5])

array 适用于需要高效存储大量同类型数据的场景,如数值计算或数据处理。

deque

dequecollections 模块中的一个双端队列实现,支持在队列的两端高效地进行添加和删除操作。deque 可以在任意一端进行 O(1) 时间复杂度的插入和删除操作。

from collections import deque

# 创建一个双端队列
d = deque([1, 2, 3])

# 在右侧添加元素
d.append(4)

# 在左侧添加元素
d.appendleft(0)

# 从右侧删除元素
d.pop()

# 从左侧删除元素
d.popleft()

print(d)  # 输出: deque([1, 2, 3])

deque 适用于需要频繁在队列两端进行操作的场景,如实现一个高效的队列或栈,或者在需要快速插入和删除元素的场景中使用。

ArrayDeque是Java中的一个双端队列实现类。它实现了Deque接口,可以将其作为双端队列使用。ArrayDeque还实现了Cloneable接口,可以通过调用clone()方法进行克隆操作。此外,ArrayDeque还实现了java.io.Serializable接口,支持序列化,可以通过序列化进行传输。需要注意的是,ArrayDeque是非同步的,不适用于多线程环境。\[2\] ArrayDeque提供了一系列方法来操作队列,其中包括addLast(E e)方法,用于在队列的末尾添加元素。该方法会将元素e放置在tail位置,并根据需要进行容量扩展。如果添加元素后tail+1等于head,表示内存不足,会调用doubleCapacity()方法将ArrayDeque的容量扩展为原来的两倍。\[3\] 需要注意的是,ArrayDeque的clone()方法会创建一个新的ArrayDeque对象,并将原始队列的元素复制到新的队列中。这是通过调用父类Object的clone()方法实现的,然后使用Arrays.copyOf()方法对元素数组进行深度复制。\[1\] 参考资料: \[1\] ArrayDeque源码 \[2\] ArrayDeque的特性 \[3\] ArrayDeque的addLast()方法实现 #### 引用[.reference_title] - *1* *2* *3* [集合框架之ArrayDeque详解](https://blog.youkuaiyun.com/lucklycoder/article/details/115381856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值