这不是一个问题,而是一个聚合帖子。
所以问题是:如果我要找到n次出现的元素,我怎么能实现O(1)空间和O(n)时间复杂度操作一些值类型项(通常是整数或字符)列表,对列表进行排序或查找所有唯一值?
一个小小的说明。这仅适用于具有固定值范围的值类型对象(例如整数,字符等)。
更新
在排序或搜索出现k次,甚至次数或独特元素的元素时,使用这种方法来实现O(1)空间和O(n)时间复杂度存在很多问题。所以,请仔细阅读问题,尤其是第一个声明。这是一个FAQ风格的帖子,而不是一个问题。
另外,我知道答案,不需要一次又一次地发布。如果您认为可以添加有价值的内容 - 可以随意编辑主题中的问题和最长答案(请注意它是我自己的答案),因此它将成为社区维基。
相关问题:
答案 0 :(得分:2)
如果使用稍微偷偷摸摸的参数,每个项目的唯一值的数量是固定的,那么您可以为每个唯一值O(1)空间创建一个哈希映射。
现在你的问题的答案是微不足道的。只需浏览一次列表并累积哈希映射中的出现次数。 O(n)时间。
注意,要回答提出的问题,不需要排序。
答案 1 :(得分:1)
基本思想是O(1)空间复杂度实际上意味着内存消耗独立于数组的大小。
因此,如果您运行的数组元素的范围有限(例如-128..127),您可以分配长度为max_value-min_value+1
的类似哈希的数组,以跟踪每个值的出现次数(我们现在称它为count-array。)
使用这种方法,您只扫描一次数组(因此O(n)
时间复杂度),累积每个单独值的出现次数,最后您可以回答问题:
最后,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)。