我有一个数组,我试图找到 n1 最小数字,直到数组中 n2 最小数字并将它们存储在另一个大小为 N2-N1 + 1 即可。这里 n2 > n1 ,与数组的大小相比,两者都很小(例如,数组大小为10000, n1 = 5 , n2 = 20 )。
我可以先对此数组进行排序,然后检索 n1 数字 n1 + 1 数字,直到 n2 数字为止排序的数组。但由于 n1 和 n2 与数组大小相比通常相对较小,因此无需对数组进行完全排序。一旦达到 n2 ,算法应该能够在中间停止。
我想知道是否有任何算法,也许是一个修改版本的certian排序算法在这个问题上特别好(好的,我的意思是快)。您可以使用Python代码或伪代码作为插图,谢谢!
答案 0 :(得分:1)
因为,与阵列的大小相比,N1和N2确实很小。 我们可以使用最小堆数据结构在O(N2 * LogN)中实现。
<强>步骤强>
答案 1 :(得分:0)
如果你的数组大小不是很大,你可以使用简单的查找表(这里有一种排序),而不是排序。首先迭代数组并只存储lookup [array [i]] = true; 然后迭代查找并执行以下操作:
for(...){
if(lookup[j]){
ith++;
if(ith>=n1 && ith<=n2)
ADD(j);
}}
那就是O(n),如果你有一个窗口n1&lt; = n2而不是比O(n)存在更快
答案 2 :(得分:0)
使用selection sort。如果您对整个数组进行排序,则为O( n ²),但如果您只对数组中最小的 m 项进行排序,则为O( mn )
答案 3 :(得分:0)
如果 n2 (因此 n1 )都很小,那么你可以找到 n2 最小元素并忽略第一个 n1 。这些方法由Arun Kumar和user448810描述,只要 n1 仍然很小就会有效。
但是,您可能正在描述 n1 (因此 n2 )可能增长的情况(甚至可能与整个列表长度呈线性关系)并且只有他们的差异 n2-n1 仍然很小。在这种情况下,您需要一个选择算法,例如quickselect,在这种情况下将保持为O(N)。