运行时间中的对数
分析算法混乱的地方大概集中在对数上,某些分支算法是以O(NlogN)时间来运行的,除了分值算法以外,还包括其他的算法,可将对书中最长出现的规律概括为以下法则,如果一个算法用常熟时间(O(1))将问题的大小削减为其中一部分(通常是1/2),那么这个算法就是O(logN)算法的时候,通常假设数据是提前读入
1)对分查找
对分查找:
给定一个整数X和证书A(0),A(1),....,A(N-1) 后者已经预先安排并且在内存中,求使Ai = X的下标i,如果X不在数据中则返回-1
明显的解法是从左到右的扫描数据,其运行话费线性时间。然而这个算法没有用到该表已经排序的实事,这就使得这个算法不是最好的,一个好的验证策略是验证X是否是居中的元素。如果是答案就找到了,如果x小于居中的元素,那么我们可以用同样的策略于居中元素的左边排序子序列,同理,如果X大于居中元素,那么我们检查数据的右边部分。
对分查找例子:
function searchValueByArray($arr,$value,$len)
{
$low = 0;
$high = $len;
while($low<=$high)
{
$mid = intval(($low+$high)/2);
if($arr[$mid] < $value)
{
$low = $mid+1;
}else if($arr[$mid]>$value)
{
$high = $mid-1;
}else{
return $mid;
}
}
return null;
}
$r = searchValueByArray($arr,-5,sizeof($arr));
var_dump($arr[$r]);