词频统计

  • 请设计一个高效的方法,找出任意指定单词在一篇文章中的出现频数。给定一个string数组article和数组大小n及一个待统计单词word,请返回该单词在文章中的出现频数。保证文章的词数小于等于1000。
//可以直接使用STL的count
class Frequency {
public:
    int getFrequency(vector<string> article, int n, string word) {
        return count(article.begin(), article.end(), word);
    }
};
  • 当然,使用trie树要更加的节省空间(当然前提是这个文章可能被查找很多次)
struct Node{
    char data;
    int cnt;
    int ch[2],next;// 0 left child, 1 right child
    Node(){}
    Node(char c):data(c){cnt=ch[0]=ch[1]=next=0;}
};

struct Trie{
    Node* node;
    int nodecount;

    Trie(){
        node=new Node[500005];
        node[0]=Node('n');
        nodecount=1;
    }
    ~Trie(){
        delete [] node;
    }

    int appendnode(char x){
        node[nodecount]=Node(x);
        return nodecount++;
    }

    void append(int id,const char* str){
        while(*str){
            if(*str==node[id].data){
                if(!str[1])node[id].cnt++;
                if(!node[id].next&&str[1]){
                    node[id].next=appendnode(str[1]);
                }
                id=node[id].next;
                str++;
            }else{
                int cid=*str<node[id].data?0:1;//0 left child, 1 right child
                if(!node[id].ch[cid]){
                    node[id].ch[cid]=appendnode(str[0]);
                }
                id=node[id].ch[cid];
            }
        }
    }

    int find(int id,const char *str){
        while(*str){
            if(*str==node[id].data){
                if(!str[1])return id;
                if(!node[id].next){
                    return -1;
                }
                id=node[id].next;
                str++;
            }else{
                int cid=*str<node[id].data?0:1;//0 left child, 1 right child
                if(!node[id].ch[cid]){
                    return -1;
                }
                id=node[id].ch[cid];
            }
        }
        return -1;
    }
};

class Frequency {
public:
    int getFrequency(vector<string> article, int n, string word) {
        Trie trie;
        for(int i=0;i<n;i++){
            trie.append(0,article[i].c_str());
        }
        int id=trie.find(0,word.c_str());
        return trie.node[id].cnt;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值