尝试为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;
}
答案 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;
}