比较数字还是使用素数?

时间:2011-05-04 13:07:10

标签: java mysql performance combinations

我正在编写一个生成宾果卡号码的程序。宾果卡由5列组成,每列4个数字。对于第一列,只能包含数字1-8,第二列9-16等等(最多40个)。

所以在数据库中,我做的是我有两个表。第一个表用于列号。每列包含一组唯一的数字(每列70个,这是8个组合4)。对于5列,我将有350套。第二个表是卡号。它由5列组成,每列对应于B,I,N,G,O的行。总共有1,680,700,000。该表的可能组合。我这样做是因为每张游戏的每张牌都是重复的,只有牌的控制号才是唯一的。

我想跟踪每个抽出号码的获胜卡片。我需要尽可能快地跟踪,因为在这里谈论数以百万计的卡片。我想到了两个选项:

首先,检查卡上是否存在每个抽出的号码,最小化每次抽奖的卡片池。

其次,为每个数字(1-40)关联一个唯一的素数,将它们相乘并将产品与列相关联(我将其称为主要指数)。每列的5个主要索引相乘,产品与每个卡/组合(我称之为卡索引)相关联。绘制数字时,将相关的素数从卡片索引中划分,检查所绘制的数字是否是卡片索引的因子。每次连续抽奖都会减少卡片索引(对于池中的每张卡片),如果存在获胜卡片,则减少到1。我将使用MySQL和Java。这两种技术中哪一种更快?我也考虑了内存空间,负载等,但对我来说跟踪的速度更重要。非常感谢!

P.S。很抱歉很长的解释。我只想澄清一些事情。 :d

3 个答案:

答案 0 :(得分:2)

如果你想要真正快速,只需要在需要时将你的2400万张卡留在内存中,然后进行简单的比较。使用数据库是过度的,只会让一切变得更加困难。 RAM不再贵了。

答案 1 :(得分:1)

正好有70 ^ 5 = 1,680,700,000张可能的牌。无需存储卡本身。您可以直接计算卡上的数字,仅使用索引。相反,给定数字找到卡片的指数,只是有点难度。

例如,卡#1421934546。将其放在基数70中给出:59 15 40 50 46。 (我的意思是46 + 70*50 + 70^2*40 + 70^3*15 + 70^4*59 = 1421934546)。因此,第一列是第46列(实际上是第47列因为一个一个)取得了可能的70次拍摄。

根据绘制的数字,您可以快速找到匹配的列。例如,使用数字1,2和3.第一列中有5组匹配,1234123512361237和{{1} }。因此,所有匹配的卡在这5个ID中都有%70。如果您找到每列的所有可能集合,则笛卡尔积将提供所有匹配的卡片。

答案 2 :(得分:0)

您不必像在卡上那样将数据排列在内存中。例如如果你有N个方块可以选择或不选择,BitSet可能是一个不错的选择。这使用每平方1位(带有一些开销)。

假设您有多达64个方格,这是一个长值(64位)。如果你有100万张牌。这将占用8 MB的内存。一旦您确定哪些卡是获胜者,您就可以确定所有者是谁。 (这可以存储在数据库中)

假设您向美国的每个成年人出售一张卡片。 (AFAIK,没有彩票从未如此流行)每说一美元,你将带来2亿美元。您需要1.6 GB的内存,这将适合4 GB的服务器,成本约为500美元。你可以买一台16 GB的服务器,价格大约1000美元。 ;)