is balance函式優化

2021-07-10 02:34:14 字數 1887 閱讀 7743

最近在讀《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 的極小點。由於負梯度方向是使函式值下降最快的方...