У меня есть коллекция наборов, которые я хотел бы поместить в три .
Обычные попытки состоят из строк элементов, то есть порядок элементовважный.У наборов отсутствует определенный порядок, поэтому существует возможность большего сжатия.
Например, учитывая строки "abc"
, "bc"
и "c"
, я бы создал три:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
Но учитывая наборы { 'a', 'b', 'c' }
, { 'b', 'c' }
, { 'c' }
, я мог бы создать вышеупомянутый три или любой из этих одиннадцати:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('c',2) -> ('a',1)
(*,3) -> ('a',1) -> ('c',1) -> ('b',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
(*,3) -> ('a',1) -> ('c',1) -> ('b',1)
-> ('c',2) -> ('a',1)
(*,3) -> ('b',2) -> ('a',1) -> ('c',1)
-> ('c',1)
-> ('c',1)
(*,3) -> ('b',1) -> ('a',1) -> ('c',1)
-> ('c',2) -> ('b',1)
(*,3) -> ('b',2) -> ('c',2) -> ('a',1)
-> ('c',1)
(*,3) -> ('b',1) -> ('c',1) -> ('a',1)
-> ('c',2) -> ('b',1)
(*,3) -> ('c',2) -> ('a',1) -> ('b',1)
-> ('b',1) -> ('c',1)
(*,3) -> ('c',2) -> ('a',1) -> ('b',1)
-> ('b',1)
(*,3) -> ('c',2) -> ('b',1) -> ('a',1)
-> ('b',1) -> ('c',1)
(*,3) -> ('c',3) -> ('b',2) -> ('a',1)
Так что, очевидно, есть место для сжатияОт 7 узлов до 4).
I подозреваю определение локального порядка в каждом узле зависит от относительной частоты его дочерних элементов, но я не уверен, и это может бытьчрезмерно дорогой.
Итак, прежде чем я ударю по доске и начну ломать голову над моим собственным алгоритмом сжатия, существует ли существующий?Насколько это дорого?Это массовый процесс, или это можно сделать для каждой вставки / удаления?