想要做一个多人协同文档编辑器,请问有什么算法可以判断出文档中修改了那部分内容吗?

2020-01-16 00:44:04 +08:00
 black11black

如题,昨天在折腾 websocket 的 demo,折腾好了以后想做点什么项目

web 聊天好像没啥意思,然后想了想似乎做一个多人协同在线编辑文档不错。 有一个技术上的问题想不明白就是,多人同时连线到一个文档,ws 发送到同步服务器的内容肯定是增量更新,不可能编辑一个大文档把整个文档都发过去,所以快速地查找到哪里修改了些什么是前端必须要做的,

简单想了一下算法,想不太懂。之前用过 beyond compare 那种对比软件,可以光速查找出来两个文档的差异,还有 github 上也是,之前就不太懂是怎么做的。 我想比如你用 lsc,虽然可以 dp 优化,但复杂度仍然是 O(m^2),一万字的文档时间复杂度是一亿,实在是太过匪夷所思,基本上可以确定 github 和 beyondcompare 不是这么实现的。

那么到底咋做啊? 求教求教

1968 次点击
所在节点    问与答
9 条回复
agagega
2020-01-16 01:21:50 +08:00
为什么一定要 diff ?虽然我不知道这些系统是如何实现的,但是把编辑的动作建模成一个个事件,然后用类似事件溯源的模式来在另一个客户端上重放事件应该也可以?而且这样要解决冲突似乎要方便点?
agagega
2020-01-16 01:23:00 +08:00
而且 diff 的 lsc 也不是以字符为单位的吧
casparchen
2020-01-16 02:38:24 +08:00
Operational transformation
Austaras
2020-01-16 06:27:00 +08:00
存 diff
learnshare
2020-01-16 09:22:47 +08:00
有论文,可以去研究
passerbytiny
2020-01-16 09:30:33 +08:00
这种东西,你不能用常规的增删改查思路去做。文档差异化对比的方式,不止是性能问题,一致性也保证不了的。你可以考虑 Event Soucring + CQRS。
RyuZheng
2020-01-16 10:12:01 +08:00
上次看阮一峰博客看到了,不是用 diff,而是存时间戳+操作步骤

[ShowMeBug 核心技术内幕]( https://yafeilee.com/blogs/100)
black11black
2020-01-17 19:17:45 +08:00
@agagega
想了一下,这种追溯操作有递归性,你影响一个后面的全变了。实际情况比如网络突然中断,丢了一个包之类的
agagega
2020-01-18 00:49:26 +08:00
@black11black 能合并的就合并,不能合并的就当作冲突呗,类似 Git merge 一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638288

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX