如何找到在未排序列表中出现k次的元素,其中包含O(1)空间和O(n)时间成本(具有有界元素大小)

时间:2012-01-20 10:49:00

标签: algorithm list search sorting

这不是一个问题,而是一个聚合帖子。

所以问题是:如果我要找到n次出现的元素,我怎么能实现O(1)空间和O(n)时间复杂度操作一些值类型项(通常是整数或字符)列表,对列表进行排序或查找所有唯一值?

一个小小的说明。这仅适用于具有固定值范围的值类型对象(例如整数,字符等)。

更新

在排序或搜索出现k次,甚至次数或独特元素的元素时,使用这种方法来实现O(1)空间和O(n)时间复杂度存在很多问题。所以,请仔细阅读问题,尤其是第一个声明。这是一个FAQ风格的帖子,而不是一个问题。

另外,我知道答案,不需要一次又一次地发布。如果您认为可以添加有价值的内容 - 可以随意编辑主题中的问题和最长答案(请注意它是我自己的答案),因此它将成为社区维基。

相关问题:

  1. Finding the first non-repeated character of a string in O(n) using a boolean array?
  2. Find a single integer that occurs with even frequency in a given array of ints when all others occur odd with frequency
  3. Find if 2 strings are anagram in O(1) space and O(n) time
  4. Finding duplicates in O(n) time and O(1) space
  5. Find duplicates in an array
  6. O(n) algorithm to find out the element appearing more than n/2 times

3 个答案:

答案 0 :(得分:2)

如果使用稍微偷偷摸摸的参数,每个项目的唯一值的数量是固定的,那么您可以为每个唯一值O(1)空间创建一个哈希映射。

现在你的问题的答案是微不足道的。只需浏览一次列表并累积哈希映射中的出现次数。 O(n)时间。

注意,要回答提出的问题,不需要排序

答案 1 :(得分:1)

基本思想是O(1)空间复杂度实际上意味着内存消耗独立于数组的大小

因此,如果您运行的数组元素的范围有限(例如-128..127),您可以分配长度为max_value-min_value+1的类似哈希的数组,以跟踪每个值的出现次数(我们现在称它为count-array。)

使用这种方法,您只扫描一次数组(因此O(n)时间复杂度),累积每个单独值的出现次数,最后您可以回答问题:

  1. 是否有奇数/偶数出现的元素?只出现一次? 出现的任意数量? (只扫描计数数组)
  2. 初始数组中出现的唯一值是什么(选择count-array中值> 1的所有键)
  3. 对数组进行排序(稍微复杂一点,参见下面的示例)
  4. 最后,Python

    上的一些代码示例
    import random, sys
    min_val = -5
    max_val = 5
    initial_array = [random.randint(min_val, max_val) for i in range (0,20)]
    count_array = {i:0 for i in range(min_val,max_val+1)}
    
    for elem in initial_array:
        count_array[elem]+=1
    
    #print initial_array
    
    #1. Find unique values
    unique_values = [item for item, count in count_array.iteritems() if count>0]
    #print unique_values
    
    #2. Find n-time-appearing values
    n=2
    n_times_appear = [item for item, count in count_array.iteritems() if count==n]
    #print n_times_appear
    
    #3. Find odd times appearing numbers
    odd_times_appear = [item for item, count in count_array.iteritems() if not count%2]
    #print odd_times_appear
    
    #4. Sort an array
    #We don't actually sort an array - we just reconstruct it.
    sorted_array = []
    for item,count in sorted(count_array.iteritems()):
        for i in range(0,count):
            sorted_array.append(item)
    
    #print sorted_array
    

    如果我错了,请随意添加其他语言的实现并纠正我:)

答案 2 :(得分:-1)

由于输入大小有限,您只需在输入上运行Counting Sort算法即可找到结果。计数排序需要O(n),并且查找数组的特定元素具有特定的出现时间,即排序数组中的O(n)。