- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下任务:
对于每个标签 X,我需要找到前 10 个 Y 标签,其中 X 和 Y 都出现在文档中,按 X 和 Y 同时出现的文档数量排序。
这个任务似乎很难解决:
有没有什么方法可以解决这个问题,而不用将所有组合都保存在内存中,或者使用并行算法(类似于 map reduce)来解决?如果我不需要它 100% 准确怎么办?
最佳答案
我认为在一般情况下,您将无法避免非常糟糕的运行时间 - 每个文档中有 5050 对,10M 文档,所有组合似乎都是可能的。
但是,在典型的现实世界数据中,您很少需要处理“对抗性”输入。一种可能的解决方案是首先计算所有 100K 项的出现次数,对它们进行排序,然后针对每个项 X,执行以下操作:
对于一个行为良好的文档集,其中 100K 项遵循关于文档计数的对数曲线,您将做的工作远远少于 (100)^2 * 10M 的工作,而天真的解决方案在所有情况下都需要这样做。诚然,对于性能不佳的文档集,您最终会做更多的工作,但这在现实世界中不应该发生。
至于“不是 100% 准确”,这个规范太模糊了,无法使用。什么样的错误是允许的?有多少?
---评论响应(评论太大)---
a) 考虑确定 1 亿个元素的最大值。您只需要保存扫描时最好的 1 个 - 同样的原则适用于确定 N 个项目中的前 X 个。将传入的元素添加到一个二叉堆中,当堆的大小超过X时,移除最弱的元素。添加结束,你将拥有顶部的X
b) 假设您正在确定前 10 个 X&Y 对,其中 X="Elephant"。假设在扫描 1000 个 Y 术语后,你有一个大小为 10 的堆,其中最小得分对的计数为 300。现在假设你检查的第 1001 个术语的文档计数为 299 - 因为只有 299 个文档有 Y 术语,最多299 个文档也有 X&Y,因此它不可能比你目前拥有的前 10 对中的任何一个更好,并且由于所有 Y 术语都按文档频率排序,事实上你现在知道你没有检查更多对!这就是 max 语句向您保证的。
c) 您为每个 X 做出的选择纯粹是一个优化决策。如果您有许多只存在于少量文档中的 X,那么这是一个很好的问题 - 这意味着每学期的工作量更少。
d) 如果您可以接受前 10 名错误的非零概率(对于每个术语),您可以通过使用抽样方法而不是完整、严格的扫描来减少运行时间索引。术语 X 在文档索引中越普遍,在根据您收集的信息可能拥有正确的前 10 个 X&Y 对之前,您必须(按比例)扫描的文档越少。得出这方面的确切数字需要了解相关索引中术语的预期分布。特别是:术语有多少相关性?数字 N(X)/MAXY(X) 通常是什么样子的,其中 N(X) 是包含术语 X 的文档数,MAXY(X) 是包含 X&Y 对的文档数,最大化所有项 Y != X
关于有序组合算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589245/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!