C++二进制搜索来查找不动点的索引
C++ Binary Search to find the index of fixed point
我正在实现一个函数,该函数找到a[I]=I的不动点。
size_t find_fixed_point(const vector<int>& list)
{
auto lower = list.begin();
auto upper = list.end() - 1;
while (lower < upper)
{
auto mid = lower + (upper-lower)/2;
if ( *mid <= (mid - list.begin()) )
{
// keep searching on left side
upper = mid;
}
else
{
// keep searching on right side
lower = mid + 1;
}
}
return lower - list.begin();
}
所以如果我把这个应用到下面的向量
vector<int> numbers = {-10, -5, 1, 3, 13, 13, 50, 70};
和
auto temp = find_fixed_point(numbers);
cout << numbers[temp];
它应该给出3作为固定点,但仅仅给我-10是行不通的。
这个算法看起来不错,但不起作用。有人有主意吗?谢谢,
我认为您的比较运算符的方法不对:
size_t find_fixed_point(const vector<int>& list)
{
auto lower = list.begin();
auto upper = list.end() - 1;
while (lower < upper)
{
auto mid = lower + (upper-lower)/2;
if ( *mid >= (mid - list.begin()) )
{
// keep searching on left side
upper = mid;
}
else
{
// keep searching on right side
lower = mid + 1;
}
}
return lower - list.begin();
}
一个可能的解决方案是使用标准库算法,在本例中为std::find_if()
:
int index = 0;
auto result = std::find_if( std::begin( v ) , std::end( v ) , [&]( int value ) { return value == index++; } );
但这里的问题是std::find_if()
是O(n),使用简单的线性遍历。
因此,如果您想要O(logn)解决方案,如您的问题中所述,请使用二进制搜索解决方案。我同意ilent2的回答,问题是"交换"比较:应该是>=
,而不是<=
。
#include<iostream>
#include<vector>
using namespace std;
size_t find_fixed_point(const vector<int>& list)
{
auto lower = list.begin();
auto upper = list.end() - 1;
while (lower < upper)
{
auto mid = lower + (upper-lower)/2;
if ( *mid > (mid - list.begin()) )
{
// keep searching on left side
upper = mid;
}
else if ( *mid < (mid - list.begin()) )
{
// keep searching on right side
lower = mid + 1;
}
else
return mid - list.begin();
}
return lower - list.begin();
}
int main()
{
vector<int> numbers = {-10, -5, 1, 3, 13, 13, 50, 70};
auto temp = find_fixed_point(numbers);
cout << numbers[temp];
}
相关文章:
- 查找最接近的大于当前数字的数字的索引
- 查找字符在两个索引之间出现的次数
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 在对向量中查找元素的索引
- 查找索引的最接近的真实值
- C++ char 类查找字符索引
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 查找数组中重复(重复)数字的索引
- 查找下一个具有真值C++的数组索引
- 在不进行排序的情况下查找数组中n个最小值的索引
- 在索引0为0的数组中查找非零最小值C++
- 具有 O(1) 查找的 C++ 索引容器
- 在 openCV 矩阵中查找列最大值的索引和值
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 查找C++中两个索引之间的子字符串
- 尝试查找从索引 0 开始的偶数长度子字符串
- 在向量C++中查找特定的第一个和最后一个索引<float>
- 如何查找指向数组中元素的指针的索引
- 查找索引数据结构,例如`sTD :: vector`(非数组)
- 多集索引查找