这是一个家庭作业问题,所以我想避免完整的答案,如果可能的话,我更喜欢提示。
给定随机整数A [1 ... x]的数组,程序应以递增顺序返回前y个数组元素,其中1 <= y <= sqrt(x)。所以,基本上,给定一个数组[5,9,2,8]和y = 2,程序应返回[2,5]。
“排序第一,返回前y项”答案在窗外,因为我们能做的最好的事情是n * logn time with merge或quicksort。答案因此必须利用我们只返回最多sqrt(x)项的事实,而我到目前为止唯一的另一个答案是对数组中的最小元素进行for循环搜索,从中删除最小值数组,将它存放在一个新的数组中,比如说B,然后在长度为x-1的A的现在较小的修改版本上重复这个过程,这给了我们这样的运行时间:
x + (x-1) + (x-2) + ... + (x-y)
它计算min-search的for循环迭代次数,并在最坏的情况下给出最多y或sqrt(x)次迭代,并且数组中最多有x个项。所以我们有sqrt(x)* x,它比O(n * logn)好,但仍然不是O(n):/。
答案 0 :(得分:9)
提示:假设您有一个O(n)时间算法来选择y th 元素......
答案 1 :(得分:0)
实际上sqrt(x)比log(x)增长得快,因此O(x * sqrt(x))比O(n * log(x))更差。所以你还没有(比)对整个列表进行排序更好。
有几种方法可以解决这个问题。对于其中一个,请查看http://en.wikipedia.org/wiki/Sorting_algorithm#Summaries_of_popular_sorting_algorithms并查看所有常见的排序算法。哪种算法可以最有效地为您提供前几个元素?
答案 2 :(得分:0)
其中1 <= y <= sqrt(x)
请注意此要求为您提供的服务。如果y≤√x,那么y logy≤(√xlogx)/2∈O(x ½ log x)⊂O(x)。
Sort-then-filter可能在窗外,但filter-then-sort是可以接受的。
答案 3 :(得分:-1)
对于y,使用快速排序的想法,选择一个随机数并将其分为两部分。
Part1(较小)和part2(较大)。
如果Part1的长度< y,然后使用y'= y - len(Part1)在Part2中进行分区
如果Part1的长度> y,然后使用y'= y在Part1中进行分区
如果Part1的长度== y,则对Part1进行排序。
对于分区,平均值应该几乎是O(n)(我现在不能批准它,但它很快)(我会尝试为这部分找到一些材料)..
按y排序需要ylog(y)&lt; sqrt(x)log(sqrt(x)) - &gt; 1/2 * sqrt(x)* log(x)&lt; 1/2 * sqrt(x)* sqrt(x)=&gt; 1/2 x。