Algorithm 如何查找在未排序列表中出现k次的元素,该列表具有O(1)个空间和O(n)个时间开销(元素大小有界)
这不是一个问题,而是一个聚合帖子 所以问题是:如果要查找n次出现的元素、对列表排序或查找所有唯一的值,如何实现O(1)空间和O(n)时间复杂度操作某些值类型的项(通常是整数或字符)列表 一张小纸条。这仅适用于具有固定值范围(例如整数、字符等)的值类型对象 更新 在排序或搜索出现k次、偶数次或唯一元素等的元素时,使用这种方法来实现O(1)空间和O(n)时间复杂性有很多问题。因此,请仔细阅读问题,尤其是第一句话。这是一篇FAQ风格的帖子,不是问题 而且,我知道答案,不需要一次又一次地发布。如果你觉得你可以添加一些有价值的东西-请随意编辑问题和主题中最长的答案(请注意,这是我自己的答案),这样它就会成为一个社区wiki 相关问题: 基本思想是O(1)空间复杂性实际上意味着内存消耗与数组的大小无关 因此,如果您正在操作的数组元素的范围有限(例如-128..127),则可以分配一个长度Algorithm 如何查找在未排序列表中出现k次的元素,该列表具有O(1)个空间和O(n)个时间开销(元素大小有界),algorithm,list,search,sorting,Algorithm,List,Search,Sorting,这不是一个问题,而是一个聚合帖子 所以问题是:如果要查找n次出现的元素、对列表排序或查找所有唯一的值,如何实现O(1)空间和O(n)时间复杂度操作某些值类型的项(通常是整数或字符)列表 一张小纸条。这仅适用于具有固定值范围(例如整数、字符等)的值类型对象 更新 在排序或搜索出现k次、偶数次或唯一元素等的元素时,使用这种方法来实现O(1)空间和O(n)时间复杂性有很多问题。因此,请仔细阅读问题,尤其是第一句话。这是一篇FAQ风格的帖子,不是问题 而且,我知道答案,不需要一次又一次地发布。如果你觉得
max\u value-min\u value+1
的散列数组,以跟踪每个值的出现次数(现在称之为计数数组)
使用这种方法,您只需扫描数组一次(因此O(n)
time complexity),累积每个值的出现次数,最后您可以回答以下问题:
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
请随意添加其他语言实现,如果我错了,请纠正我:)因为输入大小是有界的,您只需在输入上运行算法,然后找到结果。计数排序需要O(n),而查找数组的特定元素在排序数组中的特定出现时间是O(n) 如果您使用了一个稍微狡猾的参数,即每个项的唯一值的数量是固定的,那么您可以为每个唯一值创建一个哈希映射,即O(1)空间 现在,你的问题的答案是微不足道的。只需浏览列表一次,并累积哈希映射中出现的次数。O(n)时间
请注意,要回答提出的问题,不需要排序。我认为我根本不理解这个问题。也许你应该把它分开。例如,您希望如何在O(1)空间中使用数组?另外,你不能在少于O(n log n)的时间内对数组进行排序(尽管基数排序可以)。@AdrianRatnapala,请看下面的答案。@J0HN如果你能添加一个例子,让我更好地理解这个问题,我将不胜感激。如果你想让你的答案成为一个社区wiki,可以选中一个复选框。既然已经太晚了,你可以把它标出来,让版主来做。而且,听起来你想提出一个“规范问题”;如果是,请适当改写。你在帖子中两次说“这不是问题”。当五个人同意时,不要感到惊讶,这也就结束了。为了进一步扩展这一点,您可以对
O(n)
中的任何固定宽度整数类型进行二进制基数排序,然后扫描结果以执行您列出的任何其他操作。不过,这有点弱。综合回答+1。我唯一的批评是,为了回答这个问题(找到出现k次的元素),不需要排序.O(n)空间,而不是O(1)。