什么是在流中查找单词序列频率的最佳算法

时间:2013-08-29 03:21:10

标签: c++ database algorithm analytics bigdata

我正在处理传入的文本流。例如 美国,英国,中国,俄罗斯,美国,英国,中国,法国,德国

我需要将它们分解为3个单词(或者可能是n个单词)的序列,并分析哪个序列具有最高频率。在上述情况下,序列美国,英国,中国出现两次。所以它的频率最高。

另外,我需要索引所有序列的频率。我已经尝试使用C ++ stl map来部分解决一些问题,但我没有看到解决方案那么优雅。原因是唯一索引 m 的唯一字数,在使用stl map的3个字序列中,数学如下,

i x m x m + j x m + k

i,j,k是每个单词的整数映射。

上述解决方案的问题在于连续的文本流,我们不知道唯一字的总数,或m。任何人都可以提出更好的算法吗?

3 个答案:

答案 0 :(得分:2)

我认为你会更好地使用某种三元组的地图或哈希表,因为那时你只存储实际发生的三元组,而使用数组你可以为所有可能的三元组腾出空间。如果你看到n个单词,它们可能都是不同的,在这种情况下你存储了大约三个三元组 - 但是n个不同单词的所有三元组的数组大小为n ^ 3.

作为好奇心,有从非负整数对到非负整数的双射映射。一个是(a,b) - >(a + b)(a + b + 1)/ 2 + b,其映射(0,0)(0,1)(1,0)(0,2)( 1,1)(2,1)...到0,1,2,3,4,5,...... - 将它想象为通过将它们写在正方形中然后编号对角线来对对进行编号。您可以使用此两次将数字三元组映射到单个数字:(a,b,c) - > ((a,b),c)。然而,它并不是非常实用。

答案 1 :(得分:0)

另一种选择是使用std::string作为地图的关键。 每个键可以是3个单词的串联。这样,您可以唯一地定义每个三元组,而无需了解m

但是,您必须为2个字符串实现 order 运算符,并将其作为地图声明的第三个参数传递,如此主题中所述:std::string as a key in std::map using a compare operator

希望它有所帮助!

答案 2 :(得分:0)

map<vector<unsigned int>, unsigned int> sequenceFrequency;
vector<unsigned int> codedWord;

void MapSequenceFrequency(unsigned int key0, unsigned int key1, unsigned int key2)
{
    codedWord[0] = key0;
    codedWord[1] = key1;
    codedWord[2] = key2;

    map<vector<unsigned int>, unsigned int>::iterator it;

    if (sequenceFrequency.find(codedWord) == sequenceFrequency.end())
        sequenceFrequency[codedWord] = 0;
    else
        sequenceFrequency[codedWord]++;
}