[英]Binary search of a fixed point
我需要写一个程序
S = x 1 ,...,x n
整数序列,使得
x 1 <…<x n
对于每个整数a和每个索引
1≤i≤n
限定
f a(i) = x i + a。
给定S
和a
,则判断是否存在这样的i
f a(i) = i。
我已经实现了以下程序:
#include <iostream>
#include <vector>
using namespace std;
int fixpoint(const vector<int>& v, int a, int esq, int dre) {
if(esq > dre) return -1;
int m = (esq+dre)/2;
if(v[m]+a == m+1) return m+1;
if(v[m]+a > m+1) return fixpoint(v, a, m+1, dre);
if(v[m]+a < m+1) return fixpoint(v, a, esq, m-1);
}
int main() {
int s;
while(cin >> s) {
vector<int> v(s);
for(int i = 0; i<s; ++i) cin >> v[i];
int n;
cin >> n;
for(int i = 0; i<n; ++i) {
int a;
cin >> a;
int fix = fixpoint(v, a, 0, v.size()-1);
if(fix == -1) cout << "no fixed point for " << a << endl;
else cout << "fixed point for " << a << ": " << fix << endl;
}
cout << endl;
}
}
程序必须先写一个满足条件的i,但是如果我使用以下输入:
5
-7 -2 0 4 8
1
0
5
0 1 2 3 4
3
0 -1 1
输出为:
Sequence #1
no fixed point for 0
Sequence #2
no fixed point for 0
no fixed point for -1
fixed point for 1: 3
并且第二个序列中1
的不动点应该是1
,因为它是满足条件的第一个i
。
你可以帮帮我吗?
我看到两个问题。
首先,在函数中,应反转二分查找的分支,因为f单调递增(如i),如果f > i
,则必须在具有较小i的区间中进行搜索。
int fixpoint(const vector<int>& v, int a, int esq, int dre) {
if ( esq > dre ) return -1;
int m = (esq + dre)/2;
int m1 = m + 1;
int f = v[m] + a;
if( f == m1)
return m1;
else if( f < m1)
return fixpoint(v, a, m1, dre);
else
return fixpoint(v, a, esq, m-1);
}
其次,您的第二个示例格式错误,因为每个i f == i
i。 您的函数仅返回3,因为它是它检查的第一个索引,并且3的正确答案是1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.