【发布时间】:2012-08-24 18:55:53
【问题描述】:
我有一个大型理论字符串(104 个字符长)数据库生成程序,它返回以 PB 为单位的结果。我没有那么多的计算能力,所以我想从数据库中过滤出低复杂度的字符串。
我的语法是英文字母表的修改形式,没有数字字符。我读到了Kolmogorov Complexity 以及theoretically impossible to calculate 的内容,但我只需要使用压缩的 C# 基本知识。
使用这两个链接
我想出了这个:
MemoryStream ms = new MemoryStream();
GZipStream gzip2 = new GZipStream(ms, CompressionMode.Compress, true);
byte[] raw = Encoding.UTF8.GetBytes(element);
gzip2.Write(raw, 0, raw.Length);
gzip2.Close();
byte[] zipped = ms.ToArray(); // as a BLOB
string smallstring = Convert.ToString(zipped); // as a string
// store zipped or base64
byte[] raw2 = Encoding.UTF8.GetBytes(smallstring);
int startsize = raw.Length;
int finishsize = raw2.Length;
double percent = Convert.ToDouble(finishsize) / Convert.ToDouble(startsize);
if (percent > .75)
{
///output
}
我的第一个元素是:
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
它会压缩到 13 个字符的大小,但这是另一个字符集
mlcllltlgvalvcgvpamdipqtkqdellplagtwhsmamatnnislmatlkaplrvhitsllptpednleivlhrwennscvekkvlgektenpkkfkinytvaneatlldtdydnflflclqdtttpiqsmmcqylarvlveddeimqgfirafrplprhlwylldlkqmeepcrf
也计算为 13。有一个错误,但我不知道如何修复它。
【问题讨论】:
-
压缩后的缓冲区是否解压为原始字符串?如果是这样,那么它可能适用于“作品”的某些定义。
-
另外,为什么要将压缩流转换为字符串,然后再转换为数组?看来您应该将
raw.Length与zipped.Length进行比较。 -
最后但同样重要的是,gzip 流可能包含某种标题。如果您只想要压缩有效负载的大小,您应该查看相关规范以查看是否需要将其剥离。
-
@millimoose 谢谢,我觉得有些东西看起来不对,让我检查一下
标签: c# string compression complexity-theory