【问题标题】:Trying to find majority element in a list试图在列表中找到多数元素
【发布时间】:2013-12-01 00:37:44
【问题描述】:

我正在编写一个函数来查找 Python 列表中的多数。

想如果我可以编写一个散列函数,可以将每个元素映射到新数组中的单个槽或唯一标识符,也许对于字典,那应该是最好的,它应该是可撤销的。我不知道如何进步。我的哈希函数显然没用,关于我可以/应该做什么的任何提示,或者这是否是一种合理的方法?

def find_majority(k):
    def hash_it(q):
        return q

    map_of = [0]*len(k)

    for i in k:
        mapped_to = hash_it(i) #hash function
        map_of[mapped_to]+=1


find_majority([1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5])

【问题讨论】:

  • 您可能希望在 Python 中使用字典而不是手动哈希函数——该语言非常不鼓励您做这种事情。
  • 您要查找最常见的元素还是主要元素(出现 N/2 次以上)?

标签: python arrays hash hashcode


【解决方案1】:

Python 有一个名为 Counter 的内置类可以为您完成此操作。

>>> from collections import Counter
>>> c = Counter([1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5])
>>> c.most_common()
[(3, 5), (2, 4), (4, 4), (1, 3), (5, 3), (6, 2)]
>>> value, count = c.most_common()[0]
>>> print value
3

查看文档。

http://docs.python.org/2/library/collections.html#collections.Counter

【讨论】:

  • 使用c.most_common(1)[0] -- max() vs. sort()
  • 除非您仍然需要自己检查领带。
【解决方案2】:

有一个简单的方法来实现这样的

l = [1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5]
print(max(set(l), key = l.count)) # 3

【讨论】:

  • 这真的很简洁!请注意,这需要 O(len(set(l)) * len(l)) 时间,因为它正在调用 l.count(O(len(l)) 操作)len(set(l)) 时间,而我们可以在 O(len(l)) 时间内完成此操作如果我们事先创建一个计数器。
【解决方案3】:

我认为您的方法是使用另一个像 k 一样大的数组作为您的“哈希图”。如果k 很大,但唯一元素的数量不是很大,那么您将浪费大量空间。此外,要找到大多数,您必须遍历您的 map_of hashmap/array 以找到最大值。

另一方面,字典/集合(散列不是您关心的问题,底层数组结构对于一般情况可能更紧凑)似乎更合适一些。不用说,将出现的元素作为键,将它们的出现作为值,您可以在一次迭代中找到所需的内容。

所以,类似:

def find_majority(k):
    myMap = {}
    maximum = ( '', 0 ) # (occurring element, occurrences)
    for n in k:
        if n in myMap: myMap[n] += 1
        else: myMap[n] = 1

        # Keep track of maximum on the go
        if myMap[n] > maximum[1]: maximum = (n,myMap[n])

    return maximum

正如预期的那样,我们得到了我们想要的。

>>> find_majority([1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5])
(3, 5)

当然,Counters 和其他很酷的模块可以让你以更精细的语法做你想做的事。

【讨论】:

  • 是的!我实际上只是以非常相似的方式用字典解决了它=)!
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多