Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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_Hashtable_Binary Search Tree - Fatal编程技术网

Python 用于存储车牌和搜索给定车牌是否存在的最佳数据结构

Python 用于存储车牌和搜索给定车牌是否存在的最佳数据结构,python,hashtable,binary-search-tree,Python,Hashtable,Binary Search Tree,我正在尝试编写一个程序,确定某个特定的车牌是否是我存储的10000个车牌中的一个。我想首先写一个快速响应算法,其次是内存使用。平衡二元搜索树或哈希表是否更足以存储10000个车牌号(也包含字母)?哈希表需要O(1)时间来查找任何给定条目(即检查它是否在数据结构中),而二元搜索树需要O(logn)时间。因此,就响应速度而言,哈希表将是更有效的选择 二进制搜索树在需要按顺序显示内容或查找多个类似条目的情况下更有用。听起来您真的需要Python集(基于哈希表)。以下是一个示例: from random

我正在尝试编写一个程序,确定某个特定的车牌是否是我存储的10000个车牌中的一个。我想首先写一个快速响应算法,其次是内存使用。平衡二元搜索树或哈希表是否更足以存储10000个车牌号(也包含字母)?

哈希表需要O(1)时间来查找任何给定条目(即检查它是否在数据结构中),而二元搜索树需要O(logn)时间。因此,就响应速度而言,哈希表将是更有效的选择


二进制搜索树在需要按顺序显示内容或查找多个类似条目的情况下更有用。

听起来您真的需要Python集(基于哈希表)。以下是一个示例:

from random import choice
from string import ascii_uppercase as LETTERS
from string import digits as DIGITS
print LETTERS
print DIGITS

def get_plate():
    return choice(LETTERS) + \
           choice(LETTERS) + \
           choice(LETTERS) + \
           choice(DIGITS) + \
           choice(DIGITS) + \
           choice(DIGITS)

licenses = set()
while len(licenses) < 10000:
    licenses.add(get_plate())

from time import time
t1 = time()
for _ in xrange(1000000):
    get_plate() in licenses
t2 = time()
print t2 - t1
因此,在这个框中,检查一百万个盘子只花了不到6秒的时间——到目前为止,大部分时间都被生成一百万个随机盘子所消耗。改为:

a_plate = get_plate()
t1 = time()
for _ in xrange(1000000):
    a_plate in licenses
...

而且速度快了35倍。这应该足够快,即使在中等繁忙的道路上也能处理交通;-)

python字典就是你想要的。字典查找是O(1)。python字典实际上是一个哈希表,因此有一些内存开销,但查找速度很快

请参阅前面的stackoverflow问题

您甚至可以非常轻松地存储有关车牌的数据元数据。 您的密钥可以是您想要的任何形式的车牌、整数、字符串甚至元组

示例代码:

license_plates = {'AB-12-23' :{'make':'Dodge','color':'White'},
                  'SWINGER'  :{'make':'Alpha','color':'Blue'},
                  ('ABC',123):{'make':'Ford','color':'Yellow'},
                  123456     :{'make':'Ferrari','color':'Red'}}

print '%s in list of license plates? %s' % ('SWINGER', 'SWINGER' in license_plates)

如果你考虑的是速度,Python是最好的语言吗?事后看来,可能不是。我可以研究另一种语言10000个车牌对于普通计算机来说不算什么,Python可以很好地处理它。@Legostrmtropr:Python的哈希表实现可能比您自己用另一种语言编写的任何东西都要快,比大多数流行的C哈希表库都要快,因此,如果这是他代码中速度较慢的部分,那么Python很可能是最好的语言。@Legostrmtroppr:您缺少了哈希表(以及二叉树)的全部要点。您不需要处理10000个车牌,您需要散列1个车牌并查看它是否存在(或处理日志(10000)~13个车牌)。Python的循环开销是C的50倍这一事实与此无关,因为即使在Python中,循环也只需要微秒,每秒只需运行1(或13)次。此外,哈希表的典型实现往往更节省内存。此外,Python内置了一个优秀的哈希表,而二进制树,您必须从各种不同的第三方实现中进行选择,这些第三方实现多年来都没有Python的内置实现那么多测试和优化工作。也就是说,即使是一个缓慢的、专为教学而非性能而设计的纯Python二叉树也应该足够快,并且内存效率足够高,在几乎任何你能想象到的用例中,甚至在速度最慢的现代计算机上,处理对10000个图版的查找。所以,很可能整个问题都无关紧要。
license_plates = {'AB-12-23' :{'make':'Dodge','color':'White'},
                  'SWINGER'  :{'make':'Alpha','color':'Blue'},
                  ('ABC',123):{'make':'Ford','color':'Yellow'},
                  123456     :{'make':'Ferrari','color':'Red'}}

print '%s in list of license plates? %s' % ('SWINGER', 'SWINGER' in license_plates)