2008-12-08 3 views
4

У меня есть последовательность SQL-вызовов, которые я хочу использовать для обнаружения циклов (и, следовательно, ненужных дублирующих вызовов sql), но мне стало интересно, что это более общая проблема.Как вы обнаруживаете повторения в списке строк?

Учитывая список, скажем [a,b,c,b,c,a,b,c,b,c,a,b,b]

Есть ли какой-то способ, которым я могу превратить это в a,[[b,c]*2,a]*2,b*2

или [a,[b,c]*2]*2,a,b*2

То есть, обнаружить повторы (возможно, вложенных из них).

+0

Ответ на этот вопрос приведен ниже: http://stackoverflow.com/questions/6874250/lossless-hierarchical-run-length-encoding – 2016-01-06 07:19:18

ответ

4

Посмотрите на Lempel-Ziv-Welsh compression algorithm. Он построен на обнаружении повторений в строках и использовании их для сжатия. Я считаю, что вы можете использовать Trie .

0

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

0

Я не эксперт в этой области, но вы можете проверить некоторые алгоритмы сжатия, мне кажется, что это именно то, что они делают.

0

Если строка достаточно большая, интересный подход заключается в том, чтобы запустить на нем инструмент сжатия (например, gzip, bzip или 7zip). Эти инструменты работают путем поиска повторений (на разных уровнях) и подстановки их указателями на первый экземпляр текста (или словаря). Сжатие, которое вы достигаете, является мерой повторения. Сбрасывая файл (вы должны будете написать код для этого), вы получите повторный контент.

+0

Сомнительно, что это сработает, так как программы сжатия с удовольствием будут использовать подстроки и будут игнорировать границы команд SQL. – derobert 2008-12-08 15:45:01

Смежные вопросы