Fw: [問題] 給字串找出第一個符合的glob

看板Prob_Solve作者 (道可道非常道)時間6年前 (2017/09/23 08:07), 6年前編輯推噓3(306)
留言9則, 3人參與, 最新討論串1/1
※ [本文轉錄自 Programming 看板 #1PnIAqkY ] 作者: danny0838 (道可道非常道) 看板: Programming 標題: [問題] 給字串找出第一個符合的glob 時間: Fri Sep 22 22:48:18 2017 如題,假設資料庫有這樣的鍵-值對: { "www.google.com": function A(){}, "*.example.com.*": function B(){}, "*.example.*": function C(){}, "www.*.com.*": function D(){}, "*.mycompany.*.com.*": function E(){}, ... } 語言是用 javascript。 現在希望對於任意給定的字串, 找出第一個符合的鍵執行對應的function。 例如給 "foo.example.com.tw" 要執行 function B 如果鍵是純字串,做起來很簡單,一個 Map 就解決, 但問題是現在的鍵可能是 glob pattern... 我知道可以用暴力法, 意即依序把每個鍵拿去和給定字串比對, 不過資料庫大起來效能會較差, 想知道是否有時間複雜度較低的演算法可用? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.19.182 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1506091700.A.BA2.html ※ 編輯: danny0838 (1.164.19.182), 09/22/2017 22:51:54

09/22 23:03, , 1F
轉成 regular expression
09/22 23:03, 1F

09/23 00:03, , 2F
請問使用RegExp如何降低時間複雜度?
09/23 00:03, 2F

09/23 00:13, , 3F
B 和 C 不會打架嗎?
09/23 00:13, 3F
設計上是有按順序,如果 B 符合了就不執行 C。 ※ 編輯: danny0838 (1.164.19.182), 09/23/2017 01:03:59

09/23 06:21, , 4F
map 是用樹做的,你現在的問題是
09/23 06:21, 4F

09/23 06:21, , 5F
你的鍵其實代表了另一組鍵,而且這組鍵
09/23 06:21, 5F

09/23 06:21, , 6F
(以下稱小鍵)
09/23 06:21, 6F

09/23 06:21, , 7F
散落在樹的不同地方,所以你的鍵和小鍵
09/23 06:21, 7F

09/23 06:21, , 8F
對樹來講其實是互不相干的
09/23 06:21, 8F

09/23 06:21, , 9F
如果你能找到一種排序方式,讓一個鍵所
09/23 06:21, 9F

09/23 06:21, , 10F
代表的所有小鍵大小連續,那你就能用這
09/23 06:21, 10F

09/23 06:21, , 11F
種排序方式來建立樹,那時間複雜度就不
09/23 06:21, 11F

09/23 06:21, , 12F
會和map差太多,不過缺點是我覺得某些情
09/23 06:21, 12F

09/23 06:21, , 13F
況可能會找不到解
09/23 06:21, 13F

09/23 06:21, , 14F
還有,其實你的問題可以去 prob solve
09/23 06:21, 14F

09/23 06:21, , 15F
版問
09/23 06:21, 15F
※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: danny0838 (36.227.221.89), 09/23/2017 08:07:57

09/23 11:41, , 16F
09/23 11:41, 16F

09/24 00:38, , 17F
雖然也可以把很多個 pattern 一起弄成一個 DFA 不過不知
09/24 00:38, 17F

09/24 00:38, , 18F
道這 DFA 會多大...@@
09/24 00:38, 18F

09/24 00:39, , 19F
啊, 沒看到一樓貼的 paper
09/24 00:39, 19F

09/28 19:37, , 20F
"*" 是否包含 "." ? 若不包含, 那就用 "." 拆分成多個欄位吧.
09/28 19:37, 20F

09/30 13:08, , 21F
我的意思是,原PO例子foo.example.com.tw應該符合BD但不符合C
09/30 13:08, 21F

09/30 13:11, , 22F
的話,那拆開就只要對應原字串和*的聯集,最後合起來取交集;
09/30 13:11, 22F

09/30 13:13, , 23F
另外,要加上欄數的比對,以免犯foo.example.com對到B的錯誤.
09/30 13:13, 23F

09/30 13:20, , 24F
當然, 若 glob pattern 不是只有單純 * 的話, 那就不適用了.
09/30 13:20, 24F
文章代碼(AID): #1PnQNU2R (Prob_Solve)