Существует ли быстрый и необычный код / ​​алгоритм C # для сжатия строки, разделенных запятыми, близкой к максимальной плотности информации? - PullRequest
2 голосов
/ 17 мая 2011

Короче говоря, я запрограммировал себя в угол, создав агрегат CLR, который выполняет конкатенацию идентификатора строки, поэтому я говорю:

select SumKeys(id), name from SomeTable where name='multiple rows named this'

и получаю что-то вроде:

SumKeys         name
--------        ---------
1,4,495         multiple rows named this

Но он умирает, когда SumKeys получает> 8000 символов, и я не думаю, что могу что-то с этим поделать.

В качестве быстрого решения (для моего приложения это всего лишь 1% времени), я подумал, чтоможет сжать строку вниз, и я подумал, что некоторые из вас, умные люди, могут знать хитрый способ сделать это.

Что-то вроде base64 для 0-9 и запятой?

Ответы [ 6 ]

2 голосов
/ 17 мая 2011

Как насчет шестнадцатеричного представления, где каждая цифра представляет 4-битную половину байта символа (полубайт), где 0xa используется в качестве запятой? Вы получите сжатие только на 50%, но это быстро и просто.

2 голосов
/ 17 мая 2011

Вам было бы намного лучше, если бы вы нашли более разумное хранилище для ваших данных (возможно, HashSet) ...

Но для сжатия попробуйте обычный System.IO.Compression.GZipStream (http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx) и преобразовать полученный байтовый массив в строку base64, если необходимо ... или сохранить как байтовый массив.

1 голос
/ 17 мая 2011

Вы можете использовать дерево Хаффмана .Это в основном алгоритм для сжатия ascii в двоичный файл.Мне сказали, что это в основном то, что использует WinZIP, но я не уверен, правда это или нет.Я быстро выполнил поиск huffman coding c#, и, кажется, есть хотя бы одна достойная реализация, хотя я не использовал ни одну из них.

Если ваш "словарь" - это просто цифры и запятые,Дерево Хоффмана даст вам очень хорошее сжатие.

http://www.enusbaum.com/blog/2009/05/22/example-huffman-compression-routine-in-c/

1 голос
/ 17 мая 2011

Не уверен, насколько «причудливым» вы бы это считали, но сжатие zip / gzip очень эффективно для любого текста (иногда до 90% или более). Поскольку вы уже работаете с интеграцией C # и CLR, надеюсь, ее не составит труда настроить / развернуть. Я еще не возился с библиотеками C # для сжатия, но их легко найти. Например: http://sharpdevelop.net/OpenSource/SharpZipLib/ или http://dotnetzip.codeplex.com/ или даже http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx

Или более простым вариантом может быть переключение поля на текст или varchar / nvarchar (max), если это возможно.

0 голосов
/ 18 мая 2011

Я столкнулся с методом, который будет работать с SQL Server:

SELECT
  STUFF((
    SELECT ','+id FROM SomeTable a WHERE a.name = b.name FOR XML PATH('')
  ),1,1,'') AS SumKeys, name
FROM SomeTable b
GROUP BY name
WHERE name = 'multiple rows named this'

Предложение WHERE является необязательным

0 голосов
/ 17 мая 2011

попробуй:

SELECT name, GROUP_CONCAT(id) FROM SomeTable GROUP BY name WHERE name = 'multiple rows named this'
...