最近在讀《python3程式開發指南》,其中5.1章節p174,is_balance函式有不完善的地方:
函式原始碼:
def is_balance(text, brackets="(){}<>"):
#counts為分別存放左符號的個數的字典
counts = {}
left_for_right = {}
for left, right in zip(brackets[::2], brackets[1::2]):
#此處的斷言語法很簡潔
assert left != right
#初始化左符號字典
counts[left] = 0
#初始化左右符號字典對
left_for_right[right] = left
for c in text:
#如果出現左符號,在左符號對中的value加1
if c in counts:
counts[c] += 1
elif c in left_for_right:
left = left_for_right[c]
#如果出現右符號,則和左符號進行匹配
if counts[left] == 0:
return false
counts[left] -= 1
return not any(counts.values())
stringa = "[(aabbv])"
print(stringa)
print(is_balance(stringa))
不完善的地方就在於如果出現[(])的情況,儘管數量是正確的,但是由於序列的不對,造成了無法匹配出來。
下面的改進如下:
由於平衡的符號對總是出現左符號,再出現右符號;所以設定乙個左符號堆疊,每出現乙個左符號就push入堆疊;當出現乙個右符號,則從左符號堆疊中pop出來最近的乙個進行匹配,這樣就實現了對符號串行的匹配,**如下:
def is_balance_seq(text, brackets="(){}<>"):
#左右符號字典對
left_for_right = {}
#定義左符號堆疊
left_item =
#所有左符號
left_mark = brackets[::2]
#所有右符號
right_mark = brackets[1::2]
#生成左右符號字典對
for left, right in zip(brackets[::2],brackets[1::2]):
assert[left] != right
left_for_right[right] = left
for c in text:
if c in left_mark:
#如果掃瞄出左符號,進行壓棧操作
elif c in right_mark:
#如果掃瞄出右符號,對左符號棧pop進行匹配,這裡要注意空棧
if len(left_item)>0:
left_a = left_item.pop()
if left_for_right[c] != left_a:
return false
else:
#出現的空棧的原因一定是因為先出現了右符號,這肯定是不符合序列的
return false
return true
def debug(a):
print(a)
stringa = "[(aabbv])"
print(stringa)
print(is_balance_seq(stringa))
多讀書,多敲**,多實驗,多思考。
mysql函式 優化 Mysql函式求優化解決思路
mysql函式求優化 小弟剛開始接觸mysql資料庫,需要基於mysql資料庫做報表開發,寫的乙個函式查詢時候效率特別低下。備註 傳進來比較的引數資料量 5w條左右。請高手指教優化方法。另外,一般mysql除錯的技巧及工具都用什麼 函式如下 sql code 解決方案 索引建立沒有,將 if ret...
SSE intrinsic函式 優化
編寫乙個基於sse多 指令集的快速矩陣加法運算函式,輸入引數為兩個單精度浮點型陣列srca與srcb,長度為n,輸出結果儲存在乙個單精度浮點型陣列dest中,假設srca srcb以及dest記憶體空間的首位址均按照16 byte對齊。請利用多 指令集獲得最大的程式效能 可以使用visual stu...
損失函式優化方法
梯度下降法是求解無約束最優化問題的一種最常用方法,有實現簡單的優點。它是一種迭代演算法,每一步需要求解的目標函式的梯度向量。假設 f x 是 rn 上具有一階連續偏導數的函式。要求解的無約束最優化問題是 minx r nf x x 表示目標函式 f x 的極小點。由於負梯度方向是使函式值下降最快的方...