Этот вопрос касается алгоритмов и, следовательно, не зависит от языка.
Учитывая следующие строки:
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 | | | |
+----+----+----+----+
Которая меньше учитывается, чем исходная таблица.
Кажется, что существует много факторизованных решений, и основная проблема заключается в том, чтобы определить и найти наиболее факторизованное решение.
A1 B1 {C1 C2} D1
,{A1 A2 A3} B2 C1 D1
и{A2 A3} B1 C1 D1
, которые менее факторизованы, чем исходная факторизованная таблица. - person sp00m   schedule 16.07.2015