Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此C#代码排序为广度优先收益率回报? 问题_C#_Recursion_Breadth First Search_Yield Return - Fatal编程技术网

如何将此C#代码排序为广度优先收益率回报? 问题

如何将此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)项。这会使整个程序冻结几秒钟 我希望通过在

我正在创建一个IEnumerable集合,其中包含可以传递给Task.Run()的所有可能的值组合;。 虽然我想更改项目的顺序,但不想使其变为非惰性,因为一次计算整个列表需要几秒钟的时间

简化示例
下面是一个简化的代码示例(在最终产品中,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;
                }
            }

        }
    }
}