是否有一种快速且非花哨的 C# 代码/算法来压缩接近最大信息密度的逗号分隔数字字符串

本文关键字:信息 接近 压缩 数字字符 字符串 数字 分隔 算法 代码 一种 是否 | 更新日期: 2023-09-27 17:56:31

简而言之,我通过创建一个执行行 id 连接的 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 和一个逗号?

是否有一种快速且非花哨的 C# 代码/算法来压缩接近最大信息密度的逗号分隔数字字符串

如果你为你的数据找到更合理的存储(也许是 HashSet),你会好得多......

但是对于压缩,请尝试常规System.IO.Compression.GZipStream(http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx),并在需要时将生成的字节数组转换为base64字符串...或存储为字节数组。

十六进制表示形式怎么样,其中每个数字代表字符字节(半字节)的 4 位半部分,0xa用作逗号?您只会获得 50% 的压缩,但它既快速又简单。

不确定你会认为它有多"花哨",但 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),如果可行的话。

你可以使用霍夫曼树。这基本上是一种将 ascii 压缩为二进制的算法。有人告诉我,这基本上是WinZIP使用的,但我不确定这是否真的是真的。我快速搜索了huffman coding c#似乎至少有一个像样的实现,尽管我没有使用过其中任何一个。

如果你的"词汇表"只是数字和逗号,霍夫曼树会让你得到很好的压缩。

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

尝试:

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

我遇到了一个可以与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 子句是可选的