Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于插入、删除和搜索的高效数据结构_Python_Python 2.7_Performance_Data Structures - Fatal编程技术网

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纳秒。