循环1000 * 256 * 4需要一分钟才能完成

时间:2013-09-03 20:16:05

标签: ios objective-c for-loop

我正在尝试查看简单赌博游戏的中奖号码。 用户选择每个符号的4张牌(钻石,心脏等),并由此为该特定选择创建256种组合。 4 * 4 * 4 * 4 = 256种组合。 我有一系列1000抽奖结果。每个结果包含4张获胜卡及其数值。

我需要检查每个结果包含多少张获胜卡片。

我的代码看起来像这样:

    for(int=0;i<results;i++) // [results count] = 1000
    {
         ...
         ...
        //take one results and check it against all combinations 
       for(int j=0;j<userCombinations;j++) // [userCombinations count] = 256
       {
        [self checkWins:[userCombinations objectAtIndex:j]]
       }
    }

-(void)checkWins:(NSMutableArray *)myArray
{
         for(int j=0;j<4;j++)
       {
        //j=0 -> if heart numeric value equals to heart numeric result do something
        //j=1 -> if diamond numeric value equals to diamond numeric results do something

       }
}

代码中可能存在一些拼写错误(从内存中写入),但基本思路是一样的。 我的问题是,上面的过程需要:

  • 我的i7 Mac Book Pro上的几秒钟

  • 在旧的Android上,上面用java编写,需要6-9秒。

  • 在iPhone 4上完成整个过程需要一分钟。 &LT; - 这是我的问题

我做错了吗?你能想到更好的方法吗? 有没有办法加快速度?

由于

修改

用户选择这些数字

H  D  C   S
7  8  9  10
10 4  2  11
11 6  5  13
12 5  1  9

获得256种组合。

First 6 combinations:      Current Raffle Result: 7 4 9 11
    H  D  C   S
    7  8  9  10    2 matches
    7  8  9  11    3 matches
    7  8  9  13    2 matches
    7  8  9  9     2 matches
    7  8  2  10    1 match
    7  8  2  11    1 Match
    etc'...        

              Total for Current Raffle Result 7 4 9 11:
                   3 matches - one time
                   2 matches - 3 Times
                   1 match - 2 times

我需要传递所有创建的256个组合,并针对每个获胜结果进行检查。如果其中一个组合包含中奖号码,我将其标记并将其保存在一个数组中,以便稍后显示。

2 个答案:

答案 0 :(得分:3)

我这样做的方法是将每个抽奖结果表示为一个有序的C字符串,例如c5d3h4s6其中c5 = 5个俱乐部来自s6 = 6个黑桃。同样,将用户选择命名为c-string,例如c2c3c4c6d1d2d3d4h4h5h6h7s7s8s9s10

这样做的目的是让您不再需要内置循环来置换用户选择。 对于每个抽奖活动,您可以对选择进行一次扫描,以确定c5d3h4s6是否匹配。结果应该快一个数量级。

注意我们这里没有使用Objective-C方法调度,因为它在性能方面没有帮助。

答案 1 :(得分:0)

考虑使用数学(组合学或仅计数......)来解决这个问题。

考虑1个用户猜测 - 16个卡 - 和1个结果 - 4个卡。通过最多16次比较,您可以确定匹配的套装数量。

如果只有一件西装匹配,那么就有4 ^ 3种组合,其中一件西装匹配。

如果2个套装匹配,则有4 ^ 2个组合,其中两个匹配。但你也想计算单场比赛。从上面来看,这些单个匹配的一个有4 ^ 3个匹配,但是其中一些与双重匹配重叠,所以你需要减去4 ^ 3中的4 ^ 2来得到just的数量1场比赛。现在,当您开始进行2场比赛时,您需要考虑两个单场比赛......

继续3&amp; 4套装匹配 - 这只是数学,在这个级别不需要循环...

但你可以做得更好;结果是基于匹配数(0-4),这意味着您可以预先计算结果,如果在数学中丢失,只需枚举可能性和计数。这会让你降到1000(解决方案的数量)x(最多16次比较+查找)。

HTH。