含有重複元素的二分查詢演算法

2021-07-05 09:07:40 字數 1307 閱讀 2757

rust已經有binary_search了,但不能很好的處理有重複元素的查詢。

下面這個是我按照網上查詢到的原理自己實現的,這個處理重複元素比較好,如果key有重複,那麼查詢到的總是最小的那個index

fn

main() else

}//自己實現的二分查詢的結果

println!("search value:{}\nleft:{},right:{}\nfind:\n idx:{},value:{}",seek,left,right,left,s[left]);

//呼叫rust實現的二分查詢

println!("",s.binary_search(&1));

}

執行結果:

search

value

:1left

:5,right

:5find:

idx:5,value

:1ok(10)

自己實現的二分查詢找到了第乙個」1」的位置了,而rust自帶的binary_search找到的並不一定是第乙個」1」

做了個簡單的bench,可以看到我的這個實現與庫實現的差別很小,估計庫也沒有做優化了,先貼結果:

test bench_binary_search … bench: 42 ns/iter (+/- 9)

test bench_binary_search_lib … bench: 41 ns/iter (+/- 11)

這幾個全域性變數控制測試長度的

static test_len:usize = 1000;

static test_linear_key:u32 = 500;

static test_binary_key:u32 = 200;

注:因為rust自帶的binary_search不能很好的處理key重複的情況,所以就用不重複的陣列進行測試

#[bench]

fn bench_binary_search(b: &mut bencher)

b.iter(|| else

}assert!((left == right) && (v[left] == test_binary_key));

});}

#[bench]

fnbench_binary_search_lib(b: &mut bencher)

b.iter(|| else

});}

可查詢重複元素的二分查詢演算法

二分查詢演算法思想 又稱為 折半查詢,二分查詢適合對已經排序好的資料集合進行查詢。假設有一公升序的資料集合,先找出公升序集合中最中間的元素,將資料集合劃分為兩個子集,將最中間的元素和關鍵字key進行比較,如果等於key則返回 如果大於關鍵字key,則在前乙個資料集合中查詢 否則在後乙個子集中查詢,直...

二分查詢有序重複元素

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。如果陣列中不存在目標值 target,返回 1,1 高階 你可以設計並實現時間複雜度為 o log n 的演算法解決此問題嗎?示例 1 輸入 nums 5,7,7,8,8,10 tar...

含有重複元素的排列

設r 是要進行排列的n個元素。其中元素r1 r2 rn可能相同。試設計乙個演算法,列出r的所有不同排列。給定n以及待排列的n個元素。計算出這n個元素的所有不同排列。輸入資料的的第1行是元素個數n,1 n 500。接下來的1行是待排列的n個元素。將計算出的n個元素的所有不同排列輸出,每種排列佔1行,最...