【问题标题】:Are there any libraries for efficiently editing large strings in Javascript?是否有任何库可以有效地在 Javascript 中编辑大字符串?
【发布时间】:2011-03-27 23:11:08
【问题描述】:

我需要在 javascript 中高效地编辑大型文本文档(例如,源代码文件)。

insertAtPosition(n, str)deleteAtPosition(n, length) 必须很快。

简单的字符串实现很慢,因为每个操作都需要将文档的内容复制到一个新的字符串中。

有几种有效的方法可以做到这一点。我可以使用一系列线(Ace aka Bespin 这样做),但是当有超长线或许多短线时,这会很慢。更好的实现是使用skip lists 或其他一些巧妙的数据结构。

但是,我希望有人已经实现了这样的东西。

是否有任何图书馆已经这样做了?我似乎无法在 Google 中找到任何有用的东西 - 这个算法问题有通用名称吗?

【问题讨论】:

  • 也许用source.split('')把它分解成字符,然后用原生的Array.splice,最坏的情况是O(n)。
  • @Reid:对字符串的简单操作已经是 O(n),所以这不会实现任何目标。如果 Javascript 中的数组具有每个元素的内存开销,那么您的方法实际上会更慢。
  • @j_random_hacker:天真的字符串操作不包括在给定点插入字符的实用程序,因为字符串是不可变的。
  • @Reid:我理解——我的意思是“修改”一个不可变字符串(通过创建一个新的、更改的副本)是 O(n),与您提出的方法相同,假设内存可以在恒定时间内分配。在字符串中的任何位置插入/删除字符都需要分配内存,然后将所有 n 个字符复制到新的不可变字符串中。如果您在接近末尾插入/删除并且碰巧不需要内存重新分配,您的 Array.splice() 可能会更快,因为只有该点之后的字符需要被复制,但它仍然是 O(n)。跨度>

标签: javascript algorithm text


【解决方案1】:

我认为没有其他库可以做到这一点,所以我自己使用跳过列表实现了它。使用树形数据结构可能会更快,但是跳过列表很容易实现,并且闭包编译的 javascript 只有 2.5 KB。

如果有其他人有同样的问题,请享受:

https://github.com/josephg/jumprope

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2012-12-17
    • 2020-06-11
    相关资源
    最近更新 更多