-
專業分析二分法查找
- 二分法針對的對象要是有序的隊列,通過索引找到你要查找的值
- 思想:取一個索引開頭left,取一個索引末尾(len(隊列)-1)right,讓你的值跟(left + right)//2(middle)比
- 如果索引middle值比你查的值大,把middle賦值給right,反之把middle賦值給left;
- 代碼展示:
-
lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111] n = 456 left = 0 right = len(lst) - 1 count = 1 while left <= right: middle = (left + right) // 2 if n > lst[middle]: left = middle + 1 elif n < lst[middle]: right = middle - 1 else: print('查找次數%s' % count) print("存在位置%s" % middle) break count = count + 1 else: print("不存在")
用遞歸方法實現二分法:
"""
其實二分法就是兩個點
1: 函數開始前,要先判斷滿足條件, 左索引值要小於右索引值
2: 就是比較之後, 左右索引要移動到中間值的前一位或者後一位索引位置上
"""
def binary_search(left, right, n):
middle = (left + right)//2
if left > right:
return -1
if n > lst[middle]:
left = middle + 1
elif n < lst[middle]:
right = middle - 1
else:
return middle
return binary_search(left, right, n)
print(binary_search(0, len(lst)-1, 65) )
迭代器50000000000000000星級難題
------問題-------
def add(a, b):
return a + b
def test():
for i in range(4):
yield i
g = test()
for n in [2,10]:
g = (add(n,i) for i in g)
print(list(g)) #[20,21,22,23]
######## 拆分講解
def add(a, b):
return a + b
def test():
for i in range(4):
yield i
g = test()
#-----循環體
for n in [2,10]:
g = (add(n,i) for i in g)
print(list(g))
#-----對循環體拆分
# n=2時
n = 2
g = (add(n, i) for i in g)
# n=10時
n = 10
g = (add(n, i) for i in g)
# -----所以for循環那一刻可以縮寫代碼如下
g = (add(n,i) for i in (add(n,i) for i in test()))
所以在一直沒有list(g)取值時,生成器只會先生成表達式,只有要值了,纔會把test()帶進去值
62進制的問題:
s1 = ''.join([chr(i) for i in range(65,90)])
s2 = ''.join([chr(i) for i in range(97,122)])
s3 = ''.join([str(i) for i in range(10)])
s = s3+s1+s2
res = ''
while n!=0:
ord_ = n%62
n = n//62
res += s[ord_]
print(res)