Я подозреваю, что вам лучше создать отношение, а не свести его на нет.
Возможно, вам придется хранить 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 ,.), скопировав.