1. 程式人生 > >[整理]二分查詢搜尋演算法原理及遞迴,迭代方法實現

[整理]二分查詢搜尋演算法原理及遞迴,迭代方法實現

折半查詢法也稱為二分查詢法,它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用O(log n)完成搜尋任務。

【基本思想】

將n個元素分成個數大致相同的兩半,取a[n/2]與欲查詢的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],則我們只要在陣列a的左半部繼續搜尋x(這裡假設陣列元素呈升序排列)。如果x>a[n/2],則我們只要在陣列a的右半部繼續搜尋x。

二分搜尋法的應用極其廣泛,而且它的思想易於理解。第一個二分搜尋演算法早在1946 年就出現了,但是第一個完全正確的二分搜尋演算法直到1962年才出現。Bentley在他的著作《Writing Correct Programs》中寫道,90%的計算機專家不能在2小時內寫出完全正確的二分搜尋演算法。問題的關鍵在於準確地制定各次查詢範圍的邊界以及終止條件的確定,正確地歸納奇偶數的各種情況,其實整理後可以發現它的具體演算法是很直觀的。

C# 描述

一: 經典二分查詢演算法

二:遞迴實現(Recuition)

三:迭代實現(Iteration) 

以上就是三種實現二分查詢演算法的程式原始碼

詳情可參考:http://blog.minidx.com/2008/02/03/468.html

以下是二分查找出關鍵字key 的位置的函式

C#

當確定key在一個有序陣列中的位置的時候

例如

有序陣列 int[] array = new int[6] { 13, 27, 38, 65, 76, 97 };

若key = 1,13,  得到結果是0

若key=  15,27,得到的結果是1

若key = 77,80,得到的結果是5

若key = 97,100,得到的結果是6

這個函式在二分查詢插入排序的時候很有用(自認為),當然此方法也可以寫成遞迴或者迭代的方式,原理根二分查詢一樣的.

在以上的程式碼中有一個"經典"的Bug:就是 程式碼:

middle = (low + high) / 2

當high的值接近2 ^ 31 - 1 的時候

那麼middle 就有可能溢位

所以可以改成如下:

middle = low + ((high - low) / 2);或
middle = (low + high) >>> 1;

相關推薦

[整理]二分查詢搜尋演算法原理,方法實現

折半查詢法也稱為二分查詢法,它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用O(log n)完成搜尋任務。 【基本思想】 將n個元素分成個數大致相同的兩半,取a[n/2]與欲查詢的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],

二分K均值演算法原理Spark MLlib呼叫例項(Scala/Java/Python)

二分K均值演算法 演算法介紹: 二分K均值演算法是一種層次聚類演算法,使用自頂向下的逼近:所有的觀察值開始是一個簇,遞迴地向下一個層級分裂。分裂依據為選擇能最大程度降低聚類代價函式(也就是誤差平方和)的簇劃分為兩個簇。以此進行下去,直到簇的數目等於使用者給定的數目k為止。二

二分查詢法的迴圈與實現時間複雜度分析

設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。 迴圈實現二分法程式碼: #include <iostream> using namespace std; int binary_search(int *array,int low ,int hi

二分查詢、快速排序、呼叫的分析

常見的基礎演算法,相信大家見過很多。接下來我來分析下二分查詢、和快速排序演算法。 二分查詢: 前提是在已經排好序的陣列中,通過查詢的元素與中間元素索引值對應的元素進行比較,若大於中間索引值的元素,則向陣列右半部分查詢元素。依次類推,直到找到為止;找不到就返回一個負數; 二分查詢的時間複雜

模擬退火演算法原理求解TSP問題的Java實現

轉載請註明出處: 原理 退火的物理含義概述 模擬退火演算法來源於固體退火原理,在熱力學上,退火(annealing)現象指物體逐漸降溫的物理現象,溫度愈低,物體的能量狀態會低;夠低後,液體開始冷凝與結晶,在結晶狀態時,系統的能量狀態最低。大自然在緩慢降

演算法 動態規劃 斐波那契數列 MD

Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱 MyAndroidBlogs baiqiantao bai

leetcode589-二叉樹-

題目:N-ary Tree Preorder Traversal前序遍歷N叉樹 遞迴解法 就是迴圈呼叫preorder函式來實現遞迴,程式碼: class Solution(object): #遞迴解法 def preorder(self, root):

java使用實現流程圖展示(僅供參考)

本人在做專案的時候不確定流程圖展示的節點下是否還有子節點,所以才採用遞迴方式進行迴圈判斷。 1、實體類model package com.ijs.model; import java.util.List; import javax.persistence.Entity

通過去除=的base64解碼函式

base64的解碼過程中如果byte不滿足轉碼要求的話例如(二進位制資料長度需要為4的倍數),不滿足的話就要通過在資料後面補‘=’,把資料補到是4的倍數,然而‘=’是沒有任何含義的,如果我們在輸入的時候可以不考慮輸入‘=’,這就大大方便了輸入,沒有了那麼多的限制

MySQL索引演算法原理查詢優化

前言 MySQL憑藉著出色的效能、低廉的成本、豐富的資源,已經成為絕大多數網際網路公司的首選關係型資料庫。雖然效能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程師的必修課,我們經常會從職位描述上看到諸如“精通MySQL”、“SQL語句優化”、“瞭解資料庫

[機器學習]機器學習筆記整理08- SVM演算法原理實現

<html> 1 背景 最早是由 Vladimir N. Vapnik 和 Alexey Ya. Chervonenkis 在1963年提出 目前的版本(so

演算法學習】AVL平衡二叉搜尋原理各項操作程式設計實現(C++)

AVLTree即(Adelson-Velskii-Landis Tree),是加了額外條件的二叉搜尋樹。其平衡條件的建立是為了確保整棵樹的深度為O(nLogn)。平衡條件是任何節點的左右子樹的高度相差不超過1. 在下面的程式碼中,程式設計實現了AVL樹的建立、查詢、插入、

Java實現陣列二分查詢二分查詢

public void binarySearch(int value){ int low = 0; int upper = nElements - 1; int currtIn = (low+u

快速排序演算法原理java實現

快速排序 對氣泡排序的一種改進,若初始記錄序列按關鍵字有序或基本有序,蛻化為氣泡排序。使用的是遞迴原理,在所有同數量級O(n longn) 的排序方法中,其平均效能最好。就平均時間而言,是目前被認為最好的一種內部排序方法基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部

Canny邊緣檢測演算法原理C語言實現詳解

Canny運算元是John Canny在1986年提出的,那年老大爺才28歲,該文章發表在PAMI頂級期刊上的(1986. A computational approach to edge detection. IEEE Transactions on Pattern Analy

加密演算法原理DNS服務原理

1、簡述常見加密演算法及常見加密演算法原理,最好使用圖例解說在安全領域,利用金鑰加密演算法來對通訊的過程進行加密是一種常見的安全手段。利用該手段能夠保障資料安全通訊的三個目標 1、資料的保密性,防止使用者的資料被竊取或洩露; 2、保證資料的完整性,防止使用者傳輸的資料被篡改; 3、通

【機器學習】Apriori演算法——原理程式碼實現(Python版)

Apriopri演算法 Apriori演算法在資料探勘中應用較為廣泛,常用來挖掘屬性與結果之間的相關程度。對於這種尋找資料內部關聯關係的做法,我們稱之為:關聯分析或者關聯規則學習。而Apriori演算法就是其中非常著名的演算法之一。關聯分析,主要是通過演算法在大規模資料集中尋找頻繁項集和關聯規則。

SVM演算法原理Python實現

Svm(support Vector Mac)又稱為支援向量機,是一種二分類的模型。當然如果進行修改之後也是可以用於多類別問題的分類。支援向量機可以分為線性核非線性兩大類。其主要思想為找到空間中的一個更夠將所有資料樣本劃開的超平面,並且使得本本集中所有資料到這個超平面的距離最

Bandit演算法原理Python實戰

目錄 1)什麼是Bandit演算法 為選擇而生。 Bandit演算法與推薦系統 怎麼選擇Bandit演算法? 2)常用Bandit演算法 Thompson sampling演算法 UCB演算法 Epsilon-Greedy演算法 Greedy演算法 3)B

adaboost演算法原理sklearn中使用辦法

  轉自https://www.cnblogs.com/pinard/p/6136914.html,感謝作者 在整合學習原理小結中,我們講到了整合學習按照個體學習器之間是否存在依賴關係可以分為兩類,第一個是個體學習器之間存在強依賴關係,另一類是個體學習器之間不存在強