使用O(k)内存散列O(N)运行时

时间:2018-11-29 22:50:25

标签: algorithm sorting

因此,假设我们给定一个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次。 有办法解决这个问题吗?

2 个答案:

答案 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是多余的,无用的信息。