让我们在一张纸上运行你的代码,看看这两种方法会发生什么;我将使用这个表示法:3.idx
作为从输入中指向元素3的迭代器。
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;
while(mid != end && *mid != key)
{
if (key < *mid)
end = mid; //why not end = mid - 1??
else
beg = mid + 1;
mid = beg + (end - beg)/2;
}
让我们来运行它:
Input: `12345`.
Key: `-10`.
beg = 1
end = 5
mid = 3
3.idx != 5.idx and 3 not -10
if(-10 < 3)
end.idx = 3.idx
mid.idx = 1.idx + 1 = 2
Now we check only "123":
2.idx != 3.idx and 2 not -10
if(-10 < 2)
end.idx = 2.idx
mid.idx = 1.idx + 0 = 1
Now we check only "12":
1.idx != 2.idx and 1 not -10
if(-10 < 1)
end.idx = 1.idx
mid.idx = 1.idx + 0 = 1
Now we check only "1":
1.idx == 1.idx stop.
与
现在:
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;
while(mid != end && *mid != key)
{
if (key < *mid)
end = mid - 1 // Only change
else
beg = mid + 1;
mid = beg + (end - beg)/2;
}
,我们将得到:
Input: `12345`.
Key: `-10`.
beg = 1
end = 5
mid = 3
3.idx != 5.idx and 3 not -10
if(-10 < 3)
end.idx = 3.idx - 1 = 2.idx
mid.idx = 1.idx + 0 = 1
Now we check only "12":
1.idx != 2.idx and 1 not -10
STOP,你有没有看到发生了什么?
我们没有检查,如果2竟是key
,但我们应该这样做...;)
它帮助我很多!谢谢 !! –