如何将此C#代码排序为广度优先收益率回报? 问题
我正在创建一个IEnumerable集合,其中包含可以传递给Task.Run()的所有可能的值组合;。 虽然我想更改项目的顺序,但不想使其变为非惰性,因为一次计算整个列表需要几秒钟的时间 简化示例如何将此C#代码排序为广度优先收益率回报? 问题,c#,recursion,breadth-first-search,yield-return,C#,Recursion,Breadth First Search,Yield Return,我正在创建一个IEnumerable集合,其中包含可以传递给Task.Run()的所有可能的值组合;。 虽然我想更改项目的顺序,但不想使其变为非惰性,因为一次计算整个列表需要几秒钟的时间 简化示例 下面是一个简化的代码示例(在最终产品中,Items.Count和sequence.Count都可以达到~100) 我尝试了各种排序方法,但都要求我将最终的IEnumerable更改为一个列表,要求对其进行完整评估,这很容易实现!(=2.432902e+18)项。这会使整个程序冻结几秒钟 我希望通过在
下面是一个简化的代码示例(在最终产品中,Items.Count和sequence.Count都可以达到~100) 我尝试了各种排序方法,但都要求我将最终的IEnumerable更改为一个列表,要求对其进行完整评估,这很容易实现!(=2.432902e+18)项。这会使整个程序冻结几秒钟 我希望通过在递归方法中对其进行排序来获得所需的解决方案,从而以最小的延迟获得所需的输出 那么,我如何将这个C代码排序为广度优先收益率 编辑:对IEnumerable集合中的任何项目进行排序时,不会造成很大的时间损失。 我从“spzvtbg”中获取代码,以表明在当前方法中,评估每个项目的时间非常短。分类项目的评估应类似:
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApp2
{
class Program
{
public static void Main()
{
var sw = Stopwatch.StartNew();
var desiredCollection = GetAllSequences(new List<int>(), 0);
var e = desiredCollection.GetEnumerator();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
for (int i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
}
static int[] Items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
static IEnumerable<List<int>> GetAllSequences(List<int> sequence, int index)
{
yield return sequence;
if (sequence.Count < 20)
{
for (int i = index; i < Items.Length; i++)
{
List<int> newSequence = new List<int>(sequence)
{
Items[i]
};
foreach (List<int> result in GetAllSequences(newSequence, i + 1))
{
yield return result;
}
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
名称空间控制台EApp2
{
班级计划
{
公共静态void Main()
{
var sw=Stopwatch.StartNew();
var desiredCollection=GetAllSequences(新列表(),0);
var e=desiredCollection.GetEnumerator();
e、 MoveNext();
Console.WriteLine(string.Join(“,”,e.Current));
sw.Stop();
控制台写入线(软件运行时间);
对于(int i=0;i<10;i++)
{
sw=秒表。开始新();
e、 MoveNext();
Console.WriteLine(string.Join(“,”,e.Current));
sw.Stop();
控制台写入线(软件运行时间);
}
}
静态int[]项=新int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
静态IEnumerable GetAllSequences(列表序列,int索引)
{
收益-收益序列;
if(sequence.Count<20)
{
for(inti=index;i
解决方案。。。但是对于较大的序列不是很有效
根据“spzvtbg”的想法,我添加了一个“helper”函数,它在每次请求不同大小的输出时启动递归函数。这允许首先按计数大小对所有输出进行排序。然而,这意味着,对于大小为“n”的序列的某些计算,还需要计算所有以前的大小序列!对于更大的尺寸来说,这可能会非常费力
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApp2
{
class Program
{
public static void Main()
{
var sw = Stopwatch.StartNew();
var desiredCollection = GetAllSequences(new List<int>(), 0);
var e = desiredCollection.GetEnumerator();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
for (int i = 0; i < 10000; i++)
{
sw = Stopwatch.StartNew();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
}
static int[] Items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
static IEnumerable<List<int>> GetAllSequences(List<int> sequence, int index, int sizeReq)
{
if (sizeReq == sequence.Count)
yield return sequence;
if (sequence.Count < 20)
{
for (int i = index; i < Items.Length; i++)
{
List<int> newSequence = new List<int>(sequence)
{
Items[i]
};
foreach (List<int> result in GetAllSequences(newSequence, i + 1, sizeReq))
{
yield return result;
}
}
}
}
static IEnumerable<List<int>> GetAllSequences(List<int> sequence, int index)
{
for (int i = 1; i < 15; i++)
{
foreach (List<int> result in GetAllSequences(sequence, index, i))
{
yield return result;
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
名称空间控制台EApp2
{
班级计划
{
公共静态void Main()
{
var sw=Stopwatch.StartNew();
var desiredCollection=GetAllSequences(新列表(),0);
var e=desiredCollection.GetEnumerator();
e、 MoveNext();
Console.WriteLine(string.Join(“,”,e.Current));
sw.Stop();
控制台写入线(软件运行时间);
对于(int i=0;i<10000;i++)
{
sw=秒表。开始新();
e、 MoveNext();
Console.WriteLine(string.Join(“,”,e.Current));
sw.Stop();
控制台写入线(软件运行时间);
}
}
静态int[]项=新int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
静态IEnumerable GetAllSequences(列表序列、int索引、int sizeReq)
{
if(sizeReq==sequence.Count)
收益-收益序列;
if(sequence.Count<20)
{
for(inti=index;i
如何建立/回收以前的序列?
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApp2
{
class Program
{
public static void Main()
{
var sw = Stopwatch.StartNew();
var desiredCollection = GetAllSequences(new List<int>(), 0);
var e = desiredCollection.GetEnumerator();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
for (int i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
}
static int[] Items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
static IEnumerable<List<int>> GetAllSequences(List<int> sequence, int index)
{
yield return sequence;
if (sequence.Count < 20)
{
for (int i = index; i < Items.Length; i++)
{
List<int> newSequence = new List<int>(sequence)
{
Items[i]
};
foreach (List<int> result in GetAllSequences(newSequence, i + 1))
{
yield return result;
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApp2
{
class Program
{
public static void Main()
{
var sw = Stopwatch.StartNew();
var desiredCollection = GetAllSequences(new List<int>(), 0);
var e = desiredCollection.GetEnumerator();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
for (int i = 0; i < 10000; i++)
{
sw = Stopwatch.StartNew();
e.MoveNext();
Console.WriteLine(string.Join(", ", e.Current));
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
}
static int[] Items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
static IEnumerable<List<int>> GetAllSequences(List<int> sequence, int index, int sizeReq)
{
if (sizeReq == sequence.Count)
yield return sequence;
if (sequence.Count < 20)
{
for (int i = index; i < Items.Length; i++)
{
List<int> newSequence = new List<int>(sequence)
{
Items[i]
};
foreach (List<int> result in GetAllSequences(newSequence, i + 1, sizeReq))
{
yield return result;
}
}
}
}
static IEnumerable<List<int>> GetAllSequences(List<int> sequence, int index)
{
for (int i = 1; i < 15; i++)
{
foreach (List<int> result in GetAllSequences(sequence, index, i))
{
yield return result;
}
}
}
}
}