因此,假设我们给定一个m
数字数组,则此数组中的最大数字为k
。此数组中有重复项。
let array a = [1,2,3,1,2,5,1,2,3,4]
是否存在一种算法,该算法在[1,2,3,4,5](均为排序且无重复)的o(n)操作结果后打印出此数组,其中n
是唯一值值。
我们被允许使用k
内存-在这种情况下为5。
我想到的算法是使用哈希表。将值插入哈希表中,如果该值之前存在,我们将忽略它。这将自动排序。但是,如果我们有5个数字[1,2,3,100,4]但其中之一是100,则意味着在打印这5个数字时,我们需要运行 o(k)〜= 100次而不是 o(n)〜= 5次。
有办法解决这个问题吗?
答案 0 :(得分:0)
您建议打印5个数字需要o(k)(或100)时间而不是o(n)。这是错误的,因为要打印这5个数字,需要花费5倍的时间进行迭代和打印。您的数字值将如何改变解决此问题所需的时间?唯一有区别的情况是该值大于32位整数(即2 ^ 32-1)中的允许值。然后,您将不得不检测这些情况并以不同的方式对待它们。但是,假设您没有该大小的整数,则应该能够在O(5)时间中打印5个整数。我将回顾一下您计算算法所需时间的计算。
使用该方法,如果您使用的是高效算法,则应该能够在O(n log n)时间内删除重复项,如here所示。
如果您有一部分算法(散列部分,删除重复项并进行排序)在O(n log n)时间中运行,并且有一部分算法(打印数组),我的观察方式是运行O(N)(在这种情况下为O(5)),则整个算法的运行时间为O(N):O(N)+ O(N log N)-> O(N),因为O(N) > = O(N log N)。我希望能回答您的要求!
看起来我错了,因为O(N log N)当然比O(N)增长快。我认为没有办法解决您的问题。
答案 1 :(得分:0)
我认为不存在这样的算法。在这里https://en.wikipedia.org/wiki/Sorting_algorithm
对于基于比较的算法,基本上可以达到的最好是O(nlogn)
。但是,由于您提供了最大值k
,因此我认为您想要的不仅仅是基于比较的算法。
但是对于基于非比较的算法,由于其本质上取决于数字的大小,因此复杂度必须反映这种依赖性-这意味着您肯定会在总时间复杂度中找到k
。您将找不到仅O(n)
的算法。
相反,如果该O(n)
算法存在并且不依赖于k
。您可以对n
个数字进行排序,因为k
是多余的,无用的信息。