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

2021-10-04 04:39:13 字數 1349 閱讀 3049

解法2:排序比較

解法3:暴力法

解法4:計數比較

小甲魚老師的資料結構與演算法是以c為基礎的,統計出身,沒有學過c,就換了其他的課來聽啦。現在聽的是mooc上北大的課,以python為基礎的。

變位詞是指兩個詞之間存在組成字母重新排列關係,如heart和earth,python和typhon。

為了簡單起見,假設參與判斷的兩個詞僅由小寫字母構成,而且長度相等。

解題目標:寫乙個bool函式,以兩個詞作為引數,返回這兩個詞是否變位詞,可以很好地展示同一問題的不同數量級演算法

問題規模:詞中包含的字元個數

主要部分在於兩重迴圈

外層迴圈遍歷s1每個字元,將內層迴圈執行n次;而內層迴圈在s2中查詢字元,每個字元的對比次數,分別是1、2……n中的乙個,而且各不相同

所以總執行次數是1+2+3+……+n=1/2n^2

+1/2n→o(n^2)。

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

粗看上去,本演算法只有乙個迴圈,最多執行n次,數量級是o(n)。但迴圈前面的兩個sort並不是無代價的。從後面的學習內容可以知道,排序演算法採用不同的解決方案,其執行時間數量級差不多是o(n^2)或者o(nlogn),大過迴圈的o(n)。所以本演算法時間主導的步驟是排序步驟,本演算法的執行時間數量級就等於排序過程的數量級o(nlogn)

窮盡所有可能組合,將s1**現的字元進行全排列,再檢視s2是否出現在全排列列表中。這裡最大的問題是產生s1所有字元的全排列(n!個)。

已知n!的增長速度甚至超過2^n,暴力法不是個好方法。

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

為每個詞設定乙個26位的計數器,先檢查每個詞,在計數器中設定好每個字母出現的次數。計數完成後,進入比較階段,看兩個字串的計數器是否相同,如果相同則輸出是變位詞的結論。

計數比較演算法中有3個迴圈迭代,但不像解法1那樣存在巢狀迴圈。前兩個迴圈用於對字串進行計數,操作次數等於字串長度n,第3個迴圈用於計數器比較,操作次數總是26.所以總操作次數t(n)=2n+26,其數量級為o(n)。

這是乙個線性數量級的演算法,是4個變位詞判斷演算法中效能最優的。

中文變位詞例子:「不可隨處小便」,「小處不可隨便」

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

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

Pyhton資料結構 「變位詞」判斷問題

定義變位詞解決辦法1,傳入s1,s2 兩個引數 alist list s2 新建列表,將s2的每個字元複製alist中 pos1 0 用來迴圈遍歷s1的每個字元,pos就是position的縮寫 stillok true 用來判斷是否需要繼續進行比對,若查詢中有乙個s1中字元在s2中找不到,則判定該...

資料結構與演算法(Python版) 課堂例項 變位詞

題目 寫乙個bool函式,以兩個詞作為引數,返回這兩個詞是否變位詞。變位詞 是指兩個詞之間存在組成字母的重新排列關係,如heart和earth,python和typhon 假設輸入的單詞都是小寫並且長度相同 解答解法1 逐字檢查法 時間複雜度o n 2 將詞1中的字元逐個到詞2中檢查是否存在,存在就...