第K个元素N * N和向量

时间:2015-04-05 08:03:35

标签: java algorithm sorting search

我有一个未排序的向量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秒内执行此操作。有人可以给我一个提示怎么做?

1 个答案:

答案 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|

  1. 循环索引max{X}的{​​{1}}。
  2. Vi
  3. 使用二分查找,找到索引v = V[i],以便:v' = M-V[i]j
  4. 对于使用w = V[j] <= v'的每个循环,将所有计算的j+1>n OR V[j+1] > v'相加。这是i
  5. 中的数字元素
  6. j是为每对Xmax{X}计算的v+w的最大值,因此您也需要记住它。
  7. 通过选择i的不同值(使用二进制搜索方法),您可以找到j的{​​{1}}值。当您找到它时,M就是您的解决方案。

    <小时/> PS。我删除了之前的答案,因为它包含我认为已删除的部分,因为我已将其写为M元素的乘法而不是添加。很抱歉给大家带来不便。