我正在以下位置阅读数据结构和算法。
http://www.brpreiss.com/books/opus4/html/page191.html
对于二进制搜索代码,如下所示
unsigned int SortedListAsArray::FindOffset (
Object const& object) const
{
int left = 0;
int right = count - 1;
while (left <= right)
{
int const middle = (left + right) / 2;
if (object > *array [middle])
left = middle + 1;
else if (object < *array [middle])
right = middle - 1;
else
return middle;
}
return count;
}
在分析作者中提到如下
在最坏的情况下,所寻求的项目不在排序列表中。具体地,最坏的情况发生在所寻找的项目小于列表中的任何项目时,因为这种情况需要在二进制搜索循环的每次迭代中进行两次比较。在最坏的情况下,需要
(ceiling(log n) + 2 )
次迭代。因此,FindOffset函数的运行时间为2(ceiling(log n) + 2) * T(op < ) + O(log n)
,其中T(op <)
表示与Object实例进行比较所需的运行时间。
我对上述分析的疑问是
作者如何在声明+ 2
中提出(ceiling(log n) + 2 )
?
其他问题作者为何在O(log n)
语句中添加2(ceiling(log n) + 2) * T(op < ) + O(log n)
?
谢谢!