【问题标题】:How to find the max value in a hash table that is manually implemented?如何在手动实现的哈希表中找到最大值?
【发布时间】:2018-10-31 15:54:39
【问题描述】:

您好,我是 Python 新手,我实现了一个哈希表,用于计算单词中字母出现的次数。

例如哈希表当前存储这个:

{l:1, r:1, t:1, u:1, a:1, c:1, d:2, e:1, }

我想在哈希表中找到最大值,即 2。我实现了一个迭代器,这样我就可以遍历哈希表。我设法找到这样的最大值:

编辑:我用设置项目实现了一个哈希表类,获取项目功能。

class HashTableQuadratic:

def __init__(self, size=10):
    self.count = 0
    self.table_size = size
    self.array = build_array(self.table_size)
    self.collision=0
    self.totalProbeLength=0

 //some code here


tempList=[]
for item in hashTable:
if item!=None:
    tempList.append(item[1])
maxNum=max(tempList)
print(maxNum)

但是有没有更好的方法可以在不使用 tempList 和 max 内置函数的情况下做到这一点?

【问题讨论】:

  • 你的意思是你重新实现了python的collections.Counter?
  • 向我们展示您类的__init__ 方法并不能真正告诉我们任何有用的信息。另一方面,向我们展示类的接口可能很有用。

标签: python max hashtable


【解决方案1】:

您的 hashTable 对象似乎是键值对的可迭代对象。

首先,不是你的四行代码:

tempList=[]
for item in hashTable:
if item!=None:
    tempList.append(item[1])

… 等价于单行推导:

tempList = [item[1] for item in hashTable if item is not None]

把它变成一个惰性迭代器是微不足道的,而不是在内存中建立一个列表:

it = (item[1] for item in hashTable if item is not None)

您可以直接在 max 调用中内联它:

maxNum = max(item[1] for item in hashTable if item is not None)

作为旁注,请注意我使用了item is not None 而不是item != None。您几乎从不想将None==!= 进行比较。经验法则是:

  • 如果您想要任何真实值,请使用if item
  • 如果您需要任何非None 值,请使用if item is not None
  • 如果您想要任何非None 值,同时特别允许其他类覆盖__eq__ 并与None 进行比较,请使用if item != None

但是,值得注意的是,如果您想构建一个自定义哈希表,您可能希望它像一个 dict — 或至少像一个 Mapping。实现Mapping 接口非常简单,这意味着您的对象可以鸭式作为字典。

而且,如果你这样做,你可以使用与 dict 相同的代码:

maxNum = max(hashTable.values())

【讨论】:

    【解决方案2】:

    假设你的类和collections.Counter一样,你可以简单地这样使用max

    max(hashTable.items(), key=lambda item: item[1])
    

    这将在您的示例中返回 ('d', 2)。如果您不想知道哪个键具有最大值,您可以简化它。

    我们将所有项目作为(key, value) 对传递,并使用maxkey 参数告诉它按值比较项目。

    【讨论】:

    • 首先,我认为 OP 的自定义类与Counter 不同,甚至不像字典,否则他现有的代码将无法工作。它似乎像键值对的可迭代而不是键的可迭代,所以我假设没有 items() 方法。但是,话又说回来,您不需要 items() 方法;你可以只使用hashTable 本身。
    • 第二,他似乎只想要伯爵,而不是那对。你可以做max(hashTable, key=lambda item: item(1))[1],但我认为只做max(item[1] for item in hashTable)更具可读性。
    • @abarnert 界面有些不同,但本质上功能与Counter 完全相同。甚至在他的问题的开头所陈述的目的是“计算一个单词中字母的出现次数”,而示例输出正是您从Counter('cddelrtua') 中得到的。我只是因为不习惯符合标准的python习语而不是预期的设计而把不同的界面放在一起。
    • 同意计数。我读了这么多,它的结尾是“太好了,我有数,我怎么知道它是哪个键?” 我经常跳到那个。当计数真的是它时,这是不正确的。
    猜你喜欢
    • 2011-08-27
    • 2018-04-07
    • 1970-01-01
    • 2012-04-09
    • 2017-06-20
    • 2012-10-11
    • 2018-03-14
    • 2014-03-07
    • 2011-04-03
    相关资源
    最近更新 更多