选择k个数字,最大化成对的总和xor

时间:2017-01-17 15:37:45

标签: algorithm

给定范围[l, r](其中l < r)和数字k(其中k <= r - l),我想选择一组S { {1}} k中的不同数字,可以最大化成对xors的总和。例如,如果[l, r][l, r] = [2, 10]并且我们选择k = 3,则xors的总和为S = {4, 5, 6}

这是我到目前为止的想法:在d(4, 5) + d(4, 6) + d(5, 6) = 1 + 1 + 2 = 4中,对于每个位索引[l, r]小于或等于i中最高设置位的索引,该数字设置r的{​​{1}}中元素的数量等于S ^ S,其中ij * (k-j)j的元素数位设置。为了优化这一点,我们希望选择S,以便对于每个位iS包含i个位置S的元素。对于k/2来说这很容易,但我仍坚持对i进行概括。

1 个答案:

答案 0 :(得分:0)

乍一看,这个问题似乎没有代数解决方案。我的意思是,这似乎是一个 NP-hard 问题(一个优化问题),在多项式时间内无法解决。

几乎总是可能的,人们可以通过可行的空间蛮力。

直观地说,我可以建议调查Locality Sensitive Hashing。在 LSH 中,通常会尝试查找两组之间的相似性。但在您的情况下,您可以在以下意义上滥用此算法。

  • 该域名被细分为几个桶。
  • 您在空间[l,r]中随机抽样。
  • 高可能点(大汉明距离)被放置在水桶中。
  • 最后你在最可能的桶中蛮力。

最后可以预期汉明距离较大的点应该在同一个邻域中(这就是名称​​ Locality Sensitive Hashing )的原因。但是,这只是一个想法。