我正在寻求设计支持以下算法的帮助:
当我尝试使用哈希来支持O(1)操作时,这个问题在我看来很容易,但后来我回忆起哈希表不支持元素之间的比较,我知道我可以在O中对数组进行排序(n ^ 2)我结束了。启动(M)给定M的唯一自然数初始化数据 O(f(n))f中的结构是一些多项式函数 lookUP(x)给定一个自然数,如果在S中找到x 在O(1)。 find Kth(k)返回O(1)中S中的第k个最大数字。
f(n)作为多项式O(f(n))init有更快的解决方案吗?
答案 0 :(得分:0)
我知道我可以在O(n ^ 2)中对数组进行排序,然后结束。
在O(nlogn)中可以更快地完成排序,其中n是问题的大小。这种算法的一个例子是Quicksort。
数据结构可以是一个数组,您可以使用成本O(nlogn)对其进行排序。然后,您可以将其索引为O(1)时间内最大的第k个元素。
但是,为了搜索任何x,您将不得不使用二进制搜索,这需要花费O(logn)。
但你的元素是独一无二的。所以,您可以使用索引数组,例如,如果您的输入是[1,2,3,5],那么您的布尔索引数组将是[1,1,1,0,1],其中0表示输入中不存在该索引中的数字。这样你可以在O(1)时间查找每个x。
但是现在找到最大的第k个元素需要转到第k个索引,检查那个插槽,如果它是空的,那么检查下一个插槽,直到找到1,这意味着这个插槽的编号存在于我们的输入中。这将花费O(m),其中m是在到达第k个索引之后将遇到的空槽的数量,其平均应该很小,并且可以假设为常数,产生O的时间复杂度。 (1)。