Java 比较数字还是使用素数?

Java 比较数字还是使用素数?,java,mysql,performance,combinations,Java,Mysql,Performance,Combinations,我正在写一个生成宾果卡号的程序。宾果卡由5列组成,每列4个数字。因为第一列只能包含数字1-8,第二列只能包含数字9-16,依此类推(最多40) 所以在数据库中,我做的是我有两个表。第一个表是列编号。每列包含一组唯一的数字(每列70组,是8和4的组合)。对于5列,我将有350套。第二张表是卡号。它由5列组成,每列对应于B、I、N、G、O的行。总共有1680700000列。此表的可能组合。我这样做是因为每场比赛每张牌都是重复的,只有牌的控制号码是唯一的 我想追踪每一个抽奖号码的中奖牌。我需要尽快追踪

我正在写一个生成宾果卡号的程序。宾果卡由5列组成,每列4个数字。因为第一列只能包含数字1-8,第二列只能包含数字9-16,依此类推(最多40)

所以在数据库中,我做的是我有两个表。第一个表是列编号。每列包含一组唯一的数字(每列70组,是8和4的组合)。对于5列,我将有350套。第二张表是卡号。它由5列组成,每列对应于B、I、N、G、O的行。总共有1680700000列。此表的可能组合。我这样做是因为每场比赛每张牌都是重复的,只有牌的控制号码是唯一的

我想追踪每一个抽奖号码的中奖牌。我需要尽快追踪,因为这里有数百万张卡片。我想到了两种方法:

首先,检查每个抽签号码是否存在于卡上,最小化每次抽签的卡池

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


顺便说一句,很抱歉这么长时间的解释。我只是想澄清一下D

如果你想变得非常快,只需在需要时将2400万张卡保存在内存中,并进行简单的比较即可。为此使用数据库是一种过分的做法,只会让一切变得更加困难。RAM不再昂贵。

有70^5=1680700000张可能的卡。不需要存储卡本身。你可以直接计算卡片上的数字,只需要索引。另一种方法是,给定数字,找到卡片的索引,只是有点困难

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


给定绘制的数字,您可以快速找到匹配的列。例如,使用数字1、2和3。第一列中有5组匹配,
1234
1235
1236
1237
1238
。所以,所有匹配的卡都有这5个ID中的%70个。如果找到每列的所有可能集合,笛卡尔乘积将给出所有匹配的卡片

您不必像在卡上一样排列内存中的数据。e、 g.如果您有N个可以选择或不选择的正方形,则位集可能是一个不错的选择。这使用每平方1位(有一些开销)

假设您最多有64个正方形,这是一个长值(64位)。如果你有一百万张卡。这将占用8 MB的内存。一旦您确定哪张卡是赢家,您就可以确定谁是所有者。(这可以存储在数据库中)


假设你向美国的每个成年人出售一张卡片。(好吧,从来没有彩票这么受欢迎过)假设每人1美元,你就可以带来2亿美元。您需要1.6GB的内存,可以轻松装入一台耗资约500美元的4GB服务器。您可以花1000美元左右购买一台16GB的服务器,这只是为了确定

没有数据库我就做不到,因为我还跟踪卡的所有者以及在哪里购买的?正如我前面提到的,每张牌都是复制的。即使有2400万张卡,其中包含40个64位数字(如果你将卡号存储在一个大的64位数字中,这本身就是一种滥杀),你仍然只需要40*8=320 MB的RAM来存储整个可能的卡集。就卡的所有者而言,你仍然可以在内存中这样做。我的意思是,从某种意义上说,数据库只是一种存储大量数据的方法,而这些数据是无法存储在RAM中的。如果出于某种原因需要将卡存储在数据库中,则可以在应用程序关闭时保存它们。320MB的RAM,除非你在某个RAM限制非常严格的嵌入式系统上,基本上是一个非常小的RAM量。实际上它是一个十亿个卡组合。还可能吗?您可以将所有者ID保留在内存中,并根据内存中确定的结果更新/查找数据库。我将使用素数。我认为,它比使用带有附加和附加功能的base 70快得多multiplications@Jairo-嗯。我的方法真的不同。我的意思是,你不需要搜索中奖的牌,你只需要计算它。即使使用加法和乘法,速度也更快。