散列表可能是我對這個特定問題的選擇。它將提供O(1)
查找您的大小的表格。儘管如此,特里也是一個不錯的選擇。
但是,爲了實現將是把你的話在按字母順序排列,然後用bsearch
C庫中最簡單的。它應該幾乎與散列或特里一樣快,因爲你只處理30個單詞。它實際上可能會比散列表更快,因爲您不必計算散列值。
Steve Jessop的想法是一個很好的想法,用相同大小的char數組來排列字符串。
const char keywords[][MAX_KEYWORD_LEN+1] = {
"auto", "break", "case", /* ... */, "while"
};
#define NUM_KEYWORDS sizeof(keywords)/sizeof(keywords[0])
int keyword_cmp (const void *a, const void *b) {
return strcmp(a, b);
}
const char *kw = bsearch(word, keywords, NUM_KEYWORDS, sizeof(keywords[0]),
keyword_cmp);
int kw_index = (kw ? (const char (*)[MAX_KEYWORD_LEN+1])kw - keywords : -1);
如果你不已經擁有了它,你應該考慮收購的Compilers: Principles, Techniques, and Tools副本。由於它的封面,它通常被稱爲龍書。
來源
2012-07-09 17:18:22
jxh
當涉及到「n = 20」時,優化應該是您最擔心的問題。幾乎任何順序多項式函數都可以滿足您的需求。 – corsiKa 2012-07-09 17:22:57
根據Niklaus Wirth的說法,當您在編譯器/解釋器中查找本地符號時,*是*最有效的方法。他甚至做了測試以確保。 (當然,他的指標可能與你的指標不同,但是他的指標是非常好的指標。) – 2012-07-09 17:25:44