新浪面试,面试官出了一道题,问一片文章,怎样统计其单词出现的次数。数据结构很烂的我当时没反应过来,第一反应就是遍历文章,比较单词然后用标记分别计数。后来面试官提示我问要用什么结构存储,我思考了半分钟,硬挤出了用哈希存储。其实当时想说用map存储的,但是自己没学好c++也没真用过map,然后就很没底气的跟面试官说“听说也可以用map存储的”,然后面试官说大概清楚了,我也明白自己答的很烂。面试官人其实挺好的,技术很厉害,我还请教了他算法和数据结构的重要性,他耐心的为我解说了一番,最后还对我说“说实话吧,作为科班出生的基础真的不好啊”,这倒是让我立志要学好算法和数据结构,好好夯实自己的专业基础啊。
面完后,回来百度了一下刚才那个问题,发现是要用“字典树”的结构存储比较好啊,当然也有说可以用map的。下面是用“字典树”实现单词数统计的c语言实现代码:
#define MAX 26 //字符集大小
typedef struct TrieNode
{
int nCount; //记录该字符出现次数
struct TrieNode *next[MAX];
} TrieNode;
TrieNode Memory[1000000];
int allocp = 0;
/*初始化*/
void InitTrieRoot(TrieNode **pRoot)
{
*pRoot = NULL;
}
/*创建新结点*/
TrieNode *CreateTrieNode()
{
int i;
TrieNode *p;
p = &Memory[allocp++];
p->nCount = 1;
for(i = 0 ; i < MAX ; i++)
{
p->next[i] = NULL;
}
return p;
}
/*插入*/
void InsertTrie(TrieNode **pRoot , char *s)
{
int i , k;
TrieNode *p;
if(!(p = *pRoot))
{
p = *pRoot = CreateTrieNode();
}
i = 0;
while(s[i])
{
k = s[i++] - 'a'; //确定branch
if(p->next[k])
p->next[k]->nCount++;
else
p->next[k] = CreateTrieNode();
p = p->next[k];
}
}
//查找
int SearchTrie(TrieNode **pRoot , char *s)
{
TrieNode *p;
int i , k;
if(!(p = *pRoot))
{
return0;
}
i = 0;
while(s[i])
{
k = s[i++] - 'a';
if(p->next[k] == NULL) return0;
p = p->next[k];
}
return p->nCount;
}