二进制搜索排序向量中的对象,其中包含一些无意义的条目作为干扰

Binary Search an object in a sorted vector with some meaningless entries as interference

本文关键字:无意义 干扰 排序 搜索 向量 对象 二进制 包含一      更新时间:2023-10-16

我有一个向量vector<int> A,其中所有非零值都已被很好地排序。然而,也有一些0存储在里面,我们认为它没有意义。矢量中不存在非零元素的重复项。例如,A是类似于[0,0,5,0,6,9,10,21,0,40,0]的某种向量。现在给定一个数字x (x!=0),我们应该找到这个向量中的第一个位置,使得这里的值>= x。例如,如果是x == 10,则返回值应该是6,因为A[6] == 10;如果是x == 23,则返回值应该是9,因为A[9] == 40是第一个大于10的元素。

考虑到无意义的0,我知道如何编写自己的代码来实现二进制搜索。然而,我正在考虑如何使用STL现有的函数来实现它。一个直接的想法是将所有非零元素提取到另一个vector<int> B,记录每个元素在A中的原始位置,将std::lower_bound应用到B,最终得到A中的位置。然而,由于提取步骤将具有复杂度O(N),因此这种想法虽然有效,但将毫无意义。

有人能帮我想出STL函数的另一个想法吗?复杂性需要不大于log(N)

注意:有些人说,如果向量A包含全零,那么我们在log(N)中没有办法做到这一点。请将其视为最坏的情况。我所说的log(N)的意思是,如果A不包含零,那么它应该是log(N);当然,随着零点数量的增加,效率肯定在降低,但这是必须的。

O(logn)中不能执行此操作。考虑向量中所有元素都为零的情况。你绝对找不到一种算法能在O(n)时间内做到这一点。