fbpx
维基百科

二分搜尋演算法

计算机科学中,二分查找算法(英語:binary search algorithm),也称折半搜索算法(英語:half-interval search algorithm[1]对数搜索算法(英語:logarithmic search algorithm[2],是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

二分搜尋演算法
概况
類別搜索算法
資料結構数组
复杂度
平均時間複雜度
最坏时间复杂度
最优时间复杂度
空間複雜度迭代:
递归:
(无尾调用消除)
最佳解Yes
相关变量的定义

二分查找算法在最坏情况英语Best, worst and average case下是对数时间复杂度的,需要进行次比较操作(在此处是数组的元素数量,大O记号对数)。二分查找算法使用常数空间,对于任何大小的输入数据,算法使用的空间都是一样的。除非输入数据数量很少,否则二分查找算法比线性搜索更快,但数组必须事先被排序。尽管一些特定的、为了快速搜索而设计的数据结构更有效(比如哈希表),二分查找算法应用面更广。

二分查找算法有许多种变种。比如分散层叠英语fractional casacading可以提升在多个数组中对同一个数值的搜索的速度。分散层叠有效的解决了计算几何学和其他领域的许多搜索问题。指数搜索英语Exponential search将二分查找算法拓宽到无边界的列表。二叉搜索树B树数据结构就是基于二分查找算法的。

演算法 编辑

二分搜索只对有序数组有效。二分搜索先比较数组中位元素和目标值。如果目标值与中位元素相等,则返回其在数组中的位置;如果目标值小于中位元素,则搜索继续在前半部分的数组中进行。如果目标值大于中位元素,则搜索继续在数组上部分进行。由此,算法每次排除掉至少一半的待查数组。

步驟 编辑

給予一個包含 個帶值元素的陣列 或是記錄 ,使 ,以及目標值 ,還有下列用來搜尋  中位置的子程式[3]

  1.     
  2. 如果 ,則搜尋以失敗告終。
  3.  (中間值元素)為 。(具体实现中,为防止算術溢出,一般采用 代替。)
  4. 如果 ,令  並回到步驟二。
  5. 如果 ,令  並回到步驟二。
  6.  ,搜尋結束;回傳值 

這個疊代步驟會持續透過兩個變數追蹤搜索的邊界。有些實際應用會在演算法的最後放入相等比較,讓比較迴圈更快,但平均而言會多一層疊代[4]

大致匹配 编辑

以上程序只適用於完全匹配,也就是尋找一個目標值的位置。不過,因為有序陣列的順序性,將二分搜索算法擴展到能適用大致匹配並不是很重要。舉例來說,二分搜索算法可以用來計算一個賦值的排名(或稱,比它更小的元素的數量)、前趨(下一個最小元素)、後繼(下一個最大元素)以及最近鄰。搜尋兩個值之間的元素數目的範圍查詢英语Range query (data structures)可以藉由兩個排名查詢(又稱秩查詢)來執行[5]

  • 排名查詢可以使用調整版的二分搜索來執行。藉由在成功的搜索回傳 ,以及在失敗的搜索回傳 ,就會取而代之地回傳了比起目標值小的元素數目[5]
  • 前趨和後繼查詢可以藉由排名查詢來執行。一旦知道目標值的排名,其前趨就會是那個位於其排名位置的元素,或者排名位置的上一个元素(因為它是小於目標值的最大元素)。其後繼是(陣列中的)下一個元素,或是(非陣列中的)前趨的下一個元素[6]。目標值的最近鄰可能是前趨或後繼,取決於何者較為接近。
  • 範圍查詢也是直接了當的。一旦知道兩個值的排名,不小於第一個值且小於第二個值的元素數量就會是兩者排名的差。這個值可以根據範圍的端點是否算在範圍內,或是陣列是否包含其端點的對應鍵來增加或減少1[7]

复杂度分析 编辑

时间复杂度
折半搜索每次把搜索区域减少一半,时间复杂度为 。(n代表集合中元素的个数)
空间复杂度
 。虽以递归形式定义,但是尾递归,可改写为循环。

应用 编辑

除直接在一个数组中查找元素外,可用在插入排序中。

示例代码 编辑

C 版本- 递归 编辑

int binary_search(const int arr[], int start, int end, int key) {  if (start > end)  return -1;  int mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法  if (arr[mid] > key)  return binary_search(arr, start, mid - 1, key);  else if (arr[mid] < key)  return binary_search(arr, mid + 1, end, key);  else  return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於 } 

C 版本- while 循环 编辑

int binary_search(const int arr[], int start, int end, int key) {  int ret = -1; // 未搜索到数据返回-1下标    int mid;  while (start <= end) {  mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法  if (arr[mid] < key)  start = mid + 1;  else if (arr[mid] > key)  end = mid - 1;  else { // 最後檢測相等是因為多數搜尋狀況不是大於要不就小於  ret = mid;   break;  }  }    return ret; // 单一出口 } 

javascript 版本 编辑

var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15, 19, 20]; const binarySearch = (arr, target) => {  const search = (start, end) => {  if (start > end) return -1;  const mid = start + Math.floor((end - start) / 2);  if (arr[mid] > target) {  return search(0, mid - 1);  } else if (arr[mid] < target) {  return search(mid + 1, end);  } else {  return mid;  }  }  return search(0, arr.length - 1); } console.log( binarySearch(arr, 4) ); 

Python3 版本 while 循环 编辑

def binary_search(arr, left, right, key): while left <= right: mid = left + (right - left) // 2 if arr[mid] == key: return mid elif arr[mid] < key: left = mid + 1 elif arr[mid] > key: right = mid - 1 return -1 

Python3 版本 递归 编辑

def binary_search(arr, start, end, key): if start > end: return -1 mid = start + (end - start) // 2 if arr[mid] > key: return binary_search(arr, start, mid - 1, key) if arr[mid] < key: return binary_search(arr, mid + 1, end, key) return mid 

C# 版本 编辑

static int binary_search(int[] arr, int start, int end, int key) {  int mid;  while (start <= end)  {  mid = (start + end) / 2;  if (arr[mid] < key)  start = mid + 1;  else if (arr[mid] > key)  end = mid - 1;  else  return mid;   }  return -1; } 

Swift 版本 编辑

import Foundation /// 二分搜索完全匹配 /// /// - Parameters: /// - arr: 有序数组 /// - start: 起始位置 /// - end: 结束点 /// - key: 特点目标值 /// - Returns: 返回查找结果 func binarySearch(arr: [Int], start: Int, end: Int, key: Int) -> Int? { if start > end { return nil } let mid = start + (end - start) / 2 if arr[mid] > key { return binarySearch(arr: arr, start: start, end: mid - 1, key: key) } else if arr[mid] < key { return binarySearch(arr: arr, start: mid + 1, end: end, key: key) } else { return mid } } 

golang 递归版本 编辑

func binary_search(arr []int, low, high, key int) int {  if low > high {  return -1  }  mid := low + (high-low)/2  if arr[mid] > key {  return binary_search(arr, low, mid-1, key)  } else if arr[mid] < key {  return binary_search(arr, mid+1, high, key)  }  return mid } 

golang 非递归版本 编辑

func binarySearch(arr []int, key int) int {  low, high := 0, len(arr)-1  for low <= high {  mid := low + (high-low)/2  if arr[mid] == key {  return mid  } else if key < arr[mid] {  high = mid - 1  } else if key > arr[mid] {  low = mid + 1  }  }  return -1 } 

Java 递归 编辑

public static int binarySearch(int[] arr, int start, int end, int key){  if (start > end)  return -1;  int mid = start + (end - start)/2; //防止溢位  if (arr[mid] > key)  return binarySearch(arr, start, mid - 1, key);  if (arr[mid] < key)  return binarySearch(arr, mid + 1, end, key);  return mid;  } 

Java while 循环 编辑

public static int binarySearch(int[] arr, int start, int end, int key){  int result = -1;  while (start <= end){  int mid = start + (end - start)/2; //防止溢位  if (arr[mid] > key)  end = mid - 1;  else if (arr[mid] < key)  start = mid + 1;  else {  result = mid ;   break;  }  }  return result; } 

Julia版本 编辑

# Julia Sample : BinarySearch function BinarySearch(A,Key)  left,right = 1,length(A)  while(left<=right)  mid=left+floor(Int,((right-left)/2))    if A[mid]==Key  return mid  elseif Key<A[mid]  right = mid-1  elseif Key>A[mid]  left = mid+1  end  end  return -1 end # Main Code A = [1,3,16,31,43,354,586] # Already Arrange println(A) # Original Array println(BinarySearch(A,43)) # BinarySearch Search Array println(BinarySearch(A,354)) # BinarySearch Search Array println(BinarySearch(A,3)) # BinarySearch Search Array 

历史 编辑

在1946年,约翰·莫奇利摩尔学院讲座英语Moore School Lectures上第一次提出二分搜索的概念。[8]1957年,威廉·皮特逊英语William Wesley Peterson发表了第一个应用插值搜索的算法[8][9]。在此时,每个发表的二分搜索算法只对长度为2的幂减一的数组有用。[10]直到1960年,德里克·亨利·莱默发表了一个对于所有长度的数组都适用的算法[11]。1962年,赫尔曼·博滕布鲁赫发表了一个用ALGOL 60写的二分搜索,将判断相等的步骤放到算法末尾。虽然将平均迭代次数增加一,但是每次迭代中的比较次数减少了1次。[12]均匀二分搜索则是史丹佛大學的A. K.钱德拉在1971年发明的[8]。1986年,伯纳德·查泽尔和列奥尼达斯·吉巴斯引入了分散层叠来解决计算几何中大量存在的搜索问题[13][14][15]

实现中的问题 编辑

尽管二分查找的基本思想相对简单,但细节可以令人難以招架 ... — 高德纳[2]

当乔恩·本特利将二分搜索问题布置给专业编程课的学生时,百分之90的学生在花费数小时后还是无法给出正确的解答,主要因为这些错误程序在面对边界值的时候无法运行,或返回错误结果。[16]1988年开展的一项研究显示,20本教科书里只有5本正确实现了二分搜索。[17]不仅如此,本特利自己1986年出版的《编程珠玑》一书中的二分搜索算法存在整数溢出的问题,二十多年来无人发现。Java语言的库所实现的二分搜索算法中同样的溢出问题存在了九年多才被修复。[18]

参考 编辑

  1. ^ Willams, Jr., Louis F. A modification to the half-interval search (binary search) method. Proceedings of the 14th ACM Southeast Conference: 95–101. 1975. doi:10.1145/503561.503582. 
  2. ^ 2.0 2.1 Knuth 1998,§6.2.1 ("Searching an ordered table"), subsection "Binary search".
  3. ^ Knuth 1998,§6.2.1 ("Searching an ordered table"), subsection "Algorithm B".
  4. ^ Bottenbruch, Hermann. Structure and Use of ALGOL 60. Journal of the ACM. 1962, 9 (2): 161–211.  Procedure is described at p. 214 (§43), titled "Program for Binary Search".
  5. ^ 5.0 5.1 Sedgewick & Wayne 2011,§3.1, subsection "Rank and selection".
  6. ^ Goldman & Goldman 2008,第461–463頁.
  7. ^ Sedgewick & Wayne 2011,§3.1, subsection "Range queries".
  8. ^ 8.0 8.1 8.2 Knuth 1998,§6.2.1 ("Searching an ordered table"), subsection "History and bibliography".
  9. ^ Peterson, William Wesley. Addressing for random-access storage. IBM Journal of Research and Development. 1957, 1 (2): 130–146. doi:10.1147/rd.12.0130. 
  10. ^ "2n−1". OEIS A000225 (页面存档备份,存于互联网档案馆). Retrieved 7 May 2016.
  11. ^ Lehmer, Derrick. Teaching combinatorial tricks to a computer. Proceedings of Symposia in Applied Mathematics. 1960, 10: 180–181. doi:10.1090/psapm/010. 
  12. ^ Bottenbruch, Hermann. Structure and use of ALGOL 60. Journal of the ACM. 1962-04-01, 9 (2): 161–221. ISSN 0004-5411. doi:10.1145/321119.321120.  Procedure is described at p. 214 (§43), titled "Program for Binary Search".
  13. ^ Chazelle, Bernard; Liu, Ding. Lower bounds for intersection searching and fractional cascading in higher dimension. 33rd ACM Symposium on Theory of Computing. ACM: 322–329. 2001-07-06 [2018-06-30]. ISBN 978-1-58113-349-3. doi:10.1145/380752.380818. (原始内容于2018-10-29).  . [2019-10-06]. 原始内容存档于2018-10-29. 
  14. ^ Chazelle, Bernard; Guibas, Leonidas J. Fractional cascading: I. A data structuring technique (PDF). Algorithmica. 1986, 1 (1-4): 133–162 [2019-10-06]. CiteSeerX 10.1.1.117.8349 . doi:10.1007/BF01840440. (原始内容 (PDF)于2016-03-03).  (页面存档备份,存于互联网档案馆
  15. ^ Chazelle, Bernard; Guibas, Leonidas J., Fractional cascading: II. Applications (PDF), Algorithmica, 1986, 1 (1-4): 163–191 [2019-10-06], doi:10.1007/BF01840441, (原始内容 (PDF)于2016-03-04) 
  16. ^ Bentley 2000,§4.1 ("The Challenge of Binary Search").
  17. ^ Pattis, Richard E. Textbook errors in binary searching. SIGCSE Bulletin. 1988, 20: 190–194. doi:10.1145/52965.53012. 
  18. ^ Bloch, Joshua. Extra, extra – read all about it: nearly all binary searches and mergesorts are broken. Google Research Blog. 2006-06-02 [2016-04-21]. (原始内容于2016-04-01).  (页面存档备份,存于互联网档案馆

外部链接 编辑

二分搜尋演算法, 在计算机科学中, 二分查找算法, 英語, binary, search, algorithm, 也称折半搜索算法, 英語, half, interval, search, algorithm, 对数搜索算法, 英語, logarithmic, search, algorithm, 是一种在有序数组中查找某一特定元素的搜索算法, 搜索过程从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束, 如果某一特定元素大于或者小于中间元素, 则在数组大于或小于中间元素的那一半中查找, 而且. 在计算机科学中 二分查找算法 英語 binary search algorithm 也称折半搜索算法 英語 half interval search algorithm 1 对数搜索算法 英語 logarithmic search algorithm 2 是一种在有序数组中查找某一特定元素的搜索算法 搜索过程从数组的中间元素开始 如果中间元素正好是要查找的元素 则搜索过程结束 如果某一特定元素大于或者小于中间元素 则在数组大于或小于中间元素的那一半中查找 而且跟开始一样从中间元素开始比较 如果在某一步骤数组为空 则代表找不到 这种搜索算法每一次比较都使搜索范围缩小一半 二分搜尋演算法概况類別搜索算法資料結構数组复杂度平均時間複雜度O log n displaystyle O log n 最坏时间复杂度O log n displaystyle O log n 最优时间复杂度O 1 displaystyle O 1 空間複雜度迭代 O 1 displaystyle O 1 递归 O log n displaystyle O log n 无尾调用消除 最佳解Yes相关变量的定义二分查找算法在最坏情况 英语 Best worst and average case 下是对数时间复杂度的 需要进行O log n displaystyle O log n 次比较操作 n displaystyle n 在此处是数组的元素数量 O displaystyle O 是大O记号 log displaystyle log 是对数 二分查找算法使用常数空间 对于任何大小的输入数据 算法使用的空间都是一样的 除非输入数据数量很少 否则二分查找算法比线性搜索更快 但数组必须事先被排序 尽管一些特定的 为了快速搜索而设计的数据结构更有效 比如哈希表 二分查找算法应用面更广 二分查找算法有许多种变种 比如分散层叠 英语 fractional casacading 可以提升在多个数组中对同一个数值的搜索的速度 分散层叠有效的解决了计算几何学和其他领域的许多搜索问题 指数搜索 英语 Exponential search 将二分查找算法拓宽到无边界的列表 二叉搜索树和B树数据结构就是基于二分查找算法的 目录 1 演算法 1 1 步驟 1 2 大致匹配 2 复杂度分析 3 应用 4 示例代码 4 1 C 版本 递归 4 2 C 版本 while 循环 4 3 javascript 版本 4 4 Python3 版本 while 循环 4 5 Python3 版本 递归 4 6 C 版本 4 7 Swift 版本 4 8 golang 递归版本 4 9 golang 非递归版本 4 10 Java 递归 4 11 Java while 循环 4 12 Julia版本 5 历史 6 实现中的问题 7 参考 8 外部链接演算法 编辑二分搜索只对有序数组有效 二分搜索先比较数组中位元素和目标值 如果目标值与中位元素相等 则返回其在数组中的位置 如果目标值小于中位元素 则搜索继续在前半部分的数组中进行 如果目标值大于中位元素 则搜索继续在数组上部分进行 由此 算法每次排除掉至少一半的待查数组 步驟 编辑 給予一個包含n displaystyle n nbsp 個帶值元素的陣列A displaystyle A nbsp 或是記錄A 0 A n 1 displaystyle A 0 cdots A n 1 nbsp 使A 0 A n 1 displaystyle A 0 leq cdots leq A n 1 nbsp 以及目標值T displaystyle T nbsp 還有下列用來搜尋T displaystyle T nbsp 在A displaystyle A nbsp 中位置的子程式 3 令L displaystyle L nbsp 為0 displaystyle 0 nbsp R displaystyle R nbsp 為n 1 displaystyle n 1 nbsp 如果L gt R displaystyle L gt R nbsp 則搜尋以失敗告終 令m displaystyle m nbsp 中間值元素 為 L R 2 displaystyle lfloor L R 2 rfloor nbsp 具体实现中 为防止算術溢出 一般采用 L R L 2 displaystyle lfloor L R L 2 rfloor nbsp 代替 如果A m lt T displaystyle A m lt T nbsp 令L displaystyle L nbsp 為m 1 displaystyle m 1 nbsp 並回到步驟二 如果A m gt T displaystyle A m gt T nbsp 令R displaystyle R nbsp 為m 1 displaystyle m 1 nbsp 並回到步驟二 當A m T displaystyle A m T nbsp 搜尋結束 回傳值m displaystyle m nbsp 這個疊代步驟會持續透過兩個變數追蹤搜索的邊界 有些實際應用會在演算法的最後放入相等比較 讓比較迴圈更快 但平均而言會多一層疊代 4 大致匹配 编辑 以上程序只適用於完全匹配 也就是尋找一個目標值的位置 不過 因為有序陣列的順序性 將二分搜索算法擴展到能適用大致匹配並不是很重要 舉例來說 二分搜索算法可以用來計算一個賦值的排名 或稱秩 比它更小的元素的數量 前趨 下一個最小元素 後繼 下一個最大元素 以及最近鄰 搜尋兩個值之間的元素數目的範圍查詢 英语 Range query data structures 可以藉由兩個排名查詢 又稱秩查詢 來執行 5 排名查詢可以使用調整版的二分搜索來執行 藉由在成功的搜索回傳m displaystyle m nbsp 以及在失敗的搜索回傳L displaystyle L nbsp 就會取而代之地回傳了比起目標值小的元素數目 5 前趨和後繼查詢可以藉由排名查詢來執行 一旦知道目標值的排名 其前趨就會是那個位於其排名位置的元素 或者排名位置的上一个元素 因為它是小於目標值的最大元素 其後繼是 陣列中的 下一個元素 或是 非陣列中的 前趨的下一個元素 6 目標值的最近鄰可能是前趨或後繼 取決於何者較為接近 範圍查詢也是直接了當的 一旦知道兩個值的排名 不小於第一個值且小於第二個值的元素數量就會是兩者排名的差 這個值可以根據範圍的端點是否算在範圍內 或是陣列是否包含其端點的對應鍵來增加或減少1 7 复杂度分析 编辑时间复杂度 折半搜索每次把搜索区域减少一半 时间复杂度为O log n displaystyle O left log n right nbsp n代表集合中元素的个数 空间复杂度 O 1 displaystyle O left 1 right nbsp 虽以递归形式定义 但是尾递归 可改写为循环 应用 编辑除直接在一个数组中查找元素外 可用在插入排序中 示例代码 编辑C 版本 递归 编辑 int binary search const int arr int start int end int key if start gt end return 1 int mid start end start 2 直接平均可能會溢位 所以用此算法 if arr mid gt key return binary search arr start mid 1 key else if arr mid lt key return binary search arr mid 1 end key else return mid 最後檢測相等是因為多數搜尋狀況不是大於要不就小於 C 版本 while 循环 编辑 int binary search const int arr int start int end int key int ret 1 未搜索到数据返回 1下标 int mid while start lt end mid start end start 2 直接平均可能會溢位 所以用此算法 if arr mid lt key start mid 1 else if arr mid gt key end mid 1 else 最後檢測相等是因為多數搜尋狀況不是大於要不就小於 ret mid break return ret 单一出口 javascript 版本 编辑 var arr 1 3 5 7 9 10 11 12 14 15 19 20 const binarySearch arr target gt const search start end gt if start gt end return 1 const mid start Math floor end start 2 if arr mid gt target return search 0 mid 1 else if arr mid lt target return search mid 1 end else return mid return search 0 arr length 1 console log binarySearch arr 4 Python3 版本 while 循环 编辑 def binary search arr left right key while left lt right mid left right left 2 if arr mid key return mid elif arr mid lt key left mid 1 elif arr mid gt key right mid 1 return 1 Python3 版本 递归 编辑 def binary search arr start end key if start gt end return 1 mid start end start 2 if arr mid gt key return binary search arr start mid 1 key if arr mid lt key return binary search arr mid 1 end key return mid C 版本 编辑 static int binary search int arr int start int end int key int mid while start lt end mid start end 2 if arr mid lt key start mid 1 else if arr mid gt key end mid 1 else return mid return 1 Swift 版本 编辑 import Foundation 二分搜索完全匹配 Parameters arr 有序数组 start 起始位置 end 结束点 key 特点目标值 Returns 返回查找结果 func binarySearch arr Int start Int end Int key Int gt Int if start gt end return nil let mid start end start 2 if arr mid gt key return binarySearch arr arr start start end mid 1 key key else if arr mid lt key return binarySearch arr arr start mid 1 end end key key else return mid golang 递归版本 编辑 func binary search arr int low high key int int if low gt high return 1 mid low high low 2 if arr mid gt key return binary search arr low mid 1 key else if arr mid lt key return binary search arr mid 1 high key return mid golang 非递归版本 编辑 func binarySearch arr int key int int low high 0 len arr 1 for low lt high mid low high low 2 if arr mid key return mid else if key lt arr mid high mid 1 else if key gt arr mid low mid 1 return 1 Java 递归 编辑 public static int binarySearch int arr int start int end int key if start gt end return 1 int mid start end start 2 防止溢位 if arr mid gt key return binarySearch arr start mid 1 key if arr mid lt key return binarySearch arr mid 1 end key return mid Java while 循环 编辑 public static int binarySearch int arr int start int end int key int result 1 while start lt end int mid start end start 2 防止溢位 if arr mid gt key end mid 1 else if arr mid lt key start mid 1 else result mid break return result Julia版本 编辑 Julia Sample BinarySearch function BinarySearch A Key left right 1 length A while left lt right mid left floor Int right left 2 if A mid Key return mid elseif Key lt A mid right mid 1 elseif Key gt A mid left mid 1 end end return 1 end Main Code A 1 3 16 31 43 354 586 Already Arrange println A Original Array println BinarySearch A 43 BinarySearch Search Array println BinarySearch A 354 BinarySearch Search Array println BinarySearch A 3 BinarySearch Search Array历史 编辑在1946年 约翰 莫奇利在摩尔学院讲座 英语 Moore School Lectures 上第一次提出二分搜索的概念 8 1957年 威廉 皮特逊 英语 William Wesley Peterson 发表了第一个应用插值搜索的算法 8 9 在此时 每个发表的二分搜索算法只对长度为2的幂减一的数组有用 10 直到1960年 德里克 亨利 莱默发表了一个对于所有长度的数组都适用的算法 11 1962年 赫尔曼 博滕布鲁赫发表了一个用ALGOL 60写的二分搜索 将判断相等的步骤放到算法末尾 虽然将平均迭代次数增加一 但是每次迭代中的比较次数减少了1次 12 均匀二分搜索则是史丹佛大學的A K 钱德拉在1971年发明的 8 1986年 伯纳德 查泽尔和列奥尼达斯 吉巴斯引入了分散层叠来解决计算几何中大量存在的搜索问题 13 14 15 实现中的问题 编辑尽管二分查找的基本思想相对简单 但细节可以令人難以招架 高德纳 2 当乔恩 本特利将二分搜索问题布置给专业编程课的学生时 百分之90的学生在花费数小时后还是无法给出正确的解答 主要因为这些错误程序在面对边界值的时候无法运行 或返回错误结果 16 1988年开展的一项研究显示 20本教科书里只有5本正确实现了二分搜索 17 不仅如此 本特利自己1986年出版的 编程珠玑 一书中的二分搜索算法存在整数溢出的问题 二十多年来无人发现 Java语言的库所实现的二分搜索算法中同样的溢出问题存在了九年多才被修复 18 参考 编辑 Willams Jr Louis F A modification to the half interval search binary search method Proceedings of the 14th ACM Southeast Conference 95 101 1975 doi 10 1145 503561 503582 2 0 2 1 Knuth 1998 6 2 1 Searching an ordered table subsection Binary search Knuth 1998 6 2 1 Searching an ordered table subsection Algorithm B Bottenbruch Hermann Structure and Use of ALGOL 60 Journal of the ACM 1962 9 2 161 211 Procedure is described at p 214 43 titled Program for Binary Search 5 0 5 1 Sedgewick amp Wayne 2011 3 1 subsection Rank and selection Goldman amp Goldman 2008 第461 463頁 sfn error no target CITEREFGoldmanGoldman2008 help Sedgewick amp Wayne 2011 3 1 subsection Range queries 8 0 8 1 8 2 Knuth 1998 6 2 1 Searching an ordered table subsection History and bibliography Peterson William Wesley Addressing for random access storage IBM Journal of Research and Development 1957 1 2 130 146 doi 10 1147 rd 12 0130 2n 1 OEIS A000225 页面存档备份 存于互联网档案馆 Retrieved 7 May 2016 Lehmer Derrick Teaching combinatorial tricks to a computer Proceedings of Symposia in Applied Mathematics 1960 10 180 181 doi 10 1090 psapm 010 Bottenbruch Hermann Structure and use of ALGOL 60 Journal of the ACM 1962 04 01 9 2 161 221 ISSN 0004 5411 doi 10 1145 321119 321120 Procedure is described at p 214 43 titled Program for Binary Search Chazelle Bernard Liu Ding Lower bounds for intersection searching and fractional cascading in higher dimension 33rd ACM Symposium on Theory of Computing ACM 322 329 2001 07 06 2018 06 30 ISBN 978 1 58113 349 3 doi 10 1145 380752 380818 原始内容存档于2018 10 29 存档副本 2019 10 06 原始内容存档于2018 10 29 Chazelle Bernard Guibas Leonidas J Fractional cascading I A data structuring technique PDF Algorithmica 1986 1 1 4 133 162 2019 10 06 CiteSeerX 10 1 1 117 8349 nbsp doi 10 1007 BF01840440 原始内容存档 PDF 于2016 03 03 页面存档备份 存于互联网档案馆 Chazelle Bernard Guibas Leonidas J Fractional cascading II Applications PDF Algorithmica 1986 1 1 4 163 191 2019 10 06 doi 10 1007 BF01840441 原始内容存档 PDF 于2016 03 04 Bentley 2000 4 1 The Challenge of Binary Search sfn error no target CITEREFBentley2000 help Pattis Richard E Textbook errors in binary searching SIGCSE Bulletin 1988 20 190 194 doi 10 1145 52965 53012 Bloch Joshua Extra extra read all about it nearly all binary searches and mergesorts are broken Google Research Blog 2006 06 02 2016 04 21 原始内容存档于2016 04 01 页面存档备份 存于互联网档案馆 Sahni Sartaj Data Structures Algorithms and Applications in C McGraw2 Hill 1998 ISBN 978 0072362268 Knuth Donald Fundamental algorithms The Art of Computer Programming 1 3rd Reading MA Addison Wesley Professional 1997 ISBN 978 0 201 89683 1 Knuth Donald Sorting and searching The Art of Computer Programming 3 2nd Reading MA Addison Wesley Professional 1998 ISBN 978 0 201 89685 5 Knuth Donald Combinatorial algorithms The Art of Computer Programming 4A 1st Reading MA Addison Wesley Professional 2011 ISBN 978 0 201 03804 0 Moffat Alistair Turpin Andrew Compression and coding algorithms Hamburg Germany Kluwer Academic Publishers 2002 ISBN 978 0 7923 7668 2 doi 10 1007 978 1 4615 0935 6 Sedgewick Robert Wayne Kevin Algorithms 4th Upper Saddle River New Jersey Addison Wesley Professional 2011 2019 05 15 ISBN 978 0 321 57351 3 原始内容存档于2014 07 15 Condensed web version nbsp book version nbsp Stroustrup Bjarne The C programming language 4th Upper Saddle River New Jersey Addison Wesley Professional 2013 ISBN 978 0 321 56384 2 外部链接 编辑NIST Dictionary of Algorithms and Data Structures binary search 页面存档备份 存于互联网档案馆 Google Research Nearly All Binary Searches and Mergesorts are Broken 页面存档备份 存于互联网档案馆 Binary search implemented in 12 languages 页面存档备份 存于互联网档案馆 程序员编程艺术第二十五章 Jon Bentley 90 无法正确实现二分查找 页面存档备份 存于互联网档案馆 https leetcode com explore learn card binary search 页面存档备份 存于互联网档案馆 本条目的部分内容翻译自英語維基百科条目Binary search algorithm 並以知识共享 署名 相同方式共享4 0协议授权使用 原文作者列表請參閱其页面历史 取自 https zh wikipedia org w index php title 二分搜尋演算法 amp oldid 80067629, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。