我是在计算从100中选1 选2 一直到选100的全排列,已经采用了在多个线程分别输出从1 2 到100的排列组合,但是速度依然不够快,可否在线程里继续开线程,加快输出组合速度,并输出组合不重复,内存占用少,电脑不卡死?电脑是64位的
8条回答 默认 最新
社区专家-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; } } } }本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录