1. 程式人生 > >正確理解及二分查詢

正確理解及二分查詢

二分查詢

二分查詢也稱折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。
二分查詢想必大家都不陌生,很多程式的實現都會用到這種演算法,在這裡是想改正自己之前對二分查詢的一些不正確的理解。
請看下面的程式碼:
、、、
(1)
//#include<stdio.h>
int find(int arr[], int a,int r)
{
int le = 0;
while (le <= r)
{
int mid = (le + r) / 2;
if (arr[mid] > a)
{
r = mid–;//
}
else if (arr[mid] < a)
{
le = mid++;
}
else
{
return mid;//找到了
}
}
return -1;//沒找到
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int le = 0;
int r = sizeof(arr)/sizeof(arr[0])-1;//
int i=find(arr, 2, r);
return 0;
}
這段程式碼是我自己寫的,在一個是陣列中查詢整數2,結果正確
、、、
(2)


#include<stdio.h>
int find(int arr[], int a,int r)
{
int le = 0;
while (le <r)
{
int mid = (le + r) / 2;
if (arr[mid] > a)
{
r = mid;//
}
else if (arr[mid] < a)
{
le = mid++;
}
else
{
return mid;//找到了
}
}
return -1;//沒找到
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int le = 0;
int r = sizeof(arr)/sizeof(arr[0]);//
int i=find(arr, 2, r);
return 0;
}
這段是改正過後的,執行沒有問題,仔細觀察兩端程式碼,發現有略微不同,雖然結果相同,但是第一段程式碼從邏輯上是講不通的,通俗的將第一段程式碼能執行成功是一種巧合,而第二段是完全符合邏輯的,
、、、、
二分查詢常見的一些錯誤有越界訪問,和資料的遺漏。導致這些問題的原因就在於對查詢的區間邊界的閉合狀態的。
通常二分查詢的區間限定為左閉右開,whlie迴圈判斷條件設為左<右,這樣就防止了越界,不對右變數做——
操作,就防止了資料遺漏的問題。

相關推薦

正確理解二分查詢

二分查詢 二分查詢也稱折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。 二分查詢想必大家都不陌生,很多程式的實現都會用到這種演算法,在這裡是想改正自己之前對二分查詢的一些不正確的理解。 請看下面的

javascript常用陣列排序二分查詢

1. 氣泡排序 基本思路:依次比較相鄰的兩個數的大小,若大數在前、小數在後,則交換兩個數的位置,依次比較直至全部資料從小到大排好序 function sort_bubble(arr) { var len = arr.length; for (var i = 0;

折半查詢演算法二分查詢函式猜數字遊戲實現

折半查詢演算法 #include<stdio.h> int main() {     int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };     int left = 0;     int right = siz

列表查詢二分查詢 列表查詢以及二分查詢

列表查詢以及二分查詢 一、列表查詢 1、列表查詢:從列表中查詢指定元素 輸入:列表、待查詢元素 輸出:元素下標或未查詢到元素 2、順序查詢:從列表第一個元素開始,順序進行搜尋,直到找到為止。返回找到的那個索引 3、二分查詢:從有序列表

常見幾個排序原始碼二分查詢原始碼

void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } //不使用中間變數的swap函式  void swap_novar(int &a, int &b) { if (a

如何寫出正確二分查詢?——利用迴圈不變式理解二分查詢及其變體的正確性以及構造方式

序言   本文以經典的二分查詢為例,介紹如何使用迴圈不變式來理解演算法並利用迴圈不變式在原始演算法的基礎上根據需要產生演算法的變體。謹以本文獻給在理解演算法思路時沒有頭緒而又不甘心於死記硬背的人。   二分查詢究竟有多重要?《程式設計之美》第2.16節的最長遞增子序列

二分法思想的理解 結對編程情況匯報

匯報 實踐 選擇題 輔助 解題思維 log 成了 需要 迷茫 一、對二分法思想的理解 1.特點:又稱為折半算法,是分治策略的一個典型例子。主要是用於:在已排好序的n個元素組成的數組a[0:n-1]中,找出一個特定的元素x。 2.基本思想:(1)將n個元素分成個數大致相同相同

二分算法的理解結對編程情況

思維 urn 相同 clu cout 一個 mes size 指定 一、對二分算法理解 二分算法,又稱折半算法,是應用分治策略的典型例子。二分查找主要對有序序列進行對所指定數字的查找,通過不斷縮小搜查範圍,在比較中間的數後對左右兩個數組進行相同操作,以得到最終的帶查找數字。

二分思想的理解結對編程

arc 分治策略 == con 出現問題 情況 數組 策略 討論 一、對二分法思想的體會 1.二分法是運用分治策略的典型例子,也稱折半查找,充分利用了元素間的次序關系,是一種效率較高的查找方法。實現二分算法有遞歸和非遞歸兩種方式。 2.基本思想:將n個元素分成大致相同的兩半

二分法的理解組隊程式設計情況

對二分法的理解及組隊程式設計情況 一:對二分法的理解 1:關於二分法:二分法是一種典型的查詢演算法,是必須掌握的查詢方法之一;是運用分治策略的典型例子,也稱折半查詢,其時間複雜度為O(logN),是效率較高的一種查詢方法。 2:使用條件:儲存在陣列中的有序序列。 3:基本思想:(以非降序排序為例)將n

對標準庫stdlib.h中二分查詢理解

前幾天面試的時候遇到了這個問題 ,標準庫下提供的二分查詢改錯,當時沒有改出來,寫得不好,回來查了下,這個函式的原型是: /* bsearch() and qsort() are declared both here, in <stdlib.h>, and in * non-AN

輕鬆理解-中高階java開發必知必會 之 二分查詢

二分查詢也叫折半查詢,二分查詢就是將查詢的鍵和子陣列的中間鍵作比較,如果被查詢的鍵小於中間鍵,就在左子陣列繼續查詢;如果大於中間鍵,就在右子陣列中查詢,否則中間鍵就是要找的元素 但是這個查詢必須要求陣列中的數字是有順序性的其實還有很多關於這個二分查詢的變種演算法,可以自行拓展下。 而且此演算法在

二分演算法的理解結對程式設計情況

一、對二分演算法理解 二分演算法,又稱折半演算法,是應用分治策略的典型例子。二分查詢主要對有序序列進行對所指定數字的查詢,通過不斷縮小搜查範圍,在比較中間的數後對左右兩個陣列進行相同操作,以得到最終的帶查詢數字。時間複雜度logn,對陣列較大時能顯著提高程式效率。 二、演算法程式碼 #include &

二分法思想的理解 結對程式設計情況彙報

一、對二分法思想的理解 1.特點:又稱為折半演算法,是分治策略的一個典型例子。主要是用於:在已排好序的n個元素組成的陣列a[0:n-1]中,找出一個特定的元素x。 2.基本思想:(1)將n個元素分成個數大致相同相同的兩半,然後取a[n/2]與x作比較。       (2)如果x = a[n/2],則已找

Java之陣列排序二分查詢

首先先介紹兩種最基本的陣列排序方法:冒泡法和選擇法。 冒泡法排序:依次比較相鄰的兩個元素,如果第一個比第二個大,則交換他們兩個,如此一輪比較下來會產生一個最大的數位於陣列末尾,第二次比較則進行到陣列長度-1個元素,以此類推。 /** *

python中的冒泡、快速、堆排序二分查詢

    氣泡排序 它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。 第一種 def bubble_sort(

二分查詢(折半查詢)演算法(原理、實現時間複雜度)

查詢也是有特殊情況的,比如數列本身是有序的。這個有序數列是怎麼產生的呢?有時它可能本身就是有序的,也有可能是我們通過之前所學的排序演算法得到的。 不管怎麼說,我們現在已經得到了有序數列了並需要查詢。這時二分查詢該出場了。 二分查詢(Binary Search)也叫作折半查詢。二分查詢有兩個要求,一個是數列

深入理解二分查詢(二、二分答案)

二分答案     如果已知候選答案的範圍[min,max],有時候我們不必通過計算得到答案,只需在此範圍內應用“二分”的過程,逐漸靠近答案(最後,得到答案)! 一、何時可以使用“二分答案”     不是任何題目都適合使用“二分答案”的,我Sam觀察到一般有以下的一

程式設計師程式設計藝術-----第二十五章-----二分查詢實現(Jon Bentley:90%程式設計師無法正確實現)

第二十五章:二分查詢實現(Jon Bentley:90%程式設計師無法正確實現)作者:July出處:結構之法演算法之道引言    Jon Bentley:90%以上的程式設計師無法正確無誤的寫出二分查詢程式碼。也許很多人都早已聽說過這句話,但我還是想引用《程式設計珠璣》上的如下幾段文字:  “二分查詢可以解決

二分查詢演算法寫正確需要注意的地方

今天再次解決一個需要使用二分查詢的問題,再一次的,我又沒有一次過寫對.(為什麼我說"又"?)抓狂了,似乎開始有一些"二分查詢恐懼症".為了以後能夠一次將這個基本的演算法寫對,我決定再仔細研究一下.我之前有寫過一個二分查詢的演算法,在這裡,這一次再以這個問題為例來說明.我今早寫下的錯誤程式碼類似於下面的