散列表可能是我对这个特定问题的选择。它将提供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