Алгоритмическая задача на объединение мелких файлов - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Возникла такая алгоритмическая задачка. В директории с программой лежит много мелких txt-файлов размером от 1 до 70 Мб. Необходимо: 1) объединить файлы таким образом, чтобы получились файлы в среднем по 50 Мб (не меньше). Новые файлы записываются в директорию "result". 2) названия файлов должны сохраняться. То есть, в один мелкий файл дописываем несколько других мелких, а его название остается тем же самым. 3) если файл превышает 50 Мб, то внутрь него не нужно дописывать, а просто переносим его в result. Сложность в том, чтобы придумать алгоритм, который оптимально комбинирует рандомные файлы по размеру - чтобы в итоге получались файлы в среднем по 50 Мб. Буду благодарен за помощь!

Решение задачи: «Алгоритмическая задача на объединение мелких файлов»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace ConsoleApplication212
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //генерируем "файлы"
  12.             var list = new List<File>();
  13.             var rnd = new Random();
  14.  
  15.             for (int i = 0; i < 100;i++ )
  16.             {
  17.                 list.Add(new File { Name = i + ".txt", Size = rnd.Next(1, 100) * 1000000 });
  18.             }
  19.  
  20.             //создаем объединенные файлы и выводим
  21.             foreach(var subList in Solve(list, 50000000))
  22.             {
  23.                 Console.WriteLine((subList.Sum(f=>f.Size) / 1000000) + " MB: " + string.Join("+", subList.Select(f=>f.Name)));
  24.             }
  25.  
  26.  
  27.             Console.ReadLine();
  28.         }
  29.  
  30.         private static IEnumerable<List<File>> Solve(List<File> list, int targetSize)
  31.         {
  32.             //сортируем по убыванию размера
  33.             var ordered = list.OrderByDescending(f => f.Size).ToList();
  34.             var used = new HashSet<File>();
  35.  
  36.             //перебираем
  37.             for(int i=0;i<ordered.Count;i++)
  38.             if (!used.Contains(ordered[i]))//еще не использовался?
  39.             {
  40.                 var sumSize = ordered[i].Size;
  41.                 var res = new List<File>();
  42.                 res.Add(ordered[i]);
  43.                 used.Add(ordered[i]);
  44.                 //если файл меньше targetSize
  45.                 if(sumSize < targetSize)
  46.                 //добавляем файлы, пока суммарный размер меньше targetSize
  47.                 for (int j = i + 1; j < ordered.Count; j++)
  48.                 if(!used.Contains(ordered[j]))//еще не использовался?
  49.                 if (sumSize + ordered[j].Size < targetSize)//если суммарно не превышаем нужный размер, добавляем
  50.                 {
  51.                     //добавялем файл
  52.                     res.Add(ordered[j]);
  53.                     used.Add(ordered[j]);
  54.                     sumSize += ordered[j].Size;
  55.                 }
  56.  
  57.                 yield return res;
  58.             }
  59.         }
  60.     }
  61.  
  62.     class File
  63.     {
  64.         public string Name;
  65.         public int Size;
  66.     }
  67. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы