Algorithm 如何查找在未排序列表中出现k次的元素,该列表具有O(1)个空间和O(n)个时间开销(元素大小有界)

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风格的帖子,不是问题 而且,我知道答案,不需要一次又一次地发布。如果你觉得

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

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

一张小纸条。这仅适用于具有固定值范围(例如整数、字符等)的值类型对象

更新

在排序或搜索出现k次、偶数次或唯一元素等的元素时,使用这种方法来实现O(1)空间和O(n)时间复杂性有很多问题。因此,请仔细阅读问题,尤其是第一句话。这是一篇FAQ风格的帖子,不是问题

而且,我知道答案,不需要一次又一次地发布。如果你觉得你可以添加一些有价值的东西-请随意编辑问题和主题中最长的答案(请注意,这是我自己的答案),这样它就会成为一个社区wiki

相关问题:

  • 基本思想是O(1)空间复杂性实际上意味着内存消耗与数组的大小无关

    因此,如果您正在操作的数组元素的范围有限(例如-128..127),则可以分配一个长度
    max\u value-min\u value+1
    的散列数组,以跟踪每个值的出现次数(现在称之为计数数组)

    使用这种方法,您只需扫描数组一次(因此
    O(n)
    time complexity),累积每个值的出现次数,最后您可以回答以下问题:

  • 是否存在外观为奇数/偶数的元素?只出现一次?任意出现次数?(只需扫描计数数组)
  • 初始数组中显示的唯一值是什么(选择计数数组中值大于1的所有关键点)
  • 对数组进行排序(稍微复杂一点,请参见下面的示例)
  • 最后,在
    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)。