二分查詢
平均查詢長度o(1.5logn),
實現**:
// 二分查詢演算法(版本a):在有序向量的區間[lo, hi)內查詢元素e,0 <= lo <= hi <= _size
typdef int rank;
template
<
typename t>
static rank binsearch ( t* s, t const
& e, rank lo, rank hi )
//成功查詢可以提前終止
return-1
;//查詢失敗
}//有多個命中元素時,不能保證返回秩最大者;查詢失敗時,簡單地返回-1,而不能指示失敗的位置
// 二分查詢演算法(版本b):在有序向量的區間[lo, hi)內查詢元素e,0 <= lo < hi <= _size
template
<
typename t>
static rank binsearch ( t* s, t const
& e, rank lo, rank hi )
//出口時hi = lo + 1,查詢區間僅含乙個元素a[lo]
return e < s[lo]
? lo -
1: lo;
//返回位置,總是不超過e的最大者
}//有多個命中元素時,不能保證返回秩最大者;查詢失敗時,簡單地返回-1,而不能指示失敗的位置
// 二分查詢演算法(版本c):在有序向量的區間[lo, hi)內查詢元素e,0 <= lo <= hi <= _size
template
<
typename t>
static rank binsearch ( t* s, t const
& e, rank lo, rank hi )
//成功查詢不能提前終止
return lo -1;
//迴圈結束時,lo為大於e的元素的最小秩,故lo - 1即不大於e的元素的最大秩
}//有多個命中元素時,總能保證返回秩最大者;查詢失敗時,能夠返回失敗的位置
斐波那契查詢改進
改進原因:二分查詢,相同的遞迴深度下,左邊比較一次,右邊需要比較兩次
所以:可以通過遞迴深度的不均衡對轉向成本不均衡補償(也就是加深比較次數少的左邊的深度)
實現**:
class
fib//fib(-1), fib(0),o(log_phi(n))時間
intget()
//獲取當前fibonacci項,o(1)時間
intnext()
//轉至下一fibonacci項,o(1)時間
intprev()
//轉至上一fibonacci項,o(1)時間
};
#include
"fibonacci/fib.h"
//引入fib數列類
// fibonacci查詢演算法(版本a):在有序向量的區間[lo, hi)內查詢元素e,0 <= lo <= hi <= _size
template
<
typename t>
static rank fibsearch ( t* s, t const
& e, rank lo, rank hi )
//成功查詢可以提前終止
return-1
;//查詢失敗
}//有多個命中元素時,不能保證返回秩最大者;失敗時,簡單地返回-1,而不能指示失敗的位置
#include
"fibonacci/fib.h"
//引入fib數列類
// fibonacci查詢演算法(版本b):在有序向量的區間[lo, hi)內查詢元素e,0 <= lo <= hi <= _size
template
<
typename t>
static rank fibsearch ( t* s, t const
& e, rank lo, rank hi )
//成功查詢不能提前終止
return
--lo;
//迴圈結束時,lo為大於e的元素的最小秩,故lo - 1即不大於e的元素的最大秩
}//有多個命中元素時,總能保證返回最秩最大者;查詢失敗時,能夠返回失敗的位置
二分查詢與斐波那契查詢
方法一 軸點取中點,逐步遞迴。演算法時間複雜度o log n 主要思路如下圖 不會執行 pre 對於該演算法,我們可以計算出迭代到底部所耗費的時間,計算結果如下圖所示。從圖中可以看出左邊遞迴和右邊遞迴所耗費的步數是不一樣的,那我我們是否可以找到一種演算法讓左邊迭代步數和右邊一致能,這樣能夠減少平均迭...
二分查詢 插值查詢 斐波那契查詢
在有序表中,取中間記錄作為比較物件,將其與給定值相比較,若其等於給定值,則查詢成功 若其小於給定值,則在中間記錄的右半區繼續查詢 若其大於給定值,則在中間記錄的左半區繼續查詢。不斷重複以上過程,直到查詢成功或無匹配記錄。使用該查詢方法的前提條件在於,線性表中的資料必須有序,且必須採用順序儲存的方式。...
二分查詢,插值查詢,斐波那契查詢
二分查詢,插值查詢,斐波那契查詢 1.二分查詢 偽 while left else if key arr left index 2 then right left right 2 else left left right 2 end 示例 public int midsearch listarr,i...