为什么在O(1)时间内无法获取字典值?

时间:2015-10-23 04:31:37

标签: python-3.x dictionary hashmap

我们可以编写一个数据结构,通过取O(1)时间内的值直接搜索吗?

例如,在python3中的这段代码中,我们可以通过获取键并输出值来获取莫尔斯码。

    morse={'A':'.-','B':'-...','C':'-.-.','D':'-..','E':'.',\
           'F':'..-.','G':'--.','H':'....','I':'..','J':'.---',\
           'K':'-.-','L':'.-..','M':'--','N':'_.','O':'---',\
           'P':'.--.','Q':'--.-','R':'.-.','S':'...','T':'-',\
           'U':'..-','V':'...-','W':'.--','X':'-..-','Y':'-.--',\
           'Z':'--..','1':'.---','2':'..---','3':'...--','4':'....-',\
           '5':'.....','6':'-....','7':'--...','8':'---..','9':'----.',\
           '0':'----'}
    n=input()
    n=''.join(i.upper() for i in n if i!=' ')
    for i in n:
        print(morse[i],end=' ')

这给出了输出:

    >>> 
    S O S
    ... --- ... 

如果我们想通过将莫尔斯代码作为输入并将字符串作为输出进行搜索:

    >>> 
    ... --- ... 
    S O S

如果不另外制作摩尔斯电码的字典,我们该如何做呢?

请提供正确的推理以及有何限制。

4 个答案:

答案 0 :(得分:1)

Python词典是幕后的哈希映射。对密钥进行哈希处理以实现O(1)查找。由于某些原因没有对值进行同样的操作,其中一个原因是@CrakC提到的原因:dict不必具有唯一值。维持自动反向查找最多也是不一致的。另一个原因可能是,出于可预测性原因,基本数据结构最好保持最小的操作集。

因此正确&如果要在O(1)中进行反向查找,常见模式是维护一个单独的dict,键值对被反转。如果你不能这样做,你将不得不解决更多的时间复杂性。

答案 1 :(得分:0)

由于CrakC已正确声明无法在O(1)时间内从字典中获取密钥,因此您需要在O(n)时间内遍历字典一次,以便在字典中搜索密钥。由于您不想创建另一个字典,这将是您唯一的选择。

答案 2 :(得分:0)

  

我们可以编写一个数据结构,通过取O(1)时间内的值直接搜索吗?

这个问题的答案是肯定的,而且是HasMap or HashTable

按照你的例子,实际发生的是Python Dictionaries are implemented作为HashMap。从那以后,搜索复杂度是O(1)但是,据我所知,你真正的问题是如何通过O(1)中的值搜索键。好吧,将字典实现为哈希映射,如果Python提供(我不是100%确定它没有)反向搜索功能它不会是O(1)因为HashMaps不是为了提供它而设计的。 可以看一下HashMaps是如何工作的:你需要一个散列函数,它将键和值映射到数组中的相同索引,如果不是不可能的话,很难做到。

我猜你最好的选择是定义de inverse字典。牺牲记忆来实现更好的时代并不罕见。

答案 3 :(得分:0)

是的,在python中无法从字典key中获取value的名称。原因很明显。字典中的keys本质上是唯一的,即,字典中不能有两个条目用于相同的密钥。但反过来并不总是正确的。唯一keys可能具有非唯一values。这里应该注意,keys的不可变性实际上定义了字典的结构。由于它们本质上是唯一的,因此可以将它们编入索引,因此在O(1)时间内获取给定value的{​​{1}}。如上所述,反转不能在O(1)时间内实现,并且总是取平均时间O(n)。你应该知道的最重要的一点是python词典不应该以这种方式使用。

进一步阅读: http://stupidpythonideas.blogspot.in/2014/07/reverse-dictionary-lookup-and-more-on.html