2010-08-12 51 views
0

任何現有的可以處理此問題的函數? 輸入:A B C 輸出:{A},{B},{C},{A B},{B C},{A B C}枚舉階段中的所有n-gram子詞

注意,{A C}或{C A}是無效的輸出。

+0

你在枚舉所有的子串嗎?如「ABCD」→「A」→「B」→「C」→「AB」→「BC」→「CD」→「ABC」→「BCD」→「ABCD」 – 2010-08-12 02:53:02

回答

3

在僞碼:

for (i=0 .. n-1) { 
    for (j=i .. n-1) { 
     ngrams.add(phase[i:j]) 
    } 
} 

phase[i:j]是切片起始於i和在jn結束時的長度(在這種情況下3)

A B C 
0 1 2 

0:0 A 
0:1 AB 
0:2 ABC 
1:1 B 
1:2 BC 
2:2 C 
+0

這似乎是比我更優雅的解決方案! – Yang 2010-08-12 02:50:23

+0

@Yang這是[Python中的工作示例](http://ideone.com/DUyI6) – NullUserException 2010-08-12 03:00:12

1

我計算出來:O型(n^3)算法

public static void GenerateAllGrams(string query) { 
     string[] q = query.Split(' '); 
     int maxgram = q.Length; 
     for (int gram = 1; gram <= maxgram; gram++) { 
      for (int i = 0; i < q.Length - gram + 1; i++) { 
       string current = ""; 
       for (int j = i; j < i + gram; j++) { 
        current += q[j] + " "; 
       } 
       Console.WriteLine(current.Trim()); 
      } 
     } 
    } 
1

在方案中:

(define (prefix x list) 
    (if (null? list) 
     nil 
     (cons (cons x (car list)) 
       (prefix x (cdr list))))) 

(define (subwords phrase) 
    (if (null? phrase) 
     nil 
     (cons (list (car phrase)) 
       (cons (prefix (car phrase) (subwords (cdr phrase))) 
        (subwords (cdr phrase))))))