设事务n
数为,项目数为,事务k
的平均大小为d
。
天真的方法(检查所有记录中的对)将为您提供O(k^2 * n * d)
解决方案,但确实不是非常理想。但是我们可以将其改进为O(k*n*d)
,并且如果我们假设项目的均匀分布(即每个项目平均重复O(n*d/k)
次数) - 我们可能能够将其改进为O(d^2 * n + k^2)
(这要好得多,因为很可能是d << k
)。
这可以通过构建交易的倒排索引来完成,这意味着 - 创建从项目到包含它们的交易的映射(创建索引是O(nd + k)
)。
例如,如果您有交易
transaction1 = ('apple','grape')
transaction2 = ('apple','banana','mango')
transaction3 = ('grape','mango')
倒排索引将是:
'apple' -> [1,2]
'grape' -> [1,3]
'banana' -> [2]
'mango' -> [2,3]
因此,在了解什么是倒排索引之后 -以下是解决方案的指南:
- 为您的数据构建倒排索引
- 对于每个项目 x,迭代它出现的所有文档,并为所有与共同出现的对构建直方图。
(x,y)
y
x
- 完成后,您将获得一个包含 k^2 个项目的直方图,您需要对其进行处理。这个问题讨论了如何从未排序的列表中获取前 k 个元素。
复杂性分析:
- 建立倒排索引是
O(nd+k)
- 假设每个元素在
O(nd/k)
事务中重复,每次迭代都需要O(nd/k * d)
时间,而且你k
在这一步有迭代,所以你得到O(nd^2 + k)
了这一步。
- 如果您想要完全排序,或者如果您只想打印前 X 个元素,可以在 O(k^2logk) 中完成处理列表,它可以在
O(k^2)
.
总计O(nd^2 + k^2)
解决方案以获得 top-X 元素,这比天真的方法要好得多,假设d << k
.
此外,请注意,如果需要,可以在线程之间有效地并行化和分布瓶颈(步骤 2)。