字典树

    新浪面试,面试官出了一道题,问一片文章,怎样统计其单词出现的次数。数据结构很烂的我当时没反应过来,第一反应就是遍历文章,比较单词然后用标记分别计数。后来面试官提示我问要用什么结构存储,我思考了半分钟,硬挤出了用哈希存储。其实当时想说用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; 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值