📜  算法|算法分析(重复)|问题9(1)

📅  最后修改于: 2023-12-03 15:11:32.977000             🧑  作者: Mango

算法分析问题9

问题描述:给定一个长度为n的数组,找出数组中所有可重复的数字出现的次数,并按出现次数从多到少排序输出。

算法分析:要解决这个问题,一种简单直接的思路是先对数组进行排序,然后再用Hash表统计每个数字的出现次数,最后按出现次数从多到少排序输出。

因为要排序,这个算法的时间复杂度至少是O(nlogn),再加上Hash表的操作,总的时间复杂度应该是O(nlogn)或O(nlogn+m),其中m是Hash表的大小。

实现代码如下(使用Python语言):

def count_duplicates(arr):
    # 对数组进行排序
    arr.sort()
    # 统计每个数字的出现次数
    count = {}
    for num in arr:
        if num in count:
            count[num] += 1
        else:
            count[num] = 1
    # 按出现次数从多到少排序输出
    result = []
    for num, cnt in sorted(count.items(), key=lambda x:x[1], reverse=True):
        if cnt > 1:
            result.append((num, cnt))
    return result

这个算法使用了Python的内置函数sorted来对Hash表中的键值对按值排序,具有一定的可读性和简洁性。

样例运行结果如下(假设输入数组为[1, 2, 3, 2, 1, 4, 5, 3, 3, 3]):

[(3, 4), (1, 2), (2, 2)]

这表示数字3出现了4次,数字1和2各出现了2次,三个数字都是可重复的。