擅长:python、mysql、java
<p>你真的需要预先计算所有可能的对吗?如果你懒洋洋地做,也就是按需办事呢?在</p>
<p>可以用二维矩阵表示。行对应于客户,列对应于产品。在</p>
<p>每个条目都是0或1,表示与列对应的产品是否由行对应的客户购买。在</p>
<p>如果你把每一列看作(大约5000)0和1的向量,那么两个乘积一起购买的次数就是相应向量的点乘!在</p>
<p>因此,你可以先计算这些向量,然后根据需要懒洋洋地计算点积。在</p>
<p>要计算点积:</p>
<p>现在,只有0和1的向量的一个好的表示是一个整数数组,它基本上是一个位图。在</p>
<p>对于5000个条目,需要79个64位整数的数组。在</p>
<p>因此,给定两个这样的数组,您需要计算常见的1的数量。在</p>
<p>要计算两个整数共有的位数,首先可以按位计算,然后再计算结果数中设置的1的数量。在</p>
<p>为此,您可以使用查找表或一些位计数方法(不确定python是否支持它们),例如:<a href="http://graphics.stanford.edu/~seander/bithacks.html" rel="nofollow noreferrer">http://graphics.stanford.edu/~seander/bithacks.html</a></p>
<p>所以你的算法是这样的:</p>
<ul>
<li><p>为每个产品初始化79个64位整数的数组。</p></li>
<li><p>对于每个客户,查看购买的产品并在相应的产品中为该客户设置适当的位。</p></li>
<li><p>现在给出两个产品的查询,你需要知道一起购买它们的客户数量,只需按照上面描述的dot产品。</p></li>
</ul>
<p>这应该相当快。在</p>
<p>作为进一步的优化,您可以考虑将客户分组。在</p>