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

时间:2013-12-20 00:48:08

标签: python hashtable binary-search-tree

我正在尝试编写一个程序,用于确定特定车牌是否是我存储的10,000个车牌之一。我想首先编写一个快速响应算法,将内存使用作为次要目标。平衡的二叉搜索树或哈希表是否足以存储10,000个车牌号码(也包含字母)?

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

听起来你真的想要一个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

构建一个包含10,000个随机板块(每个3个大写字母和3个数字)的集合,然后检查一百万个随机板块以查看它们是否在该集合中。这是输出:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
5.88199996948

所以在这个盒子上花了不到6秒的时间来检查一百万个盘子 - 而到目前为止大部分时间都是通过生成百万个随机盘来消耗的。改为:

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

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

答案 2 :(得分:1)

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

请参阅上一个stackoverflow问题here

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

示例代码:

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)

答案 3 :(得分:-1)

def plates(plateNum, hashTable):
  """
  input: plateNum is <type 'str'>, hashTable is <type 'dic'>
 output: Bool
  """
  if plateNum in hashTable:
    return True
  else:
    return False

这样的一些代码将完全符合您的要求。