資料結構與演算法 Python版 三 變位詞判斷問題

2021-10-07 07:39:37 字數 2879 閱讀 8073

所謂」變位詞「是指兩個詞之間存在組成字母的重新排列關係,如:heart 和 earth,python 和 typhon,為了簡單起見,假設參與判斷的兩個詞僅由小寫字母構成,而且長度相等

將詞1中的字元逐個到詞2中檢查是否存在存在就」打勾「標記(防止重複檢查),如果每個字元都能找到,則兩個詞是變位詞只要有1個字元找不到,就不是變位詞

def

anagramsolution1

(s1, s2)

: alist =

list

(s2)

# 複製s2到列表

pos1 =

0 stillok =

true

while pos1 <

len(s1)

and stillok:

# 迴圈s1的每個字元

pos2 =

0 found =

false

while pos2 <

len(alist)

andnot found:

if s1[pos1]

== alist[pos2]

:# 在s2逐個對比

found =

true

else

: pos2 = pos2 +

1if found:

alist[pos2]

=none

# 找到,打勾

else

: stillok =

false

# 未找到,失敗

pos1 = pos1 +

1return stillok

print

(anagramsolution1(

"abcd"

,"dcba"

))

數量級為o(n^2)

將兩個字串都按照字母順序排好序,在逐個字元對比是否相同,如果相同則是變位詞,有任何不同就不是變位詞

:# 轉為列表

alist1 =

list

(s1)

alist2 =

list

(s2)

# 分別排序

alist1.sort(

) alist2.sort(

) pos =

0 matches =

true

while pos <

len(s1)

and matches:

# 逐個對比

if alist1[pos]

== alist2[pos]

: pos = pos +

1else

: matches =

false

return matches

print

(anagramsolution2(

"abcd"

,"dcba"

))粗看上去,本演算法只有乙個迴圈,最多執行n次,數量級是o(n),但迴圈前面的兩個sort並不是無代價的,如果查詢下後面的章節,會發現排序演算法採用不同的解決方案,其執行時間數量級差不多是o(n^2)或者o(n log n),大過迴圈的 o(n)

所以本演算法時間主導的步驟是排序步驟

本演算法的執行時間數量級就等於排序過程的數量級o(n log n)

def

anagramsolution3

(s1, s2)

: c1 =[0

]*26 c2 =[0

]*26# 分別都計數

for i in

range

(len

(s1)):

pos =

ord(s1[i])-

ord(

'a')

c1[pos]

= c1[pos]+1

for i in

range

(len

(s2)):

pos =

ord(s2[i])-

ord(

'a')

c2[pos]

= c2[pos]+1

j =0 stillok =

true

# 計數器比較

while j <

26and stillok:

if c1[j]

== c2[j]

: j = j +

1else

: stillok =

false

return stillok

print

(anagramsolution3(

"abcd"

,"dcba"

))

計數比較演算法中有3個迴圈迭代,但不象解法1那樣存在巢狀迴圈,前兩個迴圈用於對字串進行計數,操作次數等於字串長度n

第3個迴圈用於計數器比較,操作次數總是26次

所以總操作次數t(n)=2n+36,其數量級為o(n),這是乙個線性數量級的演算法,是4個變位詞判斷演算法種效能最優的

值得注意的是,本演算法依賴於兩個長度為26的計數器列表,來儲存字元計數,這相比前3個演算法需要更多的儲存空間,如果考慮由大字符集構成的詞,還會需要更多儲存空間。

犧牲儲存空間來換取執行時間,或者相反,這種在時間空間之間的取捨和權衡,在選擇問題解法的過程中經常會出現。

資料結構與演算法 遞迴演算法(Python版)

一 整數轉換為任意進製 我們用最熟悉的十進位制分析下這個問題 十進位制有十個不同符號 convstring 0123456789 比十小的整數 轉換成十進位制,直接查表 就可以 了 convstring n 想辦法把比十大的整數,拆成一系列比十小的整 數,逐個查表,比如七百六十九,拆成 七 六 九,...

資料結構與演算法(Python)(三)

棧可以用順序表實現,也可以用鍊錶實現。棧的操作 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 python的list來實現棧的操作class stack o...

資料結構與演算法(三)

變位詞是指兩個詞之間存在組成字母的 重新排列關係 如 heart和earth,python和typhon 為了簡單起見,假設參與判斷的兩個詞僅由小寫 字母構成,而且長度相等 詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。...