摘要: 还有一种经常使用的策略是bitmap.Bitmap本身也是一种hash-table, 只不过hash的结果恰好落在[0, sizeof_bitmap_in_bits]内. 因为hash到的每个slot只有一个bit,所以通常用作判断是否存在等bool型的问题.例子, 已知40亿个不重复的unsigned int, 如何判断一个整数在不在这40亿个整数里面?给定说unsigned int,其实是指定了元素的可能范围, [0, 2^32 – 1]中, 注意2^32=42,9496,7296, 大约是42亿.判断存在与否, 一个bit就够了,而记录所有的uint32_t, 4GB/8=512MB的b 阅读全文
posted @ 2011-05-10 22:20 qsort 阅读(968) 评论(0) 推荐(0) 编辑
摘要: 问题:日志文件中, 寻找10个访问量最大的IP地址类似的变种还有:1, 搜索引擎搜索记录中, 寻找10个最热门的搜索词;2, 一个大文件里面, 寻找10个出现频率最高的单词;3, web proxy的记录里,寻找前10个访问最多的url;4, 对搜索引擎的搜索记录按照频率进行排序;5, 海量数据中,找到出现频率最高的一个;这些问题一般都要求数据无法完全放入内存, 要么强调数据有100G, 300G, 要么强调只能用1G内存什么的. 这么要求的目的在于避免被提问者直接走一遍统计一下完事.解决的思路是divide andconquer, 而divide的办法是对key或者元素进行hash, 然后分 阅读全文
posted @ 2011-05-10 21:52 qsort 阅读(758) 评论(0) 推荐(0) 编辑
摘要: 如何选择合适的bitmap大小以及hash函数的个数?数学分析略,可参见wiki上面的页面(简单的概率论知识),结论如下:给定允许的错误概率p,以及元素个数n,总的bit数m应为:m >= -n*ln(p) / (ln2) / (ln2)譬如,如果给定错误率p为0.001,代入可得 m >= 14.4n给定n和m以后,选择多少个hash function也是一个问题,结论如下:hash函数的个数k应为:k = m * ln2 / n,也即 k = 0.7 * m / n.再次用上面的p=0.001的例子,m >= 14.4n, 那么k = 0.7 * 14.4 = 10如果p 阅读全文
posted @ 2011-05-10 12:49 qsort 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 拓扑排序:应用于DAG图。先遍历一遍(DFS、BFS),每个节点标记入度(in-degree)。入度 为0的节点,放入一个队列。初始时,该队列中的元素都是第一批的点(不依赖于任何其他元素);之后,弹出该队列中所有元素,将其后继结点的入度减一,如果后继节点入度降为0,则放入该队列。重复以上步骤,这样就分批次的标记上了依赖关系的排序。单源最短路径Dijkstra:是一个集合不断扩张和节点距离不断更新(减小)的过程,两个要点:如何更新节点的距离、如何选择下一个节点加入S。初始时,集合S仅包含源点s,其他节点的到源点的距离Dist设为无穷。将当前节点curr设为s之后,对当前节点s,如果s的某个邻居w 阅读全文
posted @ 2011-05-10 00:07 qsort 阅读(816) 评论(0) 推荐(0) 编辑