我有一个未排序的向量V , |V| = N
,我需要在排序向量中找到K-th
元素
S = {V[i] + V[j] | 0 <= i,j < N}, |S| = N*N
我正在考虑对提升V
进行排序,然后仅计算K
中的第一个S
元素,或者对(N * N) - K
进行降序排序和计算K > (N * N) / 2
,但是对于< / p>
N = 50.000 and K = 2.265.604.247
在Java中花费0.2秒只是为了从1迭代到N*N-K
,我需要在最大0.3秒内执行此操作。有人可以给我一个提示怎么做?
答案 0 :(得分:1)
这是我对解决方案的看法 我认为它应该比计算所有内容快很多,你应该考虑它。
V
是有序矢量长度n
,我们希望找到k
- 最大数量的笛卡尔积[{1}}。
我们将使用类似于二分搜索的搜索方法来查找所需数字。
请注意:
对于每个数字VxV = {v1+v2|,v1,v2∈V}
,M
,我们定义集M = m+m, m < max{v|v∈ V}
。使用此功能很容易找到X = {x ∈ VxV, x<=m+m=M}
和|X|
:
max{X}
的{{1}}。V
,i
。v = V[i]
,以便:v' = M-V[i]
和j
。w = V[j] <= v'
的每个循环,将所有计算的j+1>n OR V[j+1] > v'
相加。这是i
。j
是为每对X
和max{X}
计算的v+w
的最大值,因此您也需要记住它。通过选择i
的不同值(使用二进制搜索方法),您可以找到j
的{{1}}值。当您找到它时,M
就是您的解决方案。
M
元素的乘法而不是添加。很抱歉给大家带来不便。