最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn)

 更新時(shí)間:2022年03月11日 09:06:28   作者:機(jī)器學(xué)習(xí)入坑者  
本文介紹了c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn),二分查找指首先將數(shù)組中間值和目標(biāo)值進(jìn)行比較,如果相等則返回;如果不相等,則選擇中間值左邊的一半或者右邊的一半進(jìn)行比較;不斷重復(fù)直到檢索完畢,下文相關(guān)資料需要的朋友可以參考一下

在計(jì)算機(jī)中,數(shù)據(jù)的查找方式與其存儲方式關(guān)系密切。試想一下,如果圖書館中書籍雜亂無章的存放,那么要想找到心儀的書籍將會非常困難。為此,人們常常將物品按照某種規(guī)則或次序進(jìn)行放置,目的是便于日后的查找。

作為查找算法家族中的一員,二分查找正是利用數(shù)據(jù)按次序存儲這一優(yōu)點(diǎn),極大的提升了查找目標(biāo)值所在位置的速度。

二分查找的核心思想是:首先將數(shù)組中間值和目標(biāo)值進(jìn)行比較,如果相等則返回;如果不相等,則選擇中間值左邊的一半或者右邊的一半進(jìn)行比較;不斷重復(fù)直到檢索完畢。首先來看下面這個(gè)gif,其中藍(lán)色圈表示左位置,粉色圈表示右位置,綠色圈表示中間位置:

首先定義的是左邊界(藍(lán)色圈)和右邊界(粉色圈),進(jìn)而根據(jù)左邊界和右邊界計(jì)算出中間位置(綠色圈);然后,比較中間位置的值和目標(biāo)值的大小,比較結(jié)果包含3種情況

  • 如果相等則表示查找成功,返回中間位置;
  • 如果中間位置的值小于目標(biāo)值,則說明目標(biāo)值在中間位置到右邊界這一半;
  • 如果中間位置的值大于目標(biāo)值,則說明目標(biāo)值在左邊界到中間位置這一半;

上述步驟的循環(huán)需要終止條件,即左邊界小于或等于右邊界,表明此時(shí)已經(jīng)搜索完成,目標(biāo)數(shù)值不在數(shù)據(jù)中存在。

1、時(shí)間復(fù)雜度與優(yōu)缺點(diǎn)

既然每次搜索后區(qū)間長度都減半,假設(shè)數(shù)據(jù)個(gè)數(shù)(即區(qū)間長度)為n,那么算法每次迭代得到的區(qū)間長度依次為n/2,n/4,n/8等等,其通項(xiàng)如下,k表示循環(huán)次數(shù):

最壞的情況,就是搜索到區(qū)間長度為1,即最后只剩1個(gè)元素:

 

所以,可以求得最壞情況下需要運(yùn)行的次數(shù)為:

因此二分查找復(fù)雜度為O(logn),相比于順序查找其速度獲得了極大的提高(優(yōu)點(diǎn))。但是,必須注意二分查找需要保證數(shù)據(jù)是有序的,這就要求數(shù)據(jù)必須預(yù)先進(jìn)行排序(缺點(diǎn))。

2、python實(shí)現(xiàn)

def binary_search(ordered_list, target_value):
? ? """
? ? Args:
? ? ? ? ordered_list: data with order
? ? ? ? target_value: value that want be searched
? ? """
? ? left = 0
? ? right = len(ordered_list)-1
? ? # 終止條件
? ? while left <= right:
? ? ? ? # 中間位置計(jì)算
? ? ? ? mid = int((left+right)/2)
? ? ? ? if ordered_list[mid] == target_value:
? ? ? ? ? ? return "index is {}, target value is {}".format(mid, ordered_list[mid])
? ? ? ? # 此時(shí)目標(biāo)值在中間值右邊,更新左位置
? ? ? ? elif ordered_list[mid] < target_value:
? ? ? ? ? ? left = mid + 1
? ? ? ? # 此時(shí)目標(biāo)值在中間值左邊,更新右位置
? ? ? ? elif ordered_list[mid] > target_value:
? ? ? ? ? ? right = mid - 1
? ? # 搜索結(jié)束沒有找到
? ? return "Not find"

3、C++實(shí)現(xiàn)

int binarySearch(int *orderedData, int dataLength, int targetValue) {
?? ?int left = 0;
?? ?int right = dataLength - 1;
?? ?int mid;
?? ?// 終止條件
?? ?while (left<=right)
?? ?{
?? ??? ?// 中間位置計(jì)算
?? ??? ?mid = (left + right) / 2;
?? ??? ?if (*(orderedData + mid) == targetValue) {
?? ??? ??? ?return mid;
?? ??? ?}
?? ??? ?// 目標(biāo)值在中間值右邊,更新左位置
?? ??? ?else if (*(orderedData + mid) < targetValue){
?? ??? ??? ?left = mid + 1;
?? ??? ?}
?? ??? ?// 目標(biāo)值在中間值左邊,更新右位置
?? ??? ?else
?? ??? ?{
?? ??? ??? ?right = mid - 1;
?? ??? ?}
?? ?}
?? ?// 搜索不到,返回-1
?? ?return -1;
}

到此這篇關(guān)于c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c++與python實(shí)現(xiàn)二分查找內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt使用Matlab函數(shù)的詳細(xì)步驟

    Qt使用Matlab函數(shù)的詳細(xì)步驟

    由于項(xiàng)目需要,需要調(diào)用現(xiàn)有的matlab程序,下面這篇文章主要給大家介紹了關(guān)于Qt使用Matlab函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • c++隱式類型轉(zhuǎn)換存在的問題解析

    c++隱式類型轉(zhuǎn)換存在的問題解析

    隱式轉(zhuǎn)換,是指不需要用戶干預(yù),編譯器私下進(jìn)行的類型轉(zhuǎn)換行為,很多時(shí)候用戶都不知道具體進(jìn)行了哪些轉(zhuǎn)換,這篇文章主要介紹了c++隱式類型轉(zhuǎn)換存在的陷阱,需要的朋友可以參考下
    2022-03-03
  • 哈夫曼算法構(gòu)造代碼

    哈夫曼算法構(gòu)造代碼

    這篇文章主要介紹了哈夫曼算法構(gòu)造代碼,有需要的朋友可以參考一下
    2013-12-12
  • C語言中關(guān)于sizeof 和 strlen的區(qū)別分析

    C語言中關(guān)于sizeof 和 strlen的區(qū)別分析

    本文通過示例簡單分析了4種情況下C語言中sizeof 和 strlen的區(qū)別,算是個(gè)人經(jīng)驗(yàn)的一個(gè)小小的總結(jié),如有遺漏還請大家告知。
    2015-02-02
  • 淺談C++的幾種從鍵盤輸入方式

    淺談C++的幾種從鍵盤輸入方式

    今天小編就為大家分享一篇淺談C++的幾種從鍵盤輸入方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++17使用std::optional表示可能存在的值

    C++17使用std::optional表示可能存在的值

    本文主要介紹了C++17使用std::optional表示可能存在的值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)銀行模擬

    C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)銀行模擬

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)銀行模擬的相關(guān)資料,通過此文希望大家能理解離散化的方法,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

    C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

    這篇文章主要介紹了C++實(shí)現(xiàn)四叉樹效果(附源碼下載),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • C語言之快速排序案例詳解

    C語言之快速排序案例詳解

    這篇文章主要介紹了C語言之快速排序案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?多繼承詳情介紹

    C++?多繼承詳情介紹

    這篇文章主要介紹了C++?多繼承詳情,C++支持多繼承,即允許一個(gè)類同時(shí)繼承多個(gè)類。只有C++等少數(shù)語言支持多繼承,下面我們就來看看具體的多繼承介紹吧,需要的朋友可以參考一下
    2022-03-03

最新評論

革吉县| 秀山| 新晃| 白朗县| 建湖县| 江口县| 赫章县| 宁德市| 北川| 江都市| 滁州市| 开平市| 永安市| 丹阳市| 锡林浩特市| 神池县| 通化县| 青河县| 福州市| 德格县| 定陶县| 黄石市| 五华县| 东安县| 台江县| 怀化市| 永城市| 桂平市| 禄丰县| 红河县| 南木林县| 阿克苏市| 辽源市| 西盟| 平凉市| 肃南| 汉沽区| 吐鲁番市| 巴彦县| 新绛县| 湖南省|