Эффективное определение отношений между строками в электронной таблице - PullRequest
1 голос
/ 11 октября 2010

Это проблема, с которой я только что столкнулся, или, скорее, это упрощение, которое фиксирует основную проблему.

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

Я хочу определить, когда значение в одном столбце может быть выведено из значения в другом. Например, мы можем обнаружить, что каждый раз, когда в столбце a появляется «1», в столбце d всегда отображается «5», но всякий раз, когда в столбце * появляется «2» 1009 * a , 3 всегда отображается в столбце d . Мы видим, что значение в столбце a надежно предсказывает значение в столбце c .

Цель состоит в том, чтобы идентифицировать все такие отношения между столбцами.

Наивное решение - начать со списка всех пар столбцов, (a, b), (a, c), (a, d) ... (b, c), (b, d). .. и так далее. Мы называем их «приемлемым» списком.

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

Все, что осталось в конце этого процесса, является набором действительных отношений.

К сожалению, это быстро становится непрактичным, так как количество столбцов увеличивается, поскольку объем данных, которые мы должны хранить, находится в порядке количества столбцов в квадрате.

Кто-нибудь может придумать эффективный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 октября 2010

Я подозреваю, что вам лучше создать отношение, а не свести его на нет.

Возможно, вам придется хранить n ^ 2 фрагментов информации, где у вас есть n столбцов.Например, если столбец никогда не повторяется (т.е. его значение отличается в каждой строке), тогда этот столбец предсказывает все остальные.Если каждый столбец такой, то каждый столбец предсказывает любой другой.Вы можете использовать двумерную таблицу pred скажем, индексированную по номерам столбцов, с pred (a, b) true, если a предсказывает b.pred (a, b) может иметь любое из 3 значений: true, false и unknown.

Отношение прогнозирования является транзитивным, то есть если a прогнозирует b, а b прогнозирует c, то a прогнозирует c.Если количество строк велико, и проверка того, предсказывает ли одна строка другую, стоит дорого, то, возможно, стоит использовать транзитивность, чтобы заполнить все, что вы можете: если вы только что вычислили, что pred (a, b) - true, и у вас естьуже вычислено pred (b, x) для каждого x, тогда вы можете установить pred (a, y) true для каждого y, для которого pred (b, y) - true.

Для заполнения pred (a,.) вы можете создать временный массив пар (значение, индекс строки) из a, а затем отсортировать по значению;это дает вам легкий доступ к наборам индексов, где а является постоянным.Если каждое из этих множеств является одиночным, то pred (a, b) верно для каждого b;в противном случае, чтобы проверить, предсказывает ли a b (если он еще не известен), необходимо проверить, что b является константой в каждом наборе индексов (с более чем одним членом), где a является константой.

Оптимизация может состоять в том, что еслиpred (a, b) истинно, а также pred (b, a) истинно тогда для каждого c, pred (a, c) тогда и только тогда, когда pred (b, c);таким образом, в этом случае, если вы уже заполнили pred (b,.), вы можете заполнить все pred (a ,.), скопировав.

0 голосов
/ 12 октября 2010

Я не думаю, что вы можете улучшить O (n ^ 2) для n столбцов: рассмотрим случай, когда между парами не существует никакой связи.Единственный способ обнаружить это - проверить все пары, а это O (n ^ 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...