4342024 2023-10-22 09:51 采纳率: 46.7%
浏览 20
已结题

c#如何加快输出从100个数选50个数的 全部排列组合。要求占用内存足够小,运行足够快,输出组合不重复?

我是在计算从100中选1 选2 一直到选100的全排列,已经采用了在多个线程分别输出从1 2 到100的排列组合,但是速度依然不够快,可否在线程里继续开线程,加快输出组合速度,并输出组合不重复,内存占用少,电脑不卡死?电脑是64位的

  • 写回答

9条回答 默认 最新

  • 社区专家-Monster-XH 2023-10-22 09:51
    关注

    基于Monster 组和GPT的调写:

    
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    class Program
    {
        static void Main()
        {
            int n = 100;
            int r = 50;
            var combinations = new BlockingCollection<int[]>();
    
            // 启动一个新任务来生成组合
            var task = Task.Run(() => GenerateCombinations(Enumerable.Range(1, n).ToArray(), r, combinations));
    
            // 此任务用于消费生成的组合
            var consumer = Task.Run(() =>
            {
                foreach (var combination in combinations.GetConsumingEnumerable())
                {
                    // 处理组合,例如打印到控制台(不建议实际这么做,因为数量太多)
                    Console.WriteLine(string.Join(", ", combination));
                }
            });
    
            task.Wait(); // 等待生成任务完成
            combinations.CompleteAdding(); // 通知没有更多的组合了
            consumer.Wait(); // 等待消费任务完成
        }
    
        static void GenerateCombinations(int[] elements, int k, BlockingCollection<int[]> result)
        {
            int[] combination = new int[k];
            foreach (int[] c in Combinations(elements, k, combination))
            {
                result.Add(c.ToArray()); // 添加到结果集,需要复制因为数组是重复使用的
            }
        }
    
        static IEnumerable<int[]> Combinations(int[] arr, int k, int[] combination, int start = 0, int index = 0)
        {
            if (index == k)
            {
                yield return combination;
            }
            else
            {
                for (int i = start; i < arr.Length; i++)
                {
                    combination[index] = arr[i];
                    foreach (var c in Combinations(arr, k, combination, i + 1, index + 1))
                        yield return c;
                }
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 10月30日
  • 已采纳回答 10月22日
  • 创建了问题 10月22日

悬赏问题

  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)