day10アルゴリズム
バブルアルゴリズム
バブルが上がったようにバブルソートは、リストの直立を表示(大きな時間の複雑さ)
LST = [12,3,3,2424,14,3567,534,324,324,23,4,23,42,4324]
範囲内にnum(LEN(LST))のために:
iの範囲内(LEN(LST)-1):
LSTであれば[I]> LST [I + 1]:
LST [i]は、LST [I + 1] = LST [I + 1]、LST [I]
印刷(LST)
バブルソート、コードを最適化
LST = [12,3,3,2424,14,3567,534,324,324,23,4,23,42,4324]
範囲内にnum(LEN(LST))のために:
iの範囲内(LEN(LST)-1-NUM):あなたは降順で、いくつかを取ることができたときにバブリングした後、バブル後の一回#エンドラン
LSTであれば[I]> LST [I + 1]:
LST [i]は、LST [I + 1] = LST [I + 1]、LST [I]
印刷(LST)
二分法:
二分法は、データの各半分を除外することができる見つけることができます。非常に高い効率を探します
要件:シーケンスは、順序付けられたシーケンスで見つけなければなりません
原生二分法:
LST = [1,2,4,5,9,21,23,34,35,56,87,123,231,345,678,999]
N = 35
## O(N)の最大横断時間の複雑さを探す:I LSTに用
iがn ==場合:
印刷(「が見つかり」)
ブレーク
他:
印刷(「が見つかりません」)
左= 0
右= lenは(LST)-1
左<=右ながら#の二分法の効率を改善するために使用することができる(この方法を使用するために順序付け)(第一のハーフカット)
真ん中=(左+右)//ここ2#割り切れる必要があります
if lst[middle] > n: #2**n < 数据量; 比如1亿个数, 27次就可以找到
right = middle - 1
if lst[middle] < n:
left = middle + 1
if lst[middle] == n:
print('found')
break
else:
print('not found')
递归可以完成二分法
lst = [1,2,4,5,9,21,23,34,35,56,87,123,231,345,678,999]
def func(n,left,right):
if left <= right: #为啥不用while, 因为用了递归
middle = (left + right)//2
if n > lst[middle]:
left = middle + 1
return func(n, left, right) #递归
if n < lst[middle]:
right = middle - 1
return func(n, left, right) #递归 #返回值的问题: 如果递归了很多层, 最后一层得到结果,返回给倒数第二层, 就完事了. 如何一层层返回: return 倒数第二层给倒数第三次, 依次类推直到返回给第一层.
if n == lst[middle]:
print('found')
return middle #通过return返回, 不能用break
else:
print('not found')
return -1 #1.模仿find找不到返回 -1(一般index是整数); 2. -1 比 None好运算,可能会用到
rst = func(87, 0, len(lst)-1)
print(rst)
查找最快的方案
lst1 = [2,3,5,6,8]
lst2 = [0 for i in range(max(lst1)+1)] #找到列表中最大的数, 作为都是 0 的新列表的长度
for el in lst1: #把数字变成index
lst2[el] = 1
n = 1
if lst2[n] == 1: #优点o(1) 时间复杂度, 空间复杂度最低
print('it is in')
else:
print('it not in')
3.c3算法
class A:
pass
class B(A):
pass
class C(B):
pass
class D:
pass
class E(D,C):
pass
class F:
pass
class G(F):
pass
class H(C,G):
pass
class Foo(E,H):
pass #c3算法:
#自己先拿出来, 最优先,先安放好
L(E) = D,object + C,B,A,object #拿出第一个的表头,和第二个(除表头)比, 如果没有相等的, 把第一个表头去掉安放好
>>>E,D,C,B,A,object #如果有相等的, 第一个表头就不动, 然后从第二个拿出表头, 和第一个(除表头比)
#依次类推, c3 算法可以得到继承顺序
L(H) = C,B,A,object + G,F,object
>>>H,C,B,A,G,F,object
L(Foo) = E + H
L(Foo) = E,D,C,B,A,object + H,C,B,A,G,F,object
>>>Foo,E,D,H,C,B,A,G,F,object