Arrays 查找O(n)时间和O(1)额外空间中的最大重复次数

Arrays 查找O(n)时间和O(1)额外空间中的最大重复次数,arrays,sorting,counting-sort,Arrays,Sorting,Counting Sort,查找O(n)时间和O(1)额外空间中的最大重复次数(出现次数最多的次数) 我想我可以使用计数排序阶段来维护一个计数数组,然后它可以在O(N)中完成。我说得对吗 但是如何处理额外的空间。还有其他有效的算法吗?如果不进一步了解数组中可能的数字,我认为这是不可能的。对于直觉考虑如下:对于准备使用的任何固定量的内存( C=O(1)< /代码>),有一个序列,使得在点 N-1 < /代码>中有 C+ 1 < /代码>可能的正确答案,只有最后一个数字断开领带。在这种情况下,具有恒定内存c的算法无法一次找到答

查找O(n)时间和O(1)额外空间中的最大重复次数(出现次数最多的次数)

我想我可以使用计数排序阶段来维护一个计数数组,然后它可以在O(N)中完成。我说得对吗


但是如何处理额外的空间。还有其他有效的算法吗?

如果不进一步了解数组中可能的数字,我认为这是不可能的。对于直觉考虑如下:对于准备使用的任何固定量的内存(<代码> C=O(1)< /代码>),有一个序列,使得在点<代码> N-1 < /代码>中有<代码> C+ 1 < /代码>可能的正确答案,只有最后一个数字断开领带。在这种情况下,具有恒定内存
c
的算法无法一次找到答案。这同样适用于多个(恒定数量的)过程

让我们看看我们能做些什么


  • 如果我们知道最多有
    k
    个唯一的数字,我们可以在
    O(n)
    中找到答案,通过保持一个计数数组(或者如果
    k
    个数字不需要顺序,则具有恒定查找成本的无序映射),使用
    O(k)
    额外的空间。但是,如果我们不能绑定
    k
    而不是
    kDoes,“最大重复次数”是指出现最多的次数,或重复次数最大的次数?出现最多的次数我认为这是不可能的。我能想到的最好的方法是排序(
    O(n*log(n))
    )+对已排序数组(
    O(n)
    )进行一次扫描。它们是整数吗?对可能出现的最大或最小数字有限制吗。这种方法的另一个问题是,原始数组被修改,需要另一个
    O(n)
    操作才能恢复原始值。如何在O(n)和O(k)额外空间中维护计数数组。@stackuser你说得对。我想到的是一个映射(对于查找,它具有
    O(log(k))
    复杂性),但是一个无序的映射或数组(对于
    0
    k
    )具有恒定的查找复杂性。