二分查詢,改進 斐波那契查詢

2021-10-07 08:27:21 字數 2531 閱讀 9554

二分查詢

平均查詢長度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...