1
- #问题
1
+ # 问题
2
2
3
3
二分查找
4
4
5
5
list.index()无法应对大规模数据的查询,需要用其它方法解决,这里谈的就是二分查找
6
6
7
- #思路说明
7
+ ## 思路说明
8
8
9
9
在查找方面,python中有list.index()的方法。例如:
10
10
@@ -13,7 +13,7 @@ list.index()无法应对大规模数据的查询,需要用其它方法解决
13
13
1
14
14
>>> a.index(5) #如果没有该值,则报错
15
15
Traceback (most recent call last):
16
- File "<stdin>", line 1, in <module>
16
+ File "<stdin>", line 1, in <module>
17
17
ValueError: 5 is not in list
18
18
19
19
这是python中基本的查找方法,虽然简单,但是,如果由于其时间复杂度为O(n),对于大规模的查询恐怕是不足以胜任的。二分查找就是一种替代方法。
@@ -28,37 +28,37 @@ list.index()无法应对大规模数据的查询,需要用其它方法解决
28
28
29
29
这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:O(logn)
30
30
31
- #解决(Python)
32
-
33
- def binarySearch(lst, value,low,high): #low,high是lst的查找范围
34
- if high < low:
35
- return -1
36
- mid = (low + high)/2
37
- if lst[mid] > value:
38
- return binarySearch(lst, value, low, mid-1)
39
- elif lst[mid] < value:
40
- return binarySearch(lst, value, mid+1, high)
41
- else:
42
- return mid
43
-
44
- #也可以不用递归方法,而采用循环,如下:
45
-
46
- def bsearch(l, value):
47
- lo, hi = 0, len(l)-1
48
- while lo <= hi:
49
- mid = (lo + hi) / 2
50
- if l[mid] < value:
51
- lo = mid + 1
52
- elif value < l[mid]:
53
- hi = mid - 1
54
- else:
55
- return mid
56
- return -1
57
-
58
- if __name__ == '__main__':
59
- l = range(50)
60
- print binarySearch(l,10,0,49)
61
- print bsearch(l,10)
31
+ ## 解决(Python)
32
+
33
+ def binarySearch(lst, value,low,high): #low,high是lst的查找范围
34
+ if high < low:
35
+ return -1
36
+ mid = (low + high)/2
37
+ if lst[mid] > value:
38
+ return binarySearch(lst, value, low, mid-1)
39
+ elif lst[mid] < value:
40
+ return binarySearch(lst, value, mid+1, high)
41
+ else:
42
+ return mid
43
+
44
+ #也可以不用递归方法,而采用循环,如下:
45
+
46
+ def bsearch(l, value):
47
+ lo, hi = 0, len(l)-1
48
+ while lo <= hi:
49
+ mid = (lo + hi) / 2
50
+ if l[mid] < value:
51
+ lo = mid + 1
52
+ elif value < l[mid]:
53
+ hi = mid - 1
54
+ else:
55
+ return mid
56
+ return -1
57
+
58
+ if __name__ == '__main__':
59
+ l = range(50)
60
+ print binarySearch(l,10,0,49)
61
+ print bsearch(l,10)
62
62
63
63
对于python,不能忽视其强大的标准库。经查阅,发现标准库中就有一个模块,名为:bisect。其文档中有这样一句话:
64
64
@@ -77,15 +77,15 @@ list.index()无法应对大规模数据的查询,需要用其它方法解决
77
77
- 关于bisect模块的更多内容,可以参看[ 官方文档] ( https://docs.python.org/2/library/bisect.html )
78
78
79
79
下面演示这个模块的一个函数
80
-
81
- from bisect import *
82
-
83
- def bisectSearch(lst, x):
84
- i = bisect_left(lst, x) #bisect_left(lst,x),得到x在已经排序的lst中的位置
85
- if i != len(lst) and lst[ i] == x:
86
- return i
87
- raise ValueError
88
-
89
- if __ name__ =="__ main__ ":
90
- lst = sorted([ 2,5,3,8] )
91
- print bisectSearch(lst,5)
80
+
81
+ from bisect import *
82
+
83
+ def bisectSearch(lst, x):
84
+ i = bisect_left(lst, x) #bisect_left(lst,x),得到x在已经排序的lst中的位置
85
+ if i != len(lst) and lst[i] == x:
86
+ return i
87
+ raise ValueError
88
+
89
+ if __name__=="__main__":
90
+ lst = sorted([2,5,3,8])
91
+ print bisectSearch(lst,5)
0 commit comments