有没有办法在不到O(n)时间内基于属性或谓词从大集合中选择子集?
举个简单的例子,假设我有很多作者.每个作者与一组书籍有一对多的关系,与出生城市有一对一的关系.
有没有办法有效地进行查询,例如"获得出生在芝加哥的作者的所有书籍"?我能想到的唯一方法是首先从城市中选择所有作者(快速获得良好的索引),然后迭代它们并累积所有书籍(芝加哥的作者数量O(n)在哪里n).
我知道数据库在某些连接中做了类似的事情,Endeca声称能够使用他们所谓的"记录关系导航"来"快速"执行此操作,但我无法找到有关所使用的实际算法的任何信息.他们的计算复杂性
我并不特别关心确切的数据结构......我很想学习如何在RDBMS,键/值存储库或任何事情中做到这一点.
那么,这种性质的三度或四度请求呢?(给我生活在移民人口超过10,000的城市的作者写的所有书籍.)是否有一个广义的n度算法,它的性能特征是什么?
编辑:
我可能只是非常密集,但我不知道倒排索引建议如何帮助.例如,假设我有以下数据:
DATA
1. Milton England
2. Shakespeare England
3. Twain USA
4. Milton Paridise Lost
5. Shakespeare Hamlet
6. Shakespeare Othello
7. Twain Tom Sawyer
8. Twain Huck Finn
INDEX
"Milton" (1, 4)
"Shakespeare" (2, 5, 6)
"Twain" (3, 7, 8)
"Paridise Lost" (4)
"Hamlet" (5)
"Othello" (6)
"Tom Sawyer" (7)
"Huck Finn" (8)
"England" (1, 2)
"USA" (3)
Run Code Online (Sandbox Code Playgroud)
说我对"英国作家的书籍"进行了查询.很快,O(1)通过哈希表,我可以从英格兰得到我的作者名单:(1, 2).但是,为了下一步,为了检索书籍,我必须为每个集合 …
我知道他们在二月份宣布它将在明年过渡到社区开发的模型......但现在,我根本无法在他们的网站上找到它,更不用说应该的 4.5 版本了将于本月发布。
我即将开始一个主要项目的 GUI 部分,虽然我考虑过使用 Qt Jambi,但我对于是否要对显然已被放弃的产品创建主要依赖项感到犹豫。有谁知道这个的真实状况吗?我应该放弃并使用 Swing 吗?
我已成功使用单元测试一段时间了,但我开始认为它们只适用于实际执行大量逻辑的类/方法 - 解析器,数学运算,复杂的业务逻辑 - 所有测试的良好候选者, 没有问题.我真的很难弄清楚如何使用另一类对象的测试:那些主要通过委托操作的对象.
例证:我当前的项目协调了很多数据库和服务.大多数类只是服务方法的集合,大多数方法执行一些基本的条件逻辑,可能是for-each循环,然后调用其他服务.
对于像这样的对象,模拟实际上是唯一可行的测试策略,所以我尽职尽责地为其中的几个设计了模拟.我真的,真的不喜欢它,原因如下:
我的应用程序的核心实际上是所有部分如何协同工作,所以我正在考虑完全放弃单元测试(除了他们显然合适的地方)并转而进行外部集成测试 - 更难设置,覆盖更少可能的情况,但实际上是运行系统,因为它意味着运行.
我没有看到任何使用模拟实际上有用的情况.
思考?
这实际上是我正在研究的一个真正的问题,但为了简单起见,让我们假装我是谷歌.
假设用户搜索"纳米级特百惠".这两个词的页面都不多,只有3k左右.但是有大约200万页的"纳米级"和大约400万页的"特百惠".不过,Google在0.3秒内为我找到了3k.
它是如何做到的?
我所知道的唯一算法是获取"纳米级"的文档,获取"tupperware"的文档,然后进行列表合并.但那是O(N + M),或O(5,000,000)似乎有点慢.特别是如果我在桌面而不是超快集群上运行它.
谷歌正在做什么呢?他们的速度主要是因为他们在庞大的分布式集群上运行这种昂贵的计算?
还是有一个我不知道的更好的算法?维基百科和谷歌没有为我提供任何东西.
编辑:
由于人们似乎专注于我的问题的谷歌方面,我想我会在实际条款中重申它.
我有几个非常大(数百万项)的索引作为键/值对实现.键是简单的单词,值是文档集.一个常见的用例是在不同索引上的几次搜索中获得结果的交集:痛点是获取文档集的交集.
我可以重新实现我想要的索引 - 此时它主要是一个学术项目.
我正在阅读文档中的矛盾内容.
一方面,这段经文似乎表明连续的计划变量是可能的:
计划值范围是计划变量的可能计划值的集合.该集合可以是离散的(例如,行1,2,3或4)或连续的(例如,在0.0和1.0之间的任何双倍).
另一方面,在定义计划变量时,必须ValueRangeProvider在字段上指定要用于值集的注释:
Solution实现具有返回Collection的方法.该集合中的任何值都是此计划变量的可能计划值.
这两个片段都在文档的相同部分(http://docs.jboss.org/drools/release/latest/optaplanner-docs/html_single/#d0e2518)
那么,这是什么?我可以使用full double作为我的计划变量,还是需要将其范围限制为特定值Collection?
看看实际的算法,我没有看到任何实际上适合优化连续变量的东西,所以我怀疑它是否可能,但是如果澄清并明确表示它会很好.
optimization rule-engine constraint-programming drools-planner optaplanner
我正在为 Hadoop 构建自动安装脚本,但遇到了 HBase 无法启动的问题,因为 HDFS 尚未完全启动并准备就绪。我如何以编程方式(最好是从 Bash)判断 HDFS 系统是否已准备好供 HBase 启动,以便我可以等到它准备好为止?
我尝试使用“hadoop dfsadmin -report”并查找正确的节点数量,但显然在集群实际准备好业务之前仍然会返回。
indexing ×2
algorithm ×1
bash ×1
database ×1
hadoop ×1
hbase ×1
hdfs ×1
java ×1
mocking ×1
optaplanner ×1
optimization ×1
qt ×1
qt-jambi ×1
rule-engine ×1
search ×1
swing ×1
unit-testing ×1