先来看个实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/usr/bin/env python
import sys
def search2(a,m):
low = 0
high = len (a) - 1
while (low < = high):
mid = (low + high) / 2
midval = a[mid]
if midval < m:
low = mid + 1
elif midval > m:
high = mid - 1
else :
print mid
return mid
print - 1
return - 1
if __name__ = = "__main__" :
a = [ int (i) for i in list (sys.argv[ 1 ])]
m = int (sys.argv[ 2 ])
search2(a,m)
|
运行:
1
|
|
3
注:
1.'__':由于python的类成员都是公有、公开的被存取public,缺少像正统面向对象语言的私有private属性。
于是就用__来将就一下,模拟私有属性。这些__属性往往是内部使用,通常情况下不用改写。也不用读取。
加上2个下划线的目的,一是不和普通公有属性重名冲突,二是不让对象的使用者(非开发者)随意使用。
2.__name__ == "__main__"表示程序脚本是直接被执行的.
如果不等于表示脚本是被其他程序用import引入的.则其__name__属性被设为模块名
Python采用二分查找找出数字的下标
要考虑有重复数字的情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class Solution( object ):
def searchRange( self , nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
def binary_search(start,end,value):
while end> = start:
mid = (start + end) / / 2
print (mid)
if nums[mid]>target:
end = mid - 1
elif nums[mid]<target:
start = mid + 1
else :
if value = = - 1 :
if mid - 1 > = start and nums[mid + value] = = target:
end = mid + value
else :
return mid
else :
if mid + 1 < = end and nums[mid + value] = = target:
start = mid + value
else :
return mid
return - 1
a = binary_search( 0 , len (nums) - 1 , - 1 )
b = binary_search( 0 , len (nums) - 1 , 1 )
return [a,b]
a = Solution()
l = [ 2 , 2 ]
print (a.searchRange(l, 2 ))
|
二分算法的定义不在多说了,百度一下就知道(支持国产大笑)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import sys
source = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] #must be in order
des = int (sys.argv[ 1 ])
low = 0
high = len (source) - 1
targetIndex = - 1
print "des=" ,des
while low < = high:
middle = (low + high) / 2
if des = = source[middle]:
targetIndex = middle
break
elif des < source[middle]:
high = middle - 1
print "middle element[index=" ,middle, ",value=" ,source[middle], "] is bigger than des, continue search from[" ,low, "to" ,high, "]"
else :
low = middle + 1
print "middle element[index=" ,middle, ",value=" ,source[middle], "] is smaller than des, continue search from[" ,low, "to" ,high, "]"
print "search complete, target element's index in source list is " ,targetIndex
|
最后在分享一个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
'fileName--BinarySearch.py'
src = []
def BinarySearch(low, high, target, * src):
'二分查找'
while low < = high:
mid = (low + high) / / 2
midVal = src[mid]
if target < midVal:
high = mid - 1
elif target > midVal:
low = mid + 1
else :
return mid
BinarySearch(low, high, target, * src)
print ( 'Please input 10 number:' )
for number in range ( 10 ):
src.append( int ( input ( 'Num %d:' % number)))
sortList = tuple (src)
key = int ( input ( 'Please input key:' ))
location = BinarySearch( 0 , len (src) - 1 , key, * sortList)
if location ! = None :
print ( 'Find target at %d' % (location + 1 ))
else :
print ( 'No target!' )
|