資料結構與演算法:二分查詢
資料結構與演算法:二分查詢
最近看到一本關於資料結構的書,甚是有趣,稍以記載,方便以後回憶!
一、二分查詢
假設要在電話簿中找一個名字以K打頭的人,(現在誰還用電話簿!)可以從頭開始翻頁,直到進入以K打頭的部分。但你很可能不這樣做,而是從中間開始,因為你知道以K打頭的名字在電話簿中間。這是一個查詢問題,在前述所有情況下,都可使用同一種演算法來解決問題,這種演算法就是二分查詢。
二分查詢是一種演算法,其輸入是一個有序的元素列表(必須有序的原因稍後解釋)。如果要查詢的元素包含在列表中,二分查詢返回其位置;否則返回null。
舉個例子
**這是簡單查詢,更準確的說法是傻找。每次猜測都只能排除一個數字。如果我想的數字是99,你得猜99次才能猜到!
更佳的查詢方法:**
僅當列表是有序的時候,二分查詢才管用。例如,電話簿中的名字是按字母順序排列的,
因此可以使用二分查詢來查詢名字。
其實,以上關於二分法的最大次數可以用資訊熵來計算和理解,下一節講時間複雜度時細講
相關推薦
資料結構與演算法:二分查詢
資料結構與演算法:二分查詢 最近看到一本關於資料結構的書,甚是有趣,稍以記載,方便以後回憶! 一、二分查詢 假設要在電話簿中找一個名字以K打頭的人,(現在誰還用電話簿!)可以從頭開始翻頁,直到進入以K打頭的部分。但你很可能不這樣做,而是從中間開始,因為你知道以K打頭的名字在電話簿中間
資料結構與演算法學習--二分查詢
二分查詢(Binary Search)演算法,也叫折半查詢演算法。二分查詢針對的時一個有序的資料集合,查詢思想有點類似於分治。每次都是通過和區間的中間元素進行比較,將待查區縮小為原來的一半,直到將元素找到或者區間縮小為0。 我們可以通過2種方式實現:遞迴和非遞迴。 /**********
修煉內功---資料結構與演算法14---二分法查詢
所謂二分查詢,針對的是一個有序的資料集合(這點很重要),查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 0。注意到二分查詢針對的必須是已經排序過的有序陣列,否則不能使用該演算法。 <?php functio
資料結構與演算法 (一) 折半查詢/二分查詢
1.演算法原理: 折半查詢用於線上性表中查詢結點時 首先直到表的中間結點,將其關鍵碼與給定的要找的值進行比較,若相等,則查詢成功,若當前結點的關鍵碼大於要找的值,則繼續在表的前半部分進行折半查詢,否則繼續在表的後半部分進行折半查
資料結構與演算法:查詢演算法
查詢演算法 查詢( Search)是指從一批記錄中找出滿足指定條件的某一記錄的過程,查詢又稱為檢索。查詢演算法廣泛應用於各類應用程式中。因此,一個有效的查詢演算法往往可以大大提高程式的執行效率。在實際應用中,資料的型別千變萬化,每條資料項往往包含多個數據域。但是,在執行查詢操作時,往往只是指定一個或幾個域的值
資料結構與演算法:常用排序演算法總結
排序演算法穩定性的簡單形式化定義為:如果Ai = Aj,排序前Ai在Aj之前,排序後Ai還在Aj之前,則稱這種排序演算法是穩定的。通俗地講就是保證排序前後兩個相等的數的相對順序不變。 對於不穩定的排序演算法,只要舉出一個例項,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算
資料結構與演算法:B+樹(B+Tree)介紹及其與B樹比較
定義 前面介紹了B樹及其基本操作,B+樹是B樹的一個變種。與B樹一樣,B+樹通常用於諸如資料庫和磁碟檔案系統等輔助儲存系統,輔助儲存系統一般容量大,但是資料存取速度比記憶體慢幾個數量級。B樹和B+樹結構減少輔存系統訪問次數,從而加快整體資料存取速度。兩者有一些共
資料結構與演算法:B樹(B-Tree)定義及搜尋、插入、刪除基本操作
B樹(B-Tree) 在介紹什麼是B樹(B-Tree)之前,先看看為什麼存在B樹結構? B樹(B-Tree)是為磁碟或者其他輔助儲存裝置而設計的一種平衡搜尋樹,如有的資料庫系統使用B樹或者B樹的變種來儲存資訊。B樹的節點可以有很多孩子,從數個到數千個,不同於一
修煉內功---資料結構與演算法16---二分法變形2
在給定排序序列中查詢第一個大於等於給定值的元素 所不同的是判斷節點不一樣了,我們之前的需求都是查詢等於給定值 現在變成了大於等於給定值,所以我們要在 $nums[$mid] >= $num 這個判斷條件上做文章 思路還是和之前兩個變形版本類似 當 $mid 已經是最左邊的元素,
修煉內功---資料結構與演算法15---二分法變形1
除了正常的二分查詢,還有很多二分查詢的變形版本 符合標準的二分查詢條件的序列一般是比較理想的情況,如果要查詢的元素在序列中有多個怎麼辦? 在一個給定排序序列中查詢第一個等於給定值的元素 其實關鍵節點就在於在序列中找到值等於待查詢元素值時的處理 如果此時 $mid 位置已經到了序列的最
資料結構與演算法:關於野人過河問題的課程設計
野人過河問題 【問題描述】 有x個野人和y個傳教士來到河邊渡河,河岸有一條船,每次至多可供2人乘渡,野人和傳教士都會划船。在河岸,如果野人人數多於傳教士人數,則野人會吃掉傳教士。請設計一個程式來描述安全過河過程。 【基本要求】 (1)在河兩岸和船上要求野人的人數不大於傳教士的人數。 (2)要
資料結構與演算法: 快速排序
void quickSort(vector<int> &arra, int L, int R) { int *p; p = partition2(arra, L, R); cout << p[0] <<
資料結構與演算法: 排序1
1 氣泡排序 2 選擇排序 3 插入排序 #include <iostream> #include <vector> using namespace std; class Solution { public: //氣泡
資料結構與演算法:二叉樹
二叉樹是一種非常常見並且實用的資料結構,它結合了有序陣列與連結串列的優點。在二叉樹中查詢資料與在陣列中查詢資料一樣快,在二叉樹中新增、刪除資料的速度也和在連結串列中一樣高效,所以有關二叉樹的相關技術一直是程式設計師面試筆試中必考的知識點。 基礎知識 二叉樹(Bi
資料結構與演算法-二叉查詢樹平衡(DSW)
上一節探討了二叉查詢樹的基本操作,二叉查詢樹的查詢效率在理想狀態下是O(lgn),使用該樹進行查詢總是比連結串列快得多。但是,該論點並不總是正確,因為查詢效率和二叉樹的形狀息息相關。就像這樣: 圖1-1給出了3顆二叉查詢樹,它們儲存著相同的資料,但很明顯,圖1-1(A)的樹是最好的。在最壞的情況下,圖A定
資料結構與演算法:快速排序
快速排序 快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行
資料結構與演算法 :插入排序
插入排序 插入排序(英語:Insertion Sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
資料結構與演算法 :選擇排序
選擇排序 選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 選擇排序
資料結構與演算法 :氣泡排序
氣泡排序 氣泡排序(英語:Bubble Sort)是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”
資料結構與演算法:時間複雜度與大O表示法
1、概念: 我們知道,時間複雜度和“大O表示法”是我們經常會碰到的概念,它們是用來衡量演算法優劣的度量,那具體怎麼算的呢?來看一下 2、引例 在丟擲概念之前,咱先來個例子: 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為自然數),如何求出所有a、b