UVA 10077 - 为什么是二分搜索?
UVA 10077 - Why is it Binary search?
我正在努力在CP中变得更好。我遇到了这个问题 - 链接。虽然我有一个天真的BFS解决方案,但想到了O(2^N(,但它显然给了我一个TLE。
string bfs(int t1,int t2)
{
queue<pair<VII,string>> st;
st.push({{0,1,1,2,1,1},"L"});
st.push({{1,1,2,1,1,0},"R"});
while(!st.empty())
{
VII u=st.front().first;
string v=st.front().second;
st.pop();
//cout<<u[2]<<' '<<u[3]<<endl;
if(u[2]==t1 && u[3]==t2)
return v;
st.push({{u[0],u[1],u[0]+u[2],u[1]+u[3],u[2],u[3]},v+"L"});
st.push({{u[2],u[3],u[2]+u[4],u[3]+u[5],u[4],u[5]},v+"R"});
}
return "";
}
以上是我能够想出的代码。我知道有二叉搜索解决方案,但我无法理解如何划分搜索空间。如果有人能向我解释这背后的直觉,那就太好了。谢谢!
您正在尝试在无限区间lo=(0,1) hi=(1,0)
中找到目标数字。 正如 PDF 所说,您可以通过执行mid = (lo[0]+hi[0])/(lo[1]+hi[1])
找到间隔的中点。 向左或向右的决定取决于mid
和目标数字的比较。 如果向左走,则会发出L
并开始在区间lo=lo hi=mid
中搜索。 如果向右走,则会发出R
并开始在区间lo=mid hi=hi
中搜索。 重复直到mid == target
。
以下是 Python 中的一个快速解决方案:
from fractions import Fraction
def walk(lo, hi, tgt):
mid = (lo[0] + hi[0], lo[1] + hi[1])
fmid = Fraction(mid[0], mid[1])
if tgt == fmid:
return
if tgt < fmid:
yield 'L'
yield from walk(lo, mid, tgt)
else:
yield 'R'
yield from walk(mid, hi, tgt)
print(list(walk((0,1), (1,0), Fraction(878, 323))))
相关文章:
- 为什么二进制搜索在我的测试中不起作用
- 使用不变量来确定二分搜索中的边界条件
- 为什么我的链接器在找到Coin4d.lib后搜索Coin4sd.lib?
- 为什么我在地图中搜索STL时差很大?
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- 基于函数而不是集合的二分搜索或迭代器?
- UVA 10077 - 为什么是二分搜索?
- 为什么"/usr/include"不在 GCC 默认搜索路径中
- 简单的二分搜索对我不起作用。我正在尝试从文本文件中搜索单词
- 递归除法和二分搜索中的错误
- 搜索为什么不分配内存
- 用于二分搜索的错误简单功能(C++)
- 按字母顺序对数组进行二分搜索和排序 C++.
- 是否可以使用 lower_bound() 对结构的普通数组进行二分搜索
- 对带/不带提升的函数参数进行二分搜索
- 在 c++ 中对向量<结构 S> 进行二分搜索?
- 涉及向量的二分搜索出现问题(c++)
- 二分搜索,"midpoint"占三分之一
- 二分搜索算法采用迭代和递归
- 纠正我的次优二分搜索