Давайте go вернемся к вашему неоптимизированному словарю букв к наборам чисел:
A: 1
B: 1,2,3
C: 2,3
Там - в данном случае - дерево шагов рефакторинга с двумя ветвями, которое вы могли бы выполнить:
A:1 B:1,2,3 C:2,3
/ \
factor using set 2,3 factor using set 1
/ \
A:1 B:1 B,C:2,3 A,B:1 B:2,3 C:2,3
/ \
factor using set 1 factor using set 2,3
/ \
A,B:1 B,C:2,3 A,B:1 B,C:2,3
По крайней мере, в этом случае вы получите один и тот же результат независимо от того, какой факторинг вы сделаете первым, но я не уверен, будет ли это всегда так.
Проведение исчерпывающего исследования дерева звучит дорого, поэтому вы, возможно, захотите этого избежать, но если бы мы могли выбрать оптимальный путь или, по крайней мере, вероятный хороший путь, это были бы относительно низкие вычислительные затраты. Вместо случайного ветвления, мой инстинкт подсказывает, что было бы быстрее и ближе к оптимальному, если бы вы попытались сделать возможное изменение факторинга с наибольшим набором в каждой точке дерева. Например, рассматривая дерево с двумя ветвями выше, вы бы предпочли первоначальное разложение 2,3 над исходным разложением 1 в вашем дереве, потому что 2,3 имеет больший набор размера два. Более драматичный c рефакторинг предполагает, что количество рефакторингов, прежде чем вы получите стабильный результат, будет меньше. одинаковой длины), ища возможности для рефакторинга.
Во многом как пузырьковая сортировка, после каждого рефакторинга подход будет выглядеть так: «Я внес изменение; оно еще не стабильно; давайте повторим». Начните с итерации от второго самого длинного набора к самому короткому, проверяя возможности оптимизации, как вы go.
(я не уверен насчет python, но в целом сравнение наборов может быть дорогостоящим, вы можете хотите сохранить значение для каждого набора, которое является XOR хешированных значений в наборе - это легко и дешево обновить, если несколько элементов набора изменяются, и тривиальное сравнение может сказать вам, что большие наборы неравны, что экономит время сравнения; он не скажет вам, равны ли наборы: несколько наборов могут иметь одинаковое значение XOR-of-hashes).