【发布时间】:2014-11-12 16:33:42
【问题描述】:
我正在寻找一些 C++ 库,它可以通过在内存中仅存储一次类似(不准确)的字符串来帮助优化内存使用。它不是 FlyWeight 或字符串实习,它只能存储一次精确的对象/字符串。库应该能够分析和理解,例如,两个不同长度的特定字符串具有相同的前 100 个字符,这个子字符串应该只存储一次。
示例 1:
std::string str1 = "http://www.contoso.com/some/path/app.aspx?ch=test1"<br/>
std::string str2 = "http://www.contoso.com/some/path/app.aspx?ch=test2"<br/>
在这种情况下,很明显这两个字符串的唯一区别是最后一个字符,所以如果我们只保存一个“http://www.contoso.com/some/path/app.aspx?ch=test”的副本,然后再保存两个额外的字符串“1”,这将大大节省内存" 和 "2"
示例 2:
std::string str1 = "http://www.contoso.com/some/path/app.aspx?ch1=test1"<br/>
std::string str2 = "http://www.contoso.com/some/path/app.aspx?ch2=test2"<br/>
当有多个相同的子字符串时,情况会更加复杂:一份“http://www.contoso.com/some/path/app.aspx?ch”,然后是两个字符串“1”和“2”,一份“=test”,因为我们已经有了字符串“1 " 和 "2" 存储我们不需要任何额外的字符串。
那么,有这样的图书馆吗?有什么东西可以帮助相对快速地开发这样一个库吗?字符串是不可变的,因此无需担心更新索引或线程安全锁
【问题讨论】:
-
这样的“子串匹配”算法可以在gzip等很多压缩程序中找到。但请记住,存储“1”通常比指向“1”的指针更有效。根据您的分块字符串实现,您可能看不到小于 16 字节的子字符串的改进。
-
同意,但这是实现细节:)
-
理论上可以,但实际上这意味着您只需要扫描相当大的子字符串匹配项。这产生了巨大的差异(无用匹配的指数减少)。例如,您显然没有意识到“.contoso”和“.com”包含多个相同的子字符串,即“.co”。
-
我想当你解决最长公共子字符串问题时,可以设置一个阈值不处理短于 8 个字符的字符串
-
比这更微妙。您最初也不处理 longer 字符串。您搜索 8 个字节的匹配项。只有当您找到潜在的匹配项时,您才会扫描以查看第一个分歧在哪里。请记住,您正在查看 O(N*N) 个潜在匹配项。
标签: c++ string optimization