C#/ VB .Net性能调整,生成所有可能的彩票组合

时间:2016-06-16 08:32:23

标签: c# sql-server vb.net performance

尝试为42个中的独特6个抽签生成所有可能的抽奖(组合)。

实际上寻找最有效的方法(这样实际生成不需要几天)。

除了处理HOG(这是预期的)..我遇到内存限制问题..我的12GB内存机器不能容纳10%的数量,更不用说所有组合。< / p>

所以我决定研究一个数据库替代方案。 但是,我有重复的问题(因为我没有内存中的整个列表来检查是否存在)。

我尝试了很多代码版本,但都耗费资源。

目前正在寻找实际可行的替代方案:)

这是我的最新代码示例,它使用数据库进行后续记录处理,过滤和删除重复:

public List<Draw> getDrawsContaining(List<int> initialBalls)
    {
        if (initialBalls == null)
            initialBalls = new List<int>();

        if (initialBalls.Count >= 6)
            return new List<Draw> { new Draw(initialBalls) };

        List<Draw> toReturn = new List<Draw>();
        for (int i = 1; i <= 42; i++)
        {
            if (initialBalls.IndexOf(i) != -1)
                continue;

            initialBalls.Add(i);
            toReturn.AddRange(getDrawsContaining(initialBalls));
            initialBalls.Remove(i);
        }

        return toReturn;//.Distinct(dc).ToList();
    }

并且在Page_Load中说我解雇了这个:

try
        {
            using (SqlConnection connection = new SqlConnection(sqlConnectionString))
            {
                connection.Open();
                String query = "TRUNCATE TABLE Draws";

                SqlCommand command = new SqlCommand(query, connection);
                //command.Parameters.Add("@id", "abc");

                command.ExecuteNonQuery();
                connection.Close();
            }

            DataTable dt = new DataTable("Draws");
            dt.Columns.Add("Ball1");
            dt.Columns.Add("Ball2");
            dt.Columns.Add("Ball3");
            dt.Columns.Add("Ball4");
            dt.Columns.Add("Ball5");
            dt.Columns.Add("Ball6");

            for (int j = 1, k = 1; j <= 42 && k <= 42; )
            {
                List<Draw> drawsPart = getDrawsContaining(new List<int> { j, k });

                if (drawsPart.Count > 0)
                {
                    foreach (Draw d in drawsPart)
                    {
                        d.Balls.OrderBy(c => c);

                        DataRow dr = dt.NewRow();
                        dr["Ball1"] = d.Balls[0];
                        dr["Ball2"] = d.Balls[1];
                        dr["Ball3"] = d.Balls[2];
                        dr["Ball4"] = d.Balls[3];
                        dr["Ball5"] = d.Balls[4];
                        dr["Ball6"] = d.Balls[5];

                        dt.Rows.Add(dr);
                    }

                    DataTable tmp = dt.Copy();
                    dt.Rows.Clear();

                    AsyncDBSave AsyncDBSaveInstance = new AsyncDBSave(tmp, AsyncDBSaveDispose);
                    Thread t = new Thread(new ThreadStart(AsyncDBSaveInstance.commit));
                    t.Start();
                }

                k++;
                if (k == 43) { j++; k = 1; }
            }
        }
        catch (Exception ex)
        {
            var v = ex.Message;
            throw;
        }

2 个答案:

答案 0 :(得分:4)

我们走了......一切都非常快速有效:

override func viewDidLoad() {
    super.viewDidLoad()
    self.viewModel.getItemsTwo(self.viewModel.getCurrentUser()) { items in
        for item in items {
            print(item)
        }
    }
}

答案 1 :(得分:0)

只是为了好玩,非递归版本大约快2-3倍

static byte[] Populate2()
{
    byte[] results = new byte[6 * 5245786];
    int offset = 0;
    for (byte a1 = 1; a1 <= 37; ++a1)
        for (byte a2 = a1; ++a2 <= 38;)
            for (byte a3 = a2; ++a3 <= 39;)
                for (byte a4 = a3; ++a4 <= 40;)
                    for (byte a5 = a4; ++a5 <= 41;)
                        for (byte a6 = a5; ++a6 <= 42;)
                        {
                            results[offset] = a1;
                            results[offset+1] = a2;
                            results[offset+2] = a3;
                            results[offset+3] = a4;
                            results[offset+4] = a5;
                            results[offset+5] = a6;
                            offset += 6;
                        }
    return results;
}