数据字典php 数据字典名词解释( 四 )


所谓的是否能一次读入内存,实际上应该指去除重复后的数据量 。如果去重后数据可以放入内存 , 我们可以为数据建立字典,比如通过 map,hashmap,trie,然后直接进行统计即可 。当然在更新每条数据的出现次数的时候 , 我们可以利用一个堆来维护出现次数最多的前N个数据,当然这样导致维护次数增加,不如完全统计后在求前N大效率高 。
如果数据无法放入内存 。一方面我们可以考虑上面的字典方法能否被改进以适应这种情形 , 可以做的改变就是将字典存放到硬盘上,而不是内存,这可以参考数据库的存储方法 。
当然还有更好的方法,就是可以采用分布式计算,基本上就是map-reduce过程,首先可以根据数据值或者把数据hash(md5)后的值,将数据按照范围划分到不同的机子,最好可以让数据划分后可以一次读入内存,这样不同的机子负责处理各种的数值范围,实际上就是map 。得到结果后,各个机子只需拿出各自的出现次数最多的前N个数据 , 然后汇总,选出所有的数据中出现次数最多的前N个数据 , 这实际上就是reduce过程 。
实际上可能想直接将数据均分到不同的机子上进行处理,这样是无法得到正确的解的 。因为一个数据可能被均分到不同的机子上,而另一个则可能完全聚集到一个机子上 , 同时还可能存在具有相同数目的数据 。比如我们要找出现次数最多的前100个,我们将1000万的数据分布到10台机器上,找到每台出现次数最多的前 100个,归并之后这样不能保证找到真正的第100个,因为比如出现次数最多的第100个可能有1万个,但是它被分到了10台机子,这样在每台上只有1千个,假设这些机子排名在1000个之前的那些都是单独分布在一台机子上的,比如有1001个,这样本来具有1万个的这个就会被淘汰,即使我们让每台机子选出出现次数最多的1000个再归并,仍然会出错,因为可能存在大量个数为1001个的发生聚集 。因此不能将数据随便均分到不同机子上,而是要根据hash 后的值将它们映射到不同的机子上处理,让不同的机器处理一个数值范围 。
而外排序的方法会消耗大量的IO,效率不会很高 。而上面的分布式方法,也可以用于单机版本,也就是将总的数据根据值的范围,划分成多个不同的子文件,然后逐个处理 。处理完毕之后再对这些单词的及其出现频率进行一个归并 。实际上就可以利用一个外排序的归并过程 。
另外还可以考虑近似计算,也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那些词作为一个字典,使得这个规模可以放入内存 。
php语言字典代码求一PHP算法 , 字典生成 。时间一到再加100分 。如:字符:0-9,长度:1,
那就生成0,1,2,3,4,5,6,7,8,9
长度:2,就会生成00-99
现在要求字符可以包括a-z,或者其他特殊符号 , 求一高效的生成算法 。
参考答案一
function get_string($strlen){
$source='0123456789'; //任意字符
$len = strlen($source); //长度
$return = array();
for($i = 0 ;$i$len;$i++){
for($j = 0;$j$strlen;$j++){
$return[$i] .= $i;
}
}
return implode(',', $return);
}
如果输入长度2: 输出结果就是:
00,11,22,33,44,55,66,77,88,99
参考答案二
优化了进位算法:
PHP code =0;$no--){ $word=$source{$series[$no]}.$word; $series[$no]+=$tonext_value; if($no0){ if($series[$no]==$len){ $series[$no]=0; $tonext_value=https://www.04ip.com/post/1; }else{ $tonext_value=0; } } } echo"$word "; } } gene_dic(2); ?
简单的说,我会把这个理解为0-9(十进制)下十个数字生成两位数字、可重复的排列问题 。

推荐阅读