提问者:小点点

如何使用二进制搜索打印排序数组中的所有重复字符串?


仅仅使用二分搜索,如何获得所请求的元素与重复,因为重复将是一个接一个,应该在什么条件下搜索?

假设这是用户输入的给定数组,我们必须搜索“efg”是否存在,我们不知道索引,也不知道它重复了多少次,但是如果它存在,打印它重复的次数。

array[][10]={"abc","efg","efg","jkl","jkl","jhk"}

共2个答案

匿名用户

您可以使用upper_bound查找“efg”后面大于它的第一个元素,使用lower_bound查找“efg”的第一个实例。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<string> V{ "abc", "efg", "efg", "jkl", "jkl", "jhk" };
    cout << upper_bound(V.cbegin(), V.cend(), "efg") - lower_bound(V.cbegin(), V.cend(), "efg") << endl;
}

编辑:要对其进行改进,可以首先使用lower_bound检查该字符串是否存在于数组中。 如果是,则使用upper_bound计算no。 指实例。

匿名用户

如何使用二进制搜索打印排序数组中的所有重复字符串?

寻找范围的一个简单的,可能是非最优的算法:

首先使用二分搜索查找第一个出现的情况。 二分搜索的这种变体被称为“下界”。

然后,使用二分搜索查找最后出现的情况。 这种二进制搜索的变体被称为“上界”。 在这里,我们可以通过限制搜索从找到的下限开始而不是从原始线性untilrange开始来进行一点优化。

但是,不需要自己实现它,因为标准库已经介绍了:std::equal_range

也就是说,如果您的意图是在之后迭代元素,那么就不需要搜索结束,因为您在迭代时会遇到它。 在这种情况下,只需用lower_bound查找开头,然后线性迭代元素,同时执行所需的操作(在示例中为“print”),直到找到不相等的元素。