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