【发布时间】: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