無順序約束的字串匹配問題
字串A較長,字串B較短,如何以最短時間判斷出B裡的所有字母在A中都有:
?B\subseteq A
舉例:
A=abcdeabcdft,B=dcea,返回ture
若:B=dfgz,返回false
本題沒有字串順序約束,不需要保證B中字母在A出現的相對順序不變。下文幫助大家如何一步步優化匹配演算法。(有順序約束的字串匹配問題,請大家參考KMP演算法)
設len(A)=m,len(B)=n
最簡單的方法-輪詢O(m
∗ *n)輪詢字串B中的每個字母,看其是否在A中出現過。即判斷
?Bi∈A ?B_i \in A。這種方法是最笨的方法,時間複雜度為O(m∗ *n),不可取。先排序,再同時輪詢兩個字串O(
mlogm mlog^m)可以先對兩個字串按字典排序,然後在A中找到和B相同的起始位置,同時進行輪詢。此時時間複雜度分類兩段:
排序:O(nlogn log^n+mlogm log^m)(一般排序)
輪詢:O(m+n)
整體是mlogm mlog^m的時間複雜度,如果排序使用O(m)的方法就另說。
使用hashtable: O(
α \alpham+β \betan)hashtable的優點是查詢時間為O(1),故我們可以輪詢字串A,將其放在hashtable裡O(m),然後輪詢字串B,在hashtable裡查詢每個字母
Bi B_i,看能否找到O(n)。這樣時間複雜度為O(m+n),這是典型以空間換時間的做法。不過舉一個不太恰當的例子,若在hashtable裡字母a,b,c有相同的索引值,查詢時間就不是O(1)了,得加上key值比較的時間。說到這,大家是不是得去看看hashtable的工作原理啦。
利用素數-O(m+n)
對於26個英文字母,給予每個字母分配一個素數,從2開始,往後類推。a:2, b:3, c:5, d:7
⋯ \cdots
這樣,輪詢字串A,將每個字母代表的素數相乘,這樣會得到一個較大的數Big。然後輪詢字串B,若其字母代表的素數能被Big整除,就表示Bi⊆A B_i\subseteq A,若有餘數返回false。即使字串A中有重複字母,仍然可以在O(m+n)時間複雜度內求得結果。
相關文章
- iOS Autolayout 修改約束優先順序崩潰問題iOS
- 字串匹配問題字串匹配
- 字串匹配模式問題字串匹配模式
- Nginx配置指令location匹配符優先順序和安全問題Nginx
- 42. nginx 匹配的 try_file 與前端路由的優先順序問題Nginx前端路由
- Git diff hash順序的問題Git
- 時序約束和綜合+跨時鐘產生的問題+spyglass的使用+SOC設計問題
- 談Nginx的Location匹配優先順序Nginx
- Nginx中的一些匹配順序Nginx
- nginx的location匹配順序、優先順序,location對映衝突排查Nginx
- Gson – 比較兩個順序無關的json字串JSON字串
- Jetpack Compose的Modifier順序問題Jetpack
- 字串匹配問題——KMP演算法字串匹配KMP演算法
- mysql order by 和 group by 順序問題MySql
- Java 修飾符順序問題Java 修飾符
- sql中的or與and的執行順序問題SQL
- 常見問題--表的約束initially immediate 理解
- javascript 字串字元順序反轉JavaScript字串字元
- 關於defer執行順序問題
- MySQL:讀取my.cnf的順序問題MySql
- SQL語句中的AND和OR執行順序問題SQL
- MYSQL INNODB中表資料的返回順序問題MySql
- 【PK】Oracle 10g刪除主鍵約束後無法刪除唯一約束索引問題的模擬與分析Oracle 10g索引
- UITableView停止載入中的動畫的順序問題UIView動畫
- FrameLayout裡有CardView造成的顯示順序問題View
- 關於CSS樣式的優先順序問題CSS
- 由“香蕉”引出的字串匹配演算法的問題字串匹配演算法
- SQL中rownum和order by的執行順序的問題SQL
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 遷移後處理外來鍵約束的問題
- 利用函式索引解決複雜的約束問題函式索引
- (9)邏輯綜合新增約束(時序、DRC)
- POJ-2192 Zipper-順序合成串匹配
- day-25-類的繼承順序-父類對子類的約束-多型-佇列和棧繼承多型佇列
- 關於SQLServer2005的學習筆記——約束、Check、觸發器的執行順序SQLServer筆記觸發器
- 支援向量機(SVM)的約束和無約束優化、理論和實現優化
- 5-順序表查詢及插入問題
- scala隱式轉換優先順序問題