Нахождение расширенного до факторизованного алгоритма

Этот вопрос касается алгоритмов и, следовательно, не зависит от языка.


Учитывая следующие строки:

  • A1, B1, C1, D1 (1)
  • A1, B2, C1, D1 (2)
  • A2, B1, C1, D1 (3)
  • A2, B2, C1, D1 (4)
  • A3, B1, C1, D1 (5)
  • A3, B2, C1, D1 (6)
  • A1, B1, C2, D1 (7)

Они могут быть факторизованы следующим образом:

+----+----+----+----+
| A1 | B1 | C1 | D1 |
| A2 | B2 |    |    |
| A3 |    |    |    |
+----+----+----+----+
| A1 | B1 | C2 | D1 |
+----+----+----+----+

Эти данные могут храниться в следующих объектах:

class ExpandedRow {
  String a;
  String b;
  String c;
  String d;
}

class FactoredRow {
  List<String> as;
  List<String> bs;
  List<String> cs;
  List<String> ds;
}

Что касается алгоритмов преобразований, то factored --> expanded довольно прост:

List<FactoredRow> factoredRows = fill();
List<ExpandedRow> expandedRows = empty();
for each factoredRow in factoredRows {
  for each a in factoredRow.as {
    for each b in factoredRow.bs {
      for each c in factoredRow.cs {
        for each d in factoredRow.ds {
          expandedRows.add(new ExpandedRow(a, b, c, d));
        }
      }
    }
  }
}

Но я теряюсь по поводу expanded --> factored. Как я могу разложить List<ExpandedRow> на List<FactoredRow>?

Другими словами, у меня есть факторизованная таблица в качестве входных данных. Я расширяю его с помощью предоставленного алгоритма и сохраняю в состоянии expanded. Возникает вопрос: как получить начальное состояние факторизовано после его расширения?


Я подумал, что если две развернутые строки имеют только один отличающийся атрибут, их можно разложить на множители, например A1, B1, C1, D1 (1) и A1, B1, C2, D1 (2). Но если мы разложим эти две строки вместе, мы закончим:

+----+----+----+----+
| A1 | B1 | C1 | D1 |
|    |    | C2 |    |
+----+----+----+----+
| A1 | B2 | C1 | D1 |
| A2 |    |    |    |
| A3 |    |    |    |
+----+----+----+----+
| A2 | B1 | C1 | D1 |
| A3 |    |    |    |
+----+----+----+----+

Которая меньше учитывается, чем исходная таблица.

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


person sp00m    schedule 16.07.2015    source источник
comment
Я не понимаю, как работает ваша факторизация. Можно подробно?   -  person coincoin    schedule 16.07.2015
comment
Можно ли переставлять строки? Обратите внимание, что первую и последнюю строку вместе можно разложить на множители нетривиальным способом. Если строки могут быть переставлены, как указать, какую факторизацию вы принимаете. Кроме того, мне кажется более естественным сказать, что строки 1-6 факторизуются, но общий список строк больше похож на простое число. - 7 не множится как 3x2x1x1 + 1   -  person John Coleman    schedule 16.07.2015
comment
@coincoin - OP, похоже, пытается разложить набор векторов на множители как декартово произведение наборов векторов более низкой размерности.   -  person John Coleman    schedule 16.07.2015
comment
@coincoin Я должен признать, что это не очень ясно ... Вот конкретный вариант использования: у меня есть факторизованная таблица в качестве входных данных. Я расширяю его, используя предоставленный алгоритм, и сохраняю его в расширенном состоянии. Возникает вопрос: как получить начальное состояние factorized?   -  person sp00m    schedule 16.07.2015
comment
@JohnColeman Вы должны быть правы, мне кажется, что существует не одно факторизованное состояние, а несколько факторизованных состояний. Затем мне нужно будет найти наиболее факторизованный. Теперь возникает вопрос: как определить наиболее факторизованное состояние и как его построить. Может быть, сортировка расширенных строк каким-то образом может помочь?   -  person sp00m    schedule 16.07.2015
comment
@ sp00m Я предполагаю, что после того, как вы четко сформулируете это, у вас останется NP-сложная проблема, связанная с поиском оптимального раздела набора списков (оптимального по сравнению с вычислительно дорогой целевой функцией). Это всего лишь предположение, и оно не очень актуально, если ваше предполагаемое приложение включает в себя небольшие наборы списков.   -  person John Coleman    schedule 16.07.2015
comment
@ sp00m Что не так с факторизацией A1 B1 {C1, C2} D1?   -  person Edward Doolittle    schedule 16.07.2015
comment
@EdwardDoolittle На самом деле в этом нет ничего плохого. Просто если мы факторизуем эти две строки вместе, мы получим 3 факторизованных фильтра: A1 B1 {C1 C2} D1, {A1 A2 A3} B2 C1 D1 и {A2 A3} B1 C1 D1, которые менее факторизованы, чем исходная факторизованная таблица.   -  person sp00m    schedule 16.07.2015


Ответы (1)


Эта проблема выглядит чем-то вроде проблемы разделения графа. Я подозреваю, что это NP-трудно, но я еще не смог это доказать.

Давайте рассмотрим более простой пример, чтобы увидеть, что происходит. Рассмотрим пары (A1,B1), (A2,B1), (A3,B1), (A2,B2). Мы представляем точки как точки в 2D-пространстве и соединяем точки, если возможно перейти от одной к другой путем перемещения параллельно оси x или оси y:

           (A2,B2)
              |
(A1,B1) -- (A2,B1) -- (A3,B1)

Идея состоит в том, чтобы разбить граф линиями, параллельными осям, и переразбить каждое разбиение, и так далее, пока мы не получим части, которые будут полными прямоугольниками, отрезками прямых или точками.

Существует два принципиально разных способа разбиения приведенного выше графа. Мы можем провести вертикальную линию в позиции x=1.5:

           (A2,B2)
              |
(A1,B1)    (A2,B1) -- (A3,B1)

после чего правую часть нужно дополнительно разбить (вертикальной или горизонтальной линией, возьмем горизонтальную):

           (A2,B2)

(A1,B1)    (A2,B1) -- (A3,B1)

Теперь мы разложили исходный список на

A1 B1
-----
A2 B2
-----
A2 B1
A3

С другой стороны, если бы мы сделали наше начальное разбиение горизонтальной линией в позиции y=1,5, мы бы получили

           (A2,B2)

(A1,B1) -- (A2,B1) -- (A3,B1)

который уже хорошо разложен на точку и отрезок:

A2 B2
-----
A1 B1
A2
A3

В более высоких измерениях (4D для букв A, B, C, D) мы сталкиваемся с аналогичной проблемой, за исключением того, что существует соответственно больше вариантов начальных разрезов, а разрешенные конечные части являются более многомерными (не только точки, линейные сегменты и т. д.). прямоугольники, а также 3D и 4D блоки).

Эта проблема кажется мне NP-сложной, как и многие другие проблемы с разбиением графа, но, вероятно, существуют достаточно быстрые алгоритмы аппроксимации.

person Edward Doolittle    schedule 18.07.2015