计算常见的字节,单词和双字

时间:2010-05-23 22:33:57

标签: data-structures compression

我正在扫描大量数据并寻找其中的常见趋势。每当我遇到一个单位的重现时,我想增加它的数量。保存此数据的最佳数据结构或方式是什么。我需要能够快速搜索它,并且还要对每个数据单元进行计数。

4 个答案:

答案 0 :(得分:3)

您没有指定语言,但hash (associative array)是您最好的数据结构。

有时可以根据语言将其称为map / hashmap(Java有HashMaps,Perl哈希哈希,。

散列/关联数组/映射数据结构由一组键值对组成,其值可通过键设置/获取。在这种情况下,键将是一个表示单词,字节或双字的字符串(单独的3个散列图),该值将是频率的计数。

答案 1 :(得分:1)

如果你需要快速查找,

Dictionary / Hash表是最好的。

答案 2 :(得分:1)

正如已经提到的,词典/哈希表是你最好的选择。但你的问题有点清楚,我注意到你在标签中提到压缩;您可能还想查看Huffman trees

答案 3 :(得分:1)

正如其他人所说,散列是您数据结构的明显候选者。

然而,出于开发和测试目的,我希望该结构比每个匹配项目的简单计数更丰富。相反,我希望存储信息可用于确认代码的正确性。

首先,该信息可能包含行号以及匹配发生位置的一些指示。以下是Perl中的插图:

use strict;
use warnings;

my %regexes= (
    rep_letter => qr/ ([a-z])         (\1   )+ /x,
    rep_word   => qr/ (\b \w+ \b) \W* (\1\W*)+ /x,
    doub_word  => qr/ (\b \w+   ) \W+  \1      /x,
);

my %ds;

while (my $line = <>){
    for my $r (keys %regexes){
        while ( $line =~ /$regexes{$r}/g ){
            # Data structure:
            #   $ds{REGEX_TYPE}{REPEATED_ITEM} = [
            #       [LINE_NO, pos_VALUE_OF_MATCH],
            #       etc. for each match
            #   ]
            #
            # For example:
            #   $ds{rep_word}{foo} = [
            #       [ 3, 11],
            #       [12, 88],
            #       ...
            #   ]
            push @{$ds{$r}{$1}}, [$., pos($line)];
        }
    }
}