Faster alternative to nested loops?

后端 未结 12 1460
栀梦
栀梦 2020-12-12 18:35

I have a need to create a list of combinations of numbers. The numbers are quite small so I can use byte rather than int. However it requires many

12条回答
  •  暖寄归人
    2020-12-12 19:35

    On my machine, this generates the combinations in 222 ms vs 760 ms (the 13 for loops):

    private static byte[,] GenerateCombinations(byte[] maxNumberPerLevel)
    {
        var levels = maxNumberPerLevel.Length;
    
        var periodsPerLevel = new int[levels];
        var totalItems = 1;
        for (var i = 0; i < levels; i++)
        {
            periodsPerLevel[i] = totalItems;
            totalItems *= maxNumberPerLevel[i];
        }
    
        var results = new byte[totalItems, levels];
    
        Parallel.For(0, levels, level =>
        {
            var periodPerLevel = periodsPerLevel[level];
            var maxPerLevel = maxNumberPerLevel[level];
            for (var i = 0; i < totalItems; i++)
                results[i, level] = (byte)(i / periodPerLevel % maxPerLevel);
        });
    
        return results;
    }
    

提交回复
热议问题