我是在计算从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; } } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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 求解达问题(有红包)