Найти эффективный максимум групп во всех наборах - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть 2D-массив, и я хочу создать 3D-массив, который будет показывать наиболее эффективные группировки для всех наборов.Пример:

[[1, 2],
 [1, 2, 3, 4],
 [3, 4],
 [1, 2, 5]]

Результат:

 [[[1, 2]], 
  [[1, 2], [3, 4]], 
  [[3, 4]], 
  [[1, 2], [5]]]

Я думаю, что мне нужно было бы сделать вложенный цикл и определить пересечение и различия для генерации трехмерного массива.Тем не менее, inject (&: &) кажется, что это может решить эту проблему более элегантно, хотя я немного новичок в внедрении и не знаю, как реализовать это для этой проблемы.Это должно быть сделано в Ruby.

Любая помощь приветствуется.Спасибо!

- Обновление - Под эффективными группировками я подразумеваю найти лучшую комбинацию, которая генерирует наименьшее количество общих наборов в результате, найдя самые большие дублирующие наборы.

Другой пример:

[[1, 2, 3, 4],
 [1, 4],
 [1, 3, 4],
 [1, 2, 3, 4, 5],
 [2, 5]]

Возможный результат (всего 8)наборы):

 [[[1, 3, 4], [2]],
  [[1, 4]],
  [[1, 4], [3]],
  [[1, 3, 4], [2, 5]],
  [[2, 5]]]

Это хороший результат, но первый набор можно оптимизировать.

Лучший результат (всего 7 наборов):

[[[1, 2, 3, 4]],
 [[1, 4]],
 [[1, 4], [3]],
 [[1, 2, 3, 4], [5]],
 [[2, 5]]]

Обарезультаты содержат в общей сложности 5 уникальных наборов.Множества в лучшем результате: (1, 2, 3, 4), (1, 4), (3), (5) и (2, 5).Общее количество сетов в лучшем результате составляет 7, а не 8 в возможном результате.Мы хотим наименьшее количество комплектов.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Сначала вы должны выяснить алгоритм в псевдокоде для того, что вы хотите сделать (это не тот Ruby, который удерживает вас прямо сейчас).Затем используйте эти примитивы ruby, чтобы это произошло

http://ruby -doc.org / core / classes / Enumerable.html

http://www.ruby -doc.org/core/classes/Array.html

http://corelib.rubyonrails.org/classes/Set.html

0 голосов
/ 27 апреля 2011

Вы определенно должны объяснить, что означает «наиболее эффективная группировка». В то же время, если вам просто нужно разбить массивы на 2-элементные порции, просто объедините map и each_slice:

arr.map{|a| a.each_slice(2).to_a}
# => [[[1, 2]], [[1, 2], [3, 4]], [[3, 4]], [[1, 2], [5]]] 
...