python - 分而治之。查找数组中的大多数元素

标签 python algorithm

我正在研究一种 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,但我没有得到。

实现遵循这里的伪代码: http://users.eecs.northwestern.edu/~dda902/336/hw4-sol.pdf 伪代码找到多数项并且至少需要一半。我只想找到多数项目。

我能得到一些帮助吗? 谢谢!

最佳答案

我写了一个迭代版本而不是你正在使用的递归版本,以防你想要类似的东西。

def GetFrequency(array):
    majority = int(len(array)/2)
    result_dict = {}
    while array:
        array_item = array.pop()
        if result_dict.get(array_item):
            result_dict[array_item] += 1
        else:
            result_dict[array_item] = 1
        if result_dict[array_item] > majority:
            return array_item   
    return max(result_dict, key=result_dict.get)

这将遍历数组并在一个命中超过总数的 50%(即多数)时立即返回值。否则它会遍历整个数组并返回频率最高的值。

关于python - 分而治之。查找数组中的大多数元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789350/

相关文章:

python - 将太大而无法放入内存的 CSV 文件保存到 parquet 文件中

java - Python 相当于 Java 的 Class.getResource

python - 按元素将单行 append 到 Pandas 数据框中

python - 如何从 Bitmex Websocket API ws.recent_trades() 日志中提取单独且独特的实时交易

python - Pandas 时间戳不一致地循环 30 秒

algorithm - 这个特殊的 CNF 叫什么?

c++ - 在不止一个回文的情况下寻找最长但字典序最小的回文

c++ - 在C语言中使用遗传算法求一个数的平方根时如何实现选择和交叉

algorithm - 最平衡二分的排列

c++ - 读取 4 个点的坐标。他们做一个正方形吗?