Python 用于插入、删除和搜索的高效数据结构
在使用某些资源时,我需要跟踪打开和关闭状态。我使用的第一个结构是两个Python 用于插入、删除和搜索的高效数据结构,python,python-2.7,performance,data-structures,Python,Python 2.7,Performance,Data Structures,在使用某些资源时,我需要跟踪打开和关闭状态。我使用的第一个结构是两个open_states_list和closed_states_list,当状态更新时,我会将其添加和删除 插入是O(1)如果我们忽略内部内存分配和再分配机制,我想:open\u states\u list.append(x) 删除是O(n):打开状态列表。删除(x) 搜索,就像删除一样,是O(n):x在开放状态列表中 获取列表显然是O(1) 我使用的第二个结构是一个布尔值为open_states={}的字典,如果open_s
open_states_list
和closed_states_list
,当状态更新时,我会将其添加和删除
- 插入是O(1)如果我们忽略内部内存分配和再分配机制,我想:
李>open\u states\u list.append(x)
- 删除是O(n):
打开状态列表。删除(x)
- 搜索,就像删除一样,是O(n):
x在开放状态列表中
- 获取列表显然是O(1)
open_states={}
的字典,如果open_states[x]
为True
则x
打开,如果False
则关闭
- “插入”是O(1),因为我们只是设置一个键和一个值:
open\u states[x]=True
- “Deleting”是O(1),原因相同:
open\u states[x]=False
- “搜索”也是O(1),只是访问键的值:
open\u states[x]
- 获取列表是O(n):
[x代表x,s在开放状态。iteritems()如果s]
x
是否打开(搜索),因此第二个选项更好。但是我们的第二个最常见的操作,获取打开或使用状态的列表,紧跟着搜索操作,在第一个选项中效率更高。但是我们不能选择第一个选项,因为检查资源的状态是O(n)
插入也很常见。移除并不是那么重要
满足这些需求的最有效的数据结构是什么?为什么不使用
集合
?如果值仅为真/假
,则不需要使用dict
,只要项目的存在/不存在就可以指示其状态。@CoryKramer我忘了提到顺序很重要。OrderedSet
是否也很有效?设置状态操作比列表更有效吗?@dabadaba python设置散列它们的内容(这就是为什么不能将不可散列的项添加到集合中),因此成员资格测试应该只是散列函数和表查找O(1)的成本。不知道OrderedSet。@dabadaba检查一下。应该是您所需要的。@JaredSmith我正在测试:d={x:1代表范围(1000000)}
和o=OrderedSet(d)
。然后一个元素e=45462
<代码>%timeit e in d平均每个循环33.9纳秒,而%timeit e in o
平均每个循环190纳秒。