【问题标题】:Find the biggest most frequent number of an array找到数组中最大的最频繁数
【发布时间】:2019-07-30 03:02:28
【问题描述】:

我得到了一个数字数组,并且应该返回最大最频繁的数字。

比如数组是[4, 1, 4, 3, 2],那么我需要返回4;如果数组是[3, 3, 3],那么我需要返回3。

我有一个可行的解决方案:

(Counter(arr).most_common(1)[0][0])

但我想在不使用任何库的情况下解决这个问题。

【问题讨论】:

  • 您能否指出您在不使用库的情况下尝试过的方法?
  • 最大和最常见是什么意思?哪个最重要?例如为 [6,4,4,4,2,2,1] 提供所需的输出。如果你只想要最大的,为什么不直接max
  • @ted for [6,4,4,4,2,2,1] 你会得到 4
  • 所以你的意思是它是最常见的,如果有几个有这个计数,它们中最大的?
  • (Counter(a).most_common(1)[0][0])(虽然不正确)一个传统的 Python 解决方案(没有库)。 Counter 是核心 Python 发行版的一部分。如果你想看看它是如何工作的,use the source, Luke.

标签: python algorithm


【解决方案1】:

1/ 构造一个计数字典:

a = [6,4,4,4,2,2,1]
d = {}
for i in a:
    d[i] = d.get(i, 0) + 1

2/ 找到最大的键:

largest = [key for m in [max(d.values())] for key, val in d.items() if val == m]

3/ 得到最大的:

result = max(largest)

4/ 库和/或标准模块会更好(更快、更健壮),但您要求使用纯 python

【讨论】:

  • 或者使用sorted(d.items(),key=lambda k:k[1],reverse=True)获取基于值的排序结果。
  • @HenryYik 我不会使用sorted,这会使O(n log(n)) 变得复杂,而您可以在O(n) 中相当合理地解决这个问题。只需使用max,即max(d, key=d.get)
  • 排序是 O(nlogn) 正确的,您可以在 O(n) 中一次获得最大键(max 在内部完成)
【解决方案2】:

我将使用defaultdict 创建频率图,然后通过提供key 作为输入数组get 方法来使用max

def most_frequent(array):
    frequencies = defaultdict(int)
    for value in array:
        frequencies[value] += 1
    return max(frequencies, key=frequencies.get)

【讨论】:

    【解决方案3】:

    如果您不想使用Counter,您可以使用标准字典来模拟它的功能,即使用dict.get 方法的默认值类似这样:

    from typing import List
    
    
    def get_most_common(nums: List[int]) -> int:
        counts = {}
        for num in nums:
            counts[num] = counts.get(num, 0) + 1
        most_frequent_num, most_frequent_count = None, 0
        for key, value in counts.items():
            if value > most_frequent_count:
                most_frequent_num, most_frequent_count = key, value
        return most_frequent_num
    
    
    if __name__ == '__main__':
        fin = open('in.txt', 'r')
        fout = open('out.txt', 'w')
        _, nums = fin.read().splitlines()
        nums = list(map(int, nums.split()))
        fout.write(str(get_most_common(nums)))
        fout.close()
    

    out.txt:

    4
    

    in.txt

    5
    4 1 4 3 2
    

    【讨论】:

      【解决方案4】:

      我会使用一个技巧。

      mylist = [1, 2, 1, 4, 5, 7, 2]
      
      myset = set(mylist) # equals to (1,2,4,5,7)
      count = 0
      element = None
      
      for i in myset:
          if mylist.count(i) > count:
              count = mylist.count(i)
              element = i
      
      print(element)
      

      set 是非重复值的“列表”,因此当您执行set(list) 时,这将返回列表中所有元素的集合。阅读set类了解更多详情。

      编辑: 如果您确定列表中的所有元素都是数字,则可以选择最大的,如下所示:

      ...
      for i in myset:
          if mylist.count(i) > count:
              count = mylist.count(i)
              if element == None: element = i
              else: element = max(element,i)
      ...
      

      【讨论】:

        【解决方案5】:
        def largest_most_commmon(arr):
            # construct a dict of values and their counts
            d = {x:sum(arr==x) for x in set(arr)}
            highest_count = max(d.values())
            # filter the dict on all items with the highest count
            most_common = [item for item,count in d.items() if count==highest_count]
            return max(most_common)
        
        np.random.seed(40)
        a = np.random.randint(10,20,10)
        # a = array([16, 17, 15, 18, 18, 12, 11, 17, 12, 13])
        
        largest_most_commmon(a)
        # 18
        

        【讨论】:

          【解决方案6】:

          这可以通过 o(n^2) 时间复杂度的两个 for 循环来解决

          max_count=0
          for i in xrange(0, len(arr)):
              item = arr[i]
              item_count = 0
              for j in xrange(0, len(arr)):
                  if item == arr[j]:
                      item_count += 1
              max_count = max(max_count, item_count)
          print(max_count)
          

          【讨论】:

            【解决方案7】:

            对于就地解决方案:

            • 逐渐对列表进行排序,

            • 扫描列表并计算元素重数,

            • 保持迄今为止最大的多重性(如果出现平局,请确保更新到新元素)。

            例如

            1,2,3,4,4,5,4,1,5,3,1
            
            1,1,1,2,3,3,4,4,4,5,5
            
                3 1   2     3   2
            

            最大的重数是3,最后一次看到的值为4

            【讨论】:

              猜你喜欢
              • 2012-06-13
              • 2021-04-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-16
              • 1970-01-01
              相关资源
              最近更新 更多