- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了一个问题,我们必须在 1 TB 的文件或字符串中找到最常用的 10 个单词。
我能想到的一个解决方案是使用哈希表(单词、计数)和最大堆。但是,如果单词是唯一的,则拟合所有单词可能会导致问题。我想到了另一种使用 Map-Reduce 的解决方案,方法是将 block 拆分到不同的节点上。另一种解决方案是为所有单词构建一个 Trie,并在我们扫描文件或字符串时更新每个单词的计数。
以上哪一个是更好的解决方案?我认为第一个解决方案非常幼稚。
最佳答案
将可用内存分成两半。使用一个作为 4 位 counting Bloom filter另一半是带有计数的固定大小的哈希表。计数布隆过滤器的作用是过滤掉很少出现的词,内存效率高。
对照最初为空的布隆过滤器检查您的 1 TB 单词;如果一个词已经存在并且所有桶都设置为最大值 15(这可能部分或全部是误报),则通过它。如果不是,请添加。
通过的单词被计算在内;对于大多数单词,这是您看到它们的每一次,但前 15 次。一小部分会更快地开始计算,从而给您的结果带来每个单词最多出现 15 次的潜在不准确性。这是布隆过滤器的局限性。
第一遍结束后,如果需要,您可以通过第二遍纠正不准确之处。取消分配布隆过滤器,也取消分配第 10 个最频繁出现的单词后 15 次出现之外的所有计数。再次检查输入,这次准确地计算单词数量(使用单独的哈希表),但忽略第一次通过时未保留为近似获胜者的单词。
注意事项
在第一遍中使用的哈希表理论上可能会溢出输入的某些统计分布(例如,每个单词恰好 16 次)或极其有限的 RAM。您可以自行计算或尝试这是否会实际发生在您身上。
另请注意,桶宽(上述描述中为 4 位)只是构造的一个参数。一个不计数的布隆过滤器(桶宽度为 1)可以很好地过滤掉大多数独特的单词,但不会过滤掉其他很少出现的单词。更宽的桶大小将更容易出现单词之间的串扰(因为桶会更少),并且还会降低第一次通过后保证的准确度水平(在 4 位的情况下出现 15 次)。但在某些时候,这些缺点在数量上是微不足道的,而我认为更积极的过滤效果对于将哈希表保持在亚千兆字节大小和非重复的自然语言数据是完全关键的。
至于布隆过滤器本身的数量级内存需求; these people正在以低于 100 MB 的方式工作,并且具有更具挑战性的应用程序(“完整”n-gram 统计信息,而不是阈值 1-gram 统计信息)。
关于algorithm - TB 数据中出现频率最高的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12525455/
我刚刚开始学习,我的一项练习需要帮助。 我需要最终用户输入每个月的降雨量。然后我需要输出平均降雨量、最高月份和最低月份以及降雨量高于平均水平的月份。 我一直在最高和最低中得到相同的数字,我不知道为什么
我试图让一排 div 都与最高的那个的高度相匹配,所以它们看起来是统一的。 我已经阅读了很多这方面的资料,但似乎找不到任何适用于跨浏览器的解决方案。 我目前使用的脚本是: var maxHei
我有一个像 [1,4,3,1,6,5,1,4,4] 的数组 这里最高元素频率是 3 ,我需要从数组中选择频率为 3 的所有元素,如上例中的 [1,4] 。 我已经尝试过这个 var count = {
我有一个学生记录列表,grades ,我想按 GPA 排序,返回前 5 个结果。由于某种原因count awk '{ if (count awk '{ if (count<=8) print $3,
我有一个用于显示博客文章的页面。在页面的开头,我使用以下 SQL 获取数据: SELECT posts.*, count(comments.post_id) as number_of_comments
我有一张 table 城市 |状态|比赛|值(value) 可以有多个相同城市/州/种族和不同值的记录。 我想创建一个新表,其中每个城市|州|种族有一条记录 与 计数(原始表中包含城市/州/种族的记录
我是一名初级 Java 程序员(例如 0 级...)。我正在做这个项目,但我已经被难住了好几天了。我可能还有很多我没有注意到的小错误。 项目是这样的: 要求用户输入从 0.00 到 100.00 的一
我已经对我的数据进行了分组。现在,我要做的是每周从“高”列中选择最高值,并从“低”列中选择最低值,然后使用最高值减去最低值得到范围。但是代码总是错误的。有人对我有想法吗? 这是我的 DataFrame
所以几个月前我在参加编程面试时,由于某种原因这个问题让我绊倒了。我可以想到几个解决方案,但其中大多数似乎效率极低。虽然多年来我一直以某种身份进行编程,但我目前正在大学攻读 CS 学位,所以我的引用点可
我已经制定了一个程序来显示给定日期的特定时间的最高和最低流行项目。该过程没有错误或异常,并且一切正常。如您所见,为了显示 Items 的第一条记录,查询重复了两次,但唯一的区别在于顺序(ASC 和 D
我正在尝试将配对的 div 设置为相同的高度。 Some text Some text Some textSome textSome textSome textSome text Som
R 提供了最大值和最小值,但除了对整个向量进行排序然后从此向量中选取值 x 之外,我没有看到一种真正快速的方法来查找顺序中的另一个值。 例如,是否有更快的方法来获取第二高值? 最佳答案 使用sort(
这是我的命令: top -b -n 1 | head -3 | tail -n 1 | awk '{ print $2 }' 我运行一个 bash 脚本来获取这些详细信息(还有平均负载和内存消耗)并将
对于这个计划,我的目标是...使用 findKth 查找最高分、最低分、中位数和平均分用户必须输入数字(输入-1以停止扫描),但他们不知道有多少个以及是否已排序但是,我在尝试执行此操作时遇到了一些问题
我正在创建这个网站: https://www.melkerhei.be/smeltkroes/index.html 左上角的标志应该是可以点击的。这是代码:
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我的 table 是这样的: name | var ---------------- Joe | 3 Liz | 1 Liz | 4 Joe | 2 Peter
我有这个: function sayHello() { return new Promise( resolve => { throw new Error('reject');
JSFiddle:Example 我正在寻找一种方法来使容器 div 的高度等于其最高的子级。 每个其他子项的大小都应调整为容器的高度。 如果子元素超出其宽度,我还需要容器水平滚动。 到目前为止,我已
我有一个大小为 208 的列表(208 个句子数组),它看起来像: all_words = [["this is a sentence ... "] , [" another one hello bo
我是一名优秀的程序员,十分优秀!