Contents

字串比較各種演算法

  • 給定 k 個匹配字串 P,各字串平均長度為 m,在目標字串 T 中尋找符合的字串,目標字串長度為 n
  • Time complexity: O(k*m*n)
  • Space complexity: O(k*m) 建立匹配字串的字典
  • Time complexity: O(k*m + k*n)
    • Failure function construction complexity: O(k*m)
    • Matching complexity: O(k*n)
  • Space complexity: O(k*m) 每個匹配字串 Pi 建立 Pi[j] 最長相同的前綴與後綴 for j in [1, m - 1]
  • Time complexity: O(k*m + n*m)
    • Trie construction complexity: O(k*m)
    • Matching complexity: O(n*m)
  • Space complexity: worse case O(k*m), best case O(m)
  • Time complexity: O(n + k*m + z)
    • z is number of output matches (e.g. dictionary = a, aa, aaa, aaaa and input string is aaaa)
    • Construction complexity: O(k*m)
    • Matching complexity: O(n + z)
    • Insert new matching pattern: worse case O(k*m), best case O(m)
  • Space complexity: worse case O(k*m), best case O(m)

如果今天請你做出一個聊天室的訊息過濾器(不允許誤報),你會如何實作呢? 共有 N 個敏感詞彙,每個敏感詞彙的平均長度為 M,每個句子包含 K 個字元。 可參考網路相關資料,統整分析解決方案優缺點後,選擇你認為最佳的解法簡略回答即可

  • 若考慮N會非常大,對速度的需求高於記憶體用量,且可以是先建好字典,可能要支援Unicode,那我會選擇使用 Aho–Corasick 演算法。
  • 此演算法會用到 Trie 資料結構和 Failure table,空間複雜度是 O(N*M)
  • 此演算法結合了 KMP 的 Failure function 來減少時間複雜度,也使用了 Trie 來降低重疊的敏感詞,時間複雜度是 O(N*M + K + Z) 其中 Z 是輸入句子敏感單詞出現的個數
  • 自動產生敏感單詞,隨機加入敏感單詞來生成句子,使用現有的regex來產生對照組,寫個簡單程式測試兩者結果差異
  • 加入 Trie 更新 Failure table,時間複雜度的 best case 是 O(M)





Комментарии