【发布时间】:2020-01-07 09:41:33
【问题描述】:
我正在研究一种 Python 算法来查找列表中出现频率最高的元素。
def GetFrequency(a, element):
return sum([1 for x in a if x == element])
def GetMajorityElement(a):
n = len(a)
if n == 1:
return a[0]
k = n // 2
elemlsub = GetMajorityElement(a[:k])
elemrsub = GetMajorityElement(a[k:])
if elemlsub == elemrsub:
return elemlsub
lcount = GetFrequency(a, elemlsub)
rcount = GetFrequency(a, elemrsub)
if lcount > k:
return elemlsub
elif rcount > k:
return elemrsub
else:
return None
我尝试了一些测试用例。有的通过了,有的没通过。
例如,[1,2,1,3,4] 这应该返回 1,但我得到 None。
实现遵循这里的伪代码: http://users.eecs.northwestern.edu/~dda902/336/hw4-sol.pdf 伪代码找到多数项并且需要至少一半。我只想找到大多数项目。
我能得到一些帮助吗? 谢谢!
【问题讨论】:
-
您是希望仅在计数大于一半时才返回结果,还是只返回频率最高的元素?
-
@chen 该算法用于查找项目列表中的多数(如果有的话),其中多数意味着出现超过 50% 的时间。所以它不是为了找到最常见的项目。在您的示例中,有五个项目 [1,2,1,3,4] 但没有项目出现超过 50%,在这种情况下是三倍,因此没有多数。
-
@chen 这不是你的问题所说的,也不是你实现的算法应该做的。不,这不能用分而治之的方法来解决,因为你总是需要每个值的确切计数才能最终决定哪个值最频繁。
-
@chen 您的最后一次编辑完全改变了问题 - 仍然不清楚:您所说的“多数元素”是“最常见的元素”,而“多数元素”的意思是“最常见的元素”一个出现超过 n/2 次(如果存在)。请不要这样做,因为这会使所有 cmets、答案和作者的努力毫无意义。