繁体   English   中英

Python:一种用于存储项目以检查项目是否存在于容器中的优雅方法

[英]Python: Elegant way to store items for checking item existence in a container

在遇到的情况下,我想定义“优雅”,其具有1)常数O(1)时间复杂度,用于检查一项是否存在,以及2)仅存储项仅此而已。

例如,如果我使用列表

num_list = []
for num in range(10): # Dummy operation to fill the container.
    num_list += num
if 1 in num_list:
    print("Number exists!")

根据[ 链接 ],“输入”操作将花费O(n)时间。

为了达到恒定的检查时间,我可以使用字典

num_dict = {}
for num in range(10): # Dummy operation to fill the container.
    num_dict[num] = True
if 1 in num_dict:
    print("Number exists!")

在字典的情况下,“输入”操作根据[ 链接 ]花费O(1)时间 ,但是需要额外的O(n)存储来存储伪值。 因此,这两种实现/容器似乎都不美观。

什么是更好的实现/容器,以便在仅存储项目时获得恒定的O(1)时间来检查项目是否存在? 如何将资源需求保持在最低限度?

这里的解决方案是使用set ,它不需要您为每个值保存一个虚拟变量。

通常,您无法同时优化空间和时间。 您可以做的一件事是获取有关数据范围(此处为num的最小值至最大值)和数据大小(此处为循环运行的次数,即10)的更多详细信息。 然后,您将有两个选择:

  1. 如果范围有限,则使用字典方法(甚至使用数组索引方法)
  2. 如果大小有限,则使用列表方法。

如果选择正确的方法,则可能会为大型样品获得恒定的时间和空间

编辑: 设置这是一个哈希表,通过一些优化使Python dict实现得非常相似,这些优化利用了值始终为null的事实(在一个设置中,我们只关心键)。 设置操作确实需要对至少一个操作数表进行迭代(在联合情况下均为两者)。 迭代并不比其他任何集合便宜(O(n)),但是成员资格测试的平均水平为O(1)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM