資料結構與演算法(三)

2021-10-18 05:15:36 字數 3477 閱讀 6664

變位詞是指兩個詞之間存在組成字母的

重新排列關係

如:heart和earth,python和typhon

為了簡單起見,假設參與判斷的兩個詞僅由小寫

字母構成,而且長度相等

詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。(打勾標記——將對應字元設定為non

#自己編寫的程式:

#逐字檢查程式一:

defanagramsolution

(s1,s2)

: l1 =

len(s1)

l2 =

len(s2)

s1 =

list

(s1)

#字串轉換為列表,列表可操作性強

s2 =

list

(s2)

pose1 =

0if l1!=l2:

return

"false"

#長度不同直接錯

else

:while pose1 < l1:

pose2 =

0 flag =

0while pose2 < l2:

if s1[pose1]

==s2[pose2]

: s2[pose2]

=none

flag =

1else

: pose2 = pose2 +

1if flag ==1:

pose1 = pose1 +

1else

:return

"false"

pose1 = pose1 +

1return

"yes"

print

(anagramsolution(

"asdfg"

,"gsdfa"

))

#高淇老師課示程式:

#高淇老師課示程式:

defanagramsolution

(s1,s2)

: alist =

list

(s2)

stillok =

true

pose1 =

0while pose1 <

len(s1)

and stillok:

pose2 =

0 found =

true

while pose2 <

len(alist)

andnot found:

if s1[pose1]

== alist[pose2]

: found =

true

else

: pose2 = pose2 +

1if found:

alist[pose2]

=none

else

: stillok =

false

pose1 = pose +

1return stillok

print

(anagramsolution(

"asdfg"

,"gsdfa"

))

解析:

上述兩程式主要部分皆為雙重迴圈:

故數量級為o(n^2)

轉換成列表之後排序,再愛歌詞進行比較*****

自己編寫的程式:

#排序檢查變位詞:

defsl

(s1,s2)

: s1 =

sorted

(list

(s1)

) s2 =

sorted

(list

(s2)

)if s1 == s2:

return

"yes"

else

:return

"no"

#高淇老師課示程式:

def

sl(s1,s2)

: 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

解析:

上述演算法看上去主要部分是迴圈部分,實則不然。排序sort及sorted的數量級是o(nlogn),因此主要部分是排序演算法。因此,數量級為o(nlogn)。

思路:❖解題思路:對比兩個詞中每個字母出現的次數,如果26個字母出現的次數都相同的話,這兩個字串就一定是變位詞

❖具體做法:為每個詞設定乙個26位的計數

器,先檢查每個詞,在計數器中設定好每

個字母出現的次數

❖計數完成後,進入比較階段,看兩個字元

串的計數器是否相同,如果相同則輸出是

變位詞的結論

#雜湊表檢查變位詞:

defsll

(s1,s2)

: c1=[0

]*26 c2=[0

]*26for i in s1:

c1[ord(i)

-ord

('a')]

+=1for i in s2:

c2[ord(i)

-ord

('a')]

+=1if c1==c2:

return

true

else

:return

false

print

(sll(

"asdfg"

,"gsdfa"))

print

(sll(

"asdfgh"

,"asdfghjk"))

print

(sll(

"aaadds"

,"sddaaa"

))

解析:

上述演算法數量級為o(n)。但儲存空間需求更大,兩個26的計數列表

##學自陳斌老師

資料結構與演算法(三)

鍊錶由單向的鏈變成雙向鏈,使用這種資料結構,我們不再拘束於單鏈表的單向建立於遍歷等操作。在單鏈表中,有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域負責鍊錶之間的 聯絡 在雙向鍊錶中,需要有兩個指標域,乙個負責向後連線,乙個負責向前連線。單鏈表的結構 struct list 雙向鍊錶的...

演算法與資料結構筆記三

摘錄from 大話資料結構 1.樹 樹的度 結點擁有的子樹數成為結點的度 degree 度為0的結點成為葉節點 leaf 或終端結點。樹的深度或高度 結點的層次level,從根節點開始,根為第一層,根的孩子為第二層。樹中最大層次稱為樹的深度 depth 或高度,當前樹的深度為4.樹的儲存 樹儲存當然...

資料結構與演算法 排序 三

假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或者1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的有序序列為止。歸併排序是一種比較占用記憶體,但是卻效率高並穩定的演算法,時間複雜度是o logn 對簡單選擇排序的一種改...