[问题点数:40分]　本版专家分:24　结帖率　0%　自己无聊写了一个字典树和一个hash　map用来统计apche　log中reference每条出现的次数。　简单测试了一下,　hash　map统计3000多万条真实世界的数据,实际不重复的有60万条,　用了18second。　然后自己用shell随机产生了100万条记录(固定16个字节,只包含26个字母)　内存就受不了了。　trie　tree的每个节点是　struct　node_t　{　char　c;　bool　color;　node_t*　child[26];　}　这样每个节点就是100多个字节,　相当的浪费,　谁有没有优化建议　对接点的设计,　当然实际字符串不止包含26个字母　还有比如0-9,　?,&,+　etc...　要兼顾空间问题　和　字树查找问题(solution　1:　use　hash　map)?　欢迎排砖和建议,　想法　本版专家分:24　自己无聊写了一个字典树和一个hash　map用来统计apche　log中reference每条出现的次数。　简单测试了一下,　hash　map统计3000多万条真实世界的数据,实际不重复的有60万条,　用了18second。　然后自己用shell随机产生了100万条记录(固定16个字节,只包含26个字母)　内存就受不了了。　trie　tree的每个节点是　struct　node_t　{　char　c;　bool　color;　node_t*　child[26];　}　这样每个节点就是100多个字节,　相当的浪费,　谁有没有优化建议　对节点的设计,　当然实际字符串不止包含26个字母　还有比如0-9,　?,&,+　etc...　要兼顾空间问题　和　子树查找问题(solution　1:　use　hash　map)?　欢迎排砖和建议,　想法　空间优化的字典树　(同步个人博客　http://sxysxy.org/blogs/29　到csdn)字典树空间优化如果字典树要储存的字符串的字符集比较大,(比如全部的字符),甚至可能有多字节字符。这是我们给每个节点256个子节点吗?　用平衡树(或map　)牺牲时间来换取空间吗?不,可以进行这样的优化:　我们考虑把一个8位的char,拆开变成2个4位的数据,依次加入字典树。显然4位最大值也只是2^　本版专家分:77501　黄花　2007年4月C/C++大版内专家分月排行榜第二　2007年3月C/C++大版内专家分月排行榜第二　2007年2月C/C++大版内专家分月排行榜第二　2007年1月C/C++大版内专家分月排行榜第二　2006年12月C/C++大版内专家分月排行榜第二　蓝花　2007年9月C/C++大版内专家分月排行榜第三　2007年8月C/C++大版内专家分月排行榜第三　2006年11月C/C++大版内专家分月排行榜第三　海量数据就别用这种小型工具了。　试试数据库吧。　DoubleArrayTrie　:　DAT双数组Trie树　本文参考:　http://www.cnblogs.com/ooon/p/4883159.html推荐:　码农场的《双数组Trie树(DoubleArrayTrie)Java实现》　外文《An　Implementation　of　Double-Array　Trie》DoubleArrayTrie　双数组Tire树是Tire树的升级版,Tire取自英文Retrieval中的一部分,即检索树,又称作　本版专家分:46334　黄花　2006年2月C/C++大版内专家分月排行榜第二　挺好的。。。　。。。　实际的数据量在那里呢,另外你说的内存就受不了了,你是怎么知道的?　Hash树(散列树)和Trie树(字典树、前缀树)　1.Hash树理想的情况是希望不经过任何比较,一次存取便能得到所查的记录,那就必须在记的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和一个唯一的存储位置相对应。因而在查找时,只要根据这个对应关系f找到给定值K的像f(K)。由此,不需要进行比较便可直接取得所查记录。在此,我们称这个对应关系为哈希(Hash)函数,按这个思想建立的表为哈希表。在哈希表中对于不...　本版专家分:9840　建议测试一下STL的std::map和扩展的hash_map的性能,好有个参照物做比较　本版专家分:24　引用　2　楼taodm　的回复:　海量数据就别用这种小型工具了。　试试数据库吧。　有时候,　海量数据　数据库是承受不了这么大的写入的,　呵呵　本版专家分:64318　进士　2009年　总版技术专家分年内排行榜第六　金牌　2009年4月　总版技术专家分月排行榜第一　红花　2009年11月Linux/Unix社区大版内专家分月排行榜第一　2009年6月Linux/Unix社区大版内专家分月排行榜第一　2009年4月C/C++大版内专家分月排行榜第一　2009年3月C/C++大版内专家分月排行榜第一　2009年3月Linux/Unix社区大版内专家分月排行榜第一　2009年2月Linux/Unix社区大版内专家分月排行榜第一　黄花　2010年1月C/C++大版内专家分月排行榜第二　2009年10月Linux/Unix社区大版内专家分月排行榜第二　2009年9月Linux/Unix社区大版内专家分月排行榜第二　2009年8月C/C++大版内专家分月排行榜第二　2009年8月Linux/Unix社区大版内专家分月排行榜第二　2009年7月C/C++大版内专家分月排行榜第二　2009年6月C/C++大版内专家分月排行榜第二　2009年5月C/C++大版内专家分月排行榜第二　2009年5月Linux/Unix社区大版内专家分月排行榜第二　2009年4月Linux/Unix社区大版内专家分月排行榜第二　2009年2月C/C++大版内专家分月排行榜第二　2009年1月Linux/Unix社区大版内专家分月排行榜第二　trie　tree找找单词也就行了。　我觉得实现起来是很麻烦的。　struct　node_t　{　char　c;　bool　color;　node_t*　child[26];　}　这样每个节点就是100多个字节,　相当的浪费,　贴你的trie树源码看看。。　我曾经考虑去掉char　c;　这个数据。　而预分配26bit代替node_t*　child[26];　有位图来标识26字母。　Trie树-字符串多模式匹配　Trie　树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起构建　Trie　树的过程比较耗时,对于有　n　个字符的字符串集合而言,需要遍历所有字符,对应的时间复杂度是　O(n),但是一旦构建之后,查询效率很高,如果匹配串的长度是　k,那只需要匹配　k　次即可,与原来的主串没有关系,所以对应的时间复杂度是　O(k),基本上是个常量级的数字。应用场景:1.敏感词过滤2.搜索框联想...　本版专家分:77501　黄花　2007年4月C/C++大版内专家分月排行榜第二　2007年3月C/C++大版内专家分月排行榜第二　2007年2月C/C++大版内专家分月排行榜第二　2007年1月C/C++大版内专家分月排行榜第二　2006年12月C/C++大版内专家分月排行榜第二　蓝花　2007年9月C/C++大版内专家分月排行榜第三　2007年8月C/C++大版内专家分月排行榜第三　2006年11月C/C++大版内专家分月排行榜第三　商用的数据库不行的话,你自己小打小闹搞的东西就更不行了。　基于Trie树的多模匹配算法实现和及优化　1.多模匹配算法简介 　 　多模式匹配在这里指的是在"一个字符串"中寻找"多个模式字符字串"的问题。一般来说,给出一个长字串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字串中是我们需要思考的(因为基本上大多数情况下是在给定的长字串中出现我们给的模式字串的其中几个)该算法的应用领域有很多,例如: 　 　(1)关键字过滤 　 　(2)入侵检测 　 　(3)病毒检　本版专家分:9840　引用　5　楼ccj_19850121　的回复:　引用　2　楼taodm　的回复:　海量数据就别用这种小型工具了。　试试数据库吧。　有时候,　海量数据　数据库是承受不了这么大的写入的,　呵呵　数据库根本扛不住这种需求的,　就是mysql的内存表都太慢了,一次数据库查询,　需要上下文切换+通信若干次,性能低的一塌糊涂。　本版专家分:24　引用　3　楼healer_kx　的回复:　挺好的。实际的数据量在那里呢,另外你说的内存就受不了了,你是怎么知道的?　实际的数据量　-〉是随机的产生的〉100万条记录　内存就受不了了　=〉因为我用的是内存池,　跑了一会malloc就分配不出内存了,　进程内存涨到3.5g　Trie树Trie树Trie树也称字典树,因为其效率很高,所以在在字符串查找、前缀匹配等中应用很广泛,其高效率是以空间为代价的。