Ускорение работы программы - C# (177190)
Формулировка задачи:
доброго времени суток. Возникла следующая проблема:
Это код генерации перестановок с небольшими дополнениями. Мне необходимо запускать программу на данных для множества, состоящего из 16 элементов. А это 16! (16 факториал) перестановок. Программа в нынешнем виде будет работаь примерно 20 дней, что неприемлемо. Помогите, пожалуйста, советом, а лучше кодом: как можно усовершенствовать, что добавить/исправить. Заранее спасибо.
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace GeneratePerms_Non_parallel_
- {
- class Program
- {
- public static List<int[]> listOfDiffVectors = new List<int[]>();
- private static void Swap(ref int a, ref int b)
- {
- if (a == b) return;
- a ^= b;
- b ^= a;
- a ^= b;
- }
- public static void GetPer(int[] list)
- {
- int x = list.Length - 1;
- GetPer(list, 0, x);
- }
- private static void GetPer(int[] list, int k, int m)
- {
- if (k == m)
- {
- int[] diff = new int[list.Length];
- int i = 0;
- for (i = 0; i < list.Length; i++)
- {
- int d = 0;
- if (i == list.Length - 1)
- {
- d = list[0] - list[i];
- if (d < 0)
- d += list.Length;
- else
- d %= list.Length;
- diff[0] = d;
- }
- else
- {
- d = list[i + 1] - list[i];
- if (d < 0)
- d += list.Length;
- else
- d %= list.Length;
- diff[i + 1] = d;
- }
- }
- bool flag = false;
- foreach (int[] temp in listOfDiffVectors)
- if (temp.SequenceEqual(diff))
- {
- flag = true;
- break;
- }
- if (!flag)
- listOfDiffVectors.Add(diff);
- }
- else
- for (int i = k; i <= m; i++)
- {
- Swap(ref list[k], ref list[i]);
- GetPer(list, k + 1, m);
- Swap(ref list[k], ref list[i]);
- }
- }
- static void Main(string[] args)
- {
- //System.Diagnostics.Stopwatch sw = new Stopwatch();
- int[] perm = new int[] { 0,1,2 };
- //sw.Start();
- GetPer(perm);
- // sw.Stop();
- //Console.WriteLine((sw.ElapsedMilliseconds / 1000.0).ToString());
- Console.WriteLine("Press any key...");
- Console.ReadKey();
- }
- }
- }
Решение задачи: «Ускорение работы программы»
textual
Листинг программы
- foreach (int[] temp in listOfDiffVectors)
- if (temp.SequenceEqual(diff))
- {
- flag = true;
- break;
- }
- if (!flag)
- listOfDiffVectors.Add(diff);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д