查找30,000多个数据集之间的匹配

时间:2012-10-24 12:30:50

标签: mysql sql algorithm graph-algorithm

为了简单起见,让我们使用3种颜色和相应数字的案例(尽管现实中有30,000多种不同的“颜色”和254种不同的“数字”)

红色 - 0,1,2,3,10,15

绿色 - 0,2,3,20

蓝色 - 2,10,11,12

我想找到它们之间的匹配(rgb,rg,rb),并保持集合之间共享的#s数量的计数:

rgb = 1

rg = 2

rb = 2

最后,它需要确定共享的#s数量与集合中不同#s数量的比率。

rgb = 1/9(因为它有一个独特的:0,1,2,3,10,11,12,15,20)

rg = 2/7(0,1,2,3,10,15,20)

rb = 2/8(0,1,2,3,10,11,12,15)


所以总输出为

匹配|匹配数量| %|

rgb | 1 | 1/9

rg | 2 | 2/7

rb | 2 | 2/8


我能够出现的算法是你在表格中有每种颜色并映射与之相关的数字(又名红色(表名),0,1,2,3,10,15(数据) )。然后使用最多“数字”的颜色并将其与其他颜色的小时数进行比较,找到匹配项。完成该颜色后,您可以100%忽略它并移动到下一个颜色并与n-1进行比较。

举个例子:

1)选择红色

2)是否有其他颜色共享0

3)是否有其他颜色共享1

....等

4)选择蓝色 5)是否有其他颜色减去红色份额.....

我知道必须有更有效的方法来做这个,有什么建议吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

由于只有254(如果您的0-254评论是正确的,则为255),那么您可以表达'数字'对于每种颜色'作为256位整数。那么r和g的共享数字的数量就是(r和b)的bitcount,而不同数字的数量是(r或b)的bitcount,所以使用你的例子,

如果R是红色的位设置,G是B等的位集:

match | # of matches            | %                                             |
rgb   | bitcount(R and G and B) | bitcount(R and G and B)/bitcount(R or G or B) |
rg    | bitcount(R and G)       | bitcount(R and G)/bitcount(R or G)            |
rb    | bitcount(R and B)       | bitcount(R and B)/bitcount(R or B)            |