【发布时间】:2022-01-20 21:21:55
【问题描述】:
给定一组大小为 N 且按升序排序的整数。为简单起见,这个数组“arr”如下:[a0, a1, a2, ..., aN]。我需要所有对 ai 和 aj 之和的数组,允许重复:[a0 + a0, a0 + a1, a0 + a2, ..., a1 + a0, a1 + a1, ... aN + aN],大小 N^2。但是,我需要按排序顺序对其进行二进制搜索(在 O(log(N^2)) 时间内),而不必生成整个数组,这将花费 O(N^2 log(N^2)) 时间.由于二进制搜索只需要特定索引处的数组值,我想知道是否有一个数学函数来确定给定特定索引的排序排列和数组的值(例如,value(3) 将返回ak + am),允许我在不完整生成数组的情况下对数组进行二进制搜索?我在想这样的事情:
int value(int index) {
return arr[index/N] + arr[index%N];
}
但这并没有考虑到arr[i] + arr[k] 的值可能大于arr[i+1] + arr[k-5],例如,即使arr[i+1] > arr[i]。 TLDR;对于这种特殊的数组情况,有什么方法可以在少于 O(N) 的时间内进行分区?出于我自己的目的,我还可以接受一种在不到 O(N^2) 时间内生成整个排序数组的解决方案。
【问题讨论】:
-
在最坏的情况下,任何一对都可能是第 k 个元素(除了 k=1,2,n^2-1 和 n^2 的一些琐碎情况),所以至少你必须遍历所有对一次以跟踪 n^2 次的 k 最小对。您的原始数组已排序的事实实际上根本没有帮助。例如,如果 a0=1 和 a1=100,那么 101 到 200 之间的任何值都可能是第三个元素,它可能以多种方式发生。您仍然需要彻底检查大量元素组合,以确保您没有错过任何一个
-
@apokryfos 你是说我们不能比 O(n^2) 更好地找到 n^2 和中的第 k 个最小的吗?
-
@user2533504 你的二分搜索结果是什么?你用它做什么?
-
你提前知道你的二分搜索查询吗?如果您有一批查询要处理,您可以通过按排序顺序处理查询来加速整个算法。
-
@KellyBundy 我基本上只是想要一种方法来快速找到 n^2 数组中有多少元素小于某个数字 k,也就是排序数组中的 k 索引。
标签: arrays algorithm sorting time-complexity partitioning