仅仅使用二分搜索,如何获得所请求的元素与重复,因为重复将是一个接一个,应该在什么条件下搜索?
假设这是用户输入的给定数组,我们必须搜索“efg”是否存在,我们不知道索引,也不知道它重复了多少次,但是如果它存在,打印它重复的次数。
array[][10]={"abc","efg","efg","jkl","jkl","jhk"}
您可以使用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”),直到找到不相等的元素。