我想要快速连接和编辑操作的字符串表示。我已阅读了论文"Ropes: an Alternative to Strings",但自1995年以来该领域有哪些重大改进?
编辑:我之前考虑过的一种可能性是使用带字符串的2-3 finger tree作为叶子,但我没有对此进行详细分析;这给出了在末端的摊销的常数时间添加/删除和对数(在较小的字符串的块数)串联,而不是相反的绳索。
答案 0 :(得分:1)
这是一个老问题!我想知道是否有人读到这个。但它仍然是吸引人的。 在你的评论中,你说你找:
更快的渐近,或不变 因素,或更少的内存使用
好吧,绳索有O(1)插入和O(n)迭代。你不能做得更好。子串和索引显然会更昂贵。但大多数大型文档的用例不需要编辑或随机访问。如果只在最后连接,则1D向量/字符串列表可以改善插入时间常数。我以前在JavaScript中使用它,因为它有这么慢的字符串连接。
据说内存表示比使用字符串效率低。
我怀疑:如果您使用具有垃圾收集的语言,绳索允许您在多个位置使用相同的字符串片段实例。在代表HTML文档的绳索中,会有许多DIV
个,SPAN
和LINK
元素。假设这些标记是编译时常量,并且您可以直接将它们添加到绳索中,这甚至可能会自动发生。即使对于这样的短语,绳索文档也会显着减小,与原始字符串的数量级相同。较长的弦将产生净增益。
如果您还将树元素设为只读,则可以创建多次出现的子语言(表示为绳索的较长短语),多次出现或在基于绳索的字符串中共享。这种共享的缺点是不能更改这样的分片绳部分:编辑它们,或者平衡需要复制对象图的树。但是,如果你大多数连接和迭代,这并不重要。在Web服务器中,您可以保留一个子索引,该子索引重复在该服务器所服务的所有HTML文档之间共享的CSS样式表声明。