是否有任何情况下,Rope数据结构比字符串生成器更有效
与此问题相关,基于用户Eric Lippert的评论。
有什么情况下,Rope数据结构比字符串生成器更有效吗? 有些人认为,在典型情况下,绳索数据结构在速度方面几乎从来没有比本地字符串或字符串构建器操作更好,所以我很好奇看到实际情况下绳索更好。
有关SGI C ++实现的文档详细介绍了大O行为与恒定因素之间的关系,这些都很有启发性。
他们的文档假设涉及很长的字符串,举例说明了有关10 MB字符串的示例。 只有很少的程序会被写出来处理这些事情,对于这类需求的许多类别的问题,重新设计它们是基于流的,而不是要求在可能的情况下提供完整的字符串将导致显着优越的结果。 因为这样的绳子是用于非流式处理多兆字节的字符序列的,所以当你能够将绳索适当地当作段(自己绳索)而不仅仅是一系列字符时。
重要优点:
重大缺点:
这导致了一些“显而易见的”用途(SGI明确提到了这一点)。
在某些情况下,字符串中的域特定行为可以与对绳索实现的相对简单的增强相结合,以允许:
从上面列出的例子中可以看出,所有这些都属于“利基”范畴。 此外,如果您愿意/能够将算法重写为流处理操作,几个可能会有更好的选择。
这个问题的简短答案是肯定的,而且这需要很少的解释。 当然,在某些情况下,Rope数据结构比字符串生成器更有效。 他们的工作方式不同,所以他们更适合不同的目的。
(从C#的角度来看)
绳索数据结构作为二叉树在某些情况下更好。 当你在查看非常大的字符串值时(想象从SQL中得到100MB以上的xml),绳索数据结构可以保持整个进程离开大对象堆,字符串对象在传递85000字节时击中它。
如果您正在查看5-1000个字符的字符串,则可能不会提高性能,足以胜任。 这是另一种针对5%有极端情况的人设计的数据结构。
第十届ICFP编程大赛基本上依靠人们使用绳索数据结构进行有效解决。 这是让合理时间内运行虚拟机的大伎俩。
如果有很多前缀(很明显,“prepending”由IT人员组成并且不是一个合适的词),则绳是非常好的,并且可能更适合插入; StringBuilders使用连续内存,因此只能有效地追加。
因此,StringBuilder非常适合通过追加片段来构建字符串 - 这是非常正常的用例。 由于开发人员需要这么做,所以StringBuilders是一项非常主流的技术。
编辑缓冲区的绳索非常棒,例如后面的数据结构,比如企业级TextArea。 因此(放松绳索,例如链接列表而不是二叉树)在UI控件世界中是非常普遍的,但这并不常见于这些控件的开发人员和用户。
你需要非常大量的数据和流失来完成流程 - 处理器非常擅长流操作,如果你有RAM,那么只需重新分配前缀就可以正常使用。 上面提到的那场比赛是我见过的唯一一次。
链接地址: http://www.djcxy.com/p/6775.html上一篇: Is there any scenario where the Rope data structure is more efficient than a string builder