C ++ code:
struct bigram_key{
int i, j;// words - indexes of the words in a dictionary
// a constructor to be easily constructible
bigram_key(int a_i, int a_j):i(a_i), j(a_j){}
// you need to sort keys to be used in a map container
bool operator<(bigram_key const &other) const{
return i<other.i || (i==other.i && j<other.j);
}
};
struct bigram_data{
int count;// n(ij)
map<int, int> trigram_counts;// n(k|ij) = trigram_counts[k]
}
map<bigram_key, bigram_data> trigrams;
Словарь может быть вектором всех найденных слов, таких как:
vector<string> dictionary;
, но для лучшего поиска word-> index это может быть карта:
map<string, int> dictionary;
Когда вы читаете новое слово.Вы добавляете его в словарь и получаете его индекс k
, у вас уже есть индексы i
и j
предыдущих двух слов, так что вы просто делаете:
trigrams[bigram_key(i,j)].count++;
trigrams[bigram_key(i,j)].trigram_counts[k]++;
Для повышения производительности вы можетеискать биграмм только один раз:
bigram_data &bigram = trigrams[bigram_key(i,j)];
bigram.count++;
bigram.trigram_counts[k]++;
Это понятно?Вам нужно больше деталей?