一种支持字符串操作的实时协同编辑一致性维护方法

文档序号:10593938阅读:190来源:国知局
一种支持字符串操作的实时协同编辑一致性维护方法
【专利摘要】本发明公开了一种支持字符串操作的实时协同编辑一致性维护方法,方法中的每个站点都维护两层数据结构:视图层(View)和模型层(Model);Model包括哈希表(HT)和双链表(Lmodel);HT哈希存储所有结点(Node),其中,Node存储操作的字符串;Lmodel 全序链接HT中的Node;View包括一个双链表(Lview),是由Lmodel中可见的Node链接而成;方法的控制流程分为本地操作处理和远程操作处理;本地操作产生后,遍历Lmodel,找到目标结点后执行本地操作,并生成远程操作(Oremote)后向各个站点传播;当接收到Oremote时,首先在HT中获取目标结点,然后在Lmodel中获取操作位置,执行远程操作。本发明能够支持在大规模对等网络环境下多用户实时协同编辑同一份文档,能够确保多用户的实时协同编辑的一致性。
【专利说明】
-种支持字符串操作的实时协同编辑一致性维护方法
技术领域
[0001] 本发明属于计算机支持的协同工作领域,设及一种实时文本协同编辑方法,具体 设及一种支持字符串操作的实时协同编辑一致性维护方法。
【背景技术】
[0002] 实时协同编辑是计算机支持的协同工作中的一个重要应用领域。实时协同编辑系 统有别于传统的分布式系统,允许不同地理位置的用户同时编辑同一份文档,每个站点都 存储共享文档的副本。由于多用户可同时编辑共享文档的副本,因而给共享文档的一致性 维护带来了挑战。
[0003] 可交换的复制数据类型(Commutative R邱Iicated Data Type,C畑T)方法是近几 年新兴的一致性维护方法。主要思想,通过分配给操作对象唯一全局的ID,使得并发操作可 W交换执行。基于操作对象的ID将其全序的映射到内部数据结构中,可维护操作意图的一 致性,并收敛于一致性的结果。与传统的一致性维护的方法相比,CRDT方法的计算效率更 高,具有很好的操作响应性。然而,大部分CRDT方法都不支持字符串的操作。

【发明内容】

[0004] 为了解决上述技术问题,本发明提供了一种支持字符串的CRDT方法,尤其适合大 规模的支持字符串操作的实时协同编辑一致性维护方法。
[0005] 本发明所采用的技术方案是:一种支持字符串操作的实时协同编辑一致性维护方 法,其特征在于:所述方法中的每个站点都维护两层数据结构:视图层View和模型层Model; 所述模型层Model包括哈希表HT和双链表Lmodel;所述哈希表HT哈希存储所有结点Node,其 中,每个结点Node存储操作的字符串;所述双链表Lmodel全序链接所述哈希表HT中的结点 Node ;所述视图层View提供了用户交互的界面,包括一个双链表Lview,是由所述双链表 Lmodel中所有可见的结点Node链接而成;所述方法的控制流程分为本地操作处理和远程操 作处理;本地操作产生后,遍历所述双链表Lmodel,找到目标结点后执行本地操作,并生成 操作的传播形式化emote后向各个站点传播;当接收到远程操作时,首先在所述哈希表HT中 获取有效目标结点,然后在所述双链表Lmodel中获取有效的操作位置,执行远程操作;所述 视图层View和所述模型层Model之间的同步过程为所述双链表Lview链接所述双链表 Lmode 1中所有可见结点。
[0006] 作为优选,本地操作具体实现包括W下子步骤:
[0007] 步骤1.1:用户产生本地元操作0;
[000引步骤1.2:判断元操作0是否为插入操作;
[0009] 若是,则执行下述步骤1.3;
[0010] 若否,则执行下述步骤1.15;
[0011] 步骤1.3:判断结点Node是否为双链表Lmodel中的头结点;
[0012] 若是,则执行下述步骤1.4;
[0013]若否,则执行下述步骤1.7;
[0014] 步骤1.4:创建新结点化w_Node;
[0015]步骤1.5:将新结点New_Node链接至IjLmodel中的头结点后;
[0016] 步骤1.6:将新结点化w_Node添加到所述哈希表HT中,本流程结束;
[0017]步骤1.7:判断是否在结点Node内部插入;
[001引若是,则执行下述步骤1.8;
[0019] 若否,则执行下述步骤1.12;
[0020] 步骤1.8:创建新结点化w_Node;
[0021] 步骤1.9:将结点Node分裂为两个子结点,分别记作FNode和LNode;
[0022] 步骤1.10:将新结点化w_Node链接到FNode和LNode之间;
[0023] 步骤1.11:将新结点化w_Node、FNode和LNode添加到所述哈希表HT中,本流程结 束;
[0024] 步骤1.12:包健新结点化w_Node;
[00巧]步骤1.13:将新结点化w_Node链接到双链表Lmodel中的Node后;
[0026] 步骤1.14:将新结点化w_Node添加到所述哈希表HT中,本流程结束;
[0027] 步骤1.15:判断删除字符串是否跨越多个结点;
[00%]若是,则执行下述步骤1.16;
[0029] 若否,则执行下述步骤1.19;
[0030] 步骤1.16:删除第一个结点Node;
[0031] 步骤1.17:删除中间n-1个结点Node;
[0032] 步骤1.18:删除最后一个结点Node,本流程结束;
[0033] 步骤1.19:判断是否删除整个结点;
[0034] 若是,则执行下述步骤1.20;
[0035] 若否,则执行下述步骤1.21;
[0036] 步骤1.20:将结点Node置为墓碑,本流程结束;
[0037] 步骤1.21:判断是否删除结点前部分;
[0038] 若是,则执行下述步骤1.22;
[0039] 若否,则执行下述步骤1.24;
[0040] 步骤1.22:将结点Node分裂为子结点FNode和LNode;
[0041 ] 步骤1.23:将FNode置为墓碑,本流程结束;
[0042] 步骤1.24:判断是否删除结点后部分;
[0043] 若是,则执行下述步骤1.25;
[0044] 若否,则执行下述步骤1.27;
[0045] 步骤1.25:将结点Node分裂为子结点FNode和LNode;
[0046] 步骤1.26:将LNode置为墓碑,本流程结束;
[0047] 步骤1.27:将结点齡(16分裂为=个子结点,记作。齡(16、]^0(16和^^(16;
[004引步骤1.28:将MNode置为墓碑,本流程结束。
[0049] 作为优选,远程操作具体实现包括W下子步骤:
[0050] 步骤2.1:针对接收到的远程操作0,判断0是否为插入操作;
[0051 ]若是,则执行下述步骤2.2;
[0052]若否,则执行下述步骤2.21;
[0053] 步骤2.2:寻找目标结点Node;
[0054] 步骤2.3:判断目标结点Node是否为双链表Lmodel中的头结点;
[0055] 若是,则执行下述步骤2.4;
[0056] 若否,则执行下述步骤2.12;
[0057] 步骤2.4:判断目标结点Node后是否有其它并发插入的结点;
[0058] 若是,则执行下述步骤2.5;
[0059] 若否,则执行下述步骤2.9;
[0060] 步骤2.5:创建新结点化w_Node;
[0061 ]步骤2.6:比较新结点化w_Node与其它并发插入结点的标识符Key,找插入位置;
[0062] 步骤2.7:找并发插入结点的标识符K巧小于^w_Node的标识符K巧的第一个结点, 记作枯r_Node,新结点P^ew_Node插入到I^LNode前;
[0063] 步骤2.8:将新结点化w_Node添加到所述哈希表HT中,本流程结束;
[0064] 步骤2.9:创建新结点化w_Node;
[0065] 步骤2.10:将新结点化w_Node链接到所述双链表Lmodel中的Node后;
[0066] 步骤2.11:将新结点化w_Node添加到所述哈希表HT中,本流程结束;
[0067] 步骤2.12:判断是否在结点Node内部插入;
[0068] 若是,则执行下述步骤2.13;
[0069] 若否,则执行下述步骤2.17;
[0070] 步骤2.13:包健新结点化w_Node;
[0071] 步骤2.14:将结点Node分裂为两个子结点FNode和LNode;
[0072] 步骤2.15:将新结点化w_Node链接到FNode和LNode之间;
[0073] 步骤2.16:将新结点化w_Node、FNode和LNode添加到所述哈希表HT中,本流程结 束;
[0074] 步骤2.17:包!建新结点化w_Node;
[0075] 步骤2.18:比较新结点化w_Node与Node后其他并发插入结点的标识符Key,找插入 位置;
[0076] 步骤2.19:找并发插入结点中的标识符Ifey小于化w_Node的标识符Ifey的第一个结 点,记作枯r_Node,新结点P^ew_Node插入到枯r_Node前;
[0077] 步骤2.20:将新结点化w_Node添加到所述哈希表HT中,本流程结束;
[0078] 步骤2.21:判断删除字符串是否跨越多个结点;
[0079] 若是,则执行下述步骤2.22;
[0080] 若否,则执行下述步骤2.25;
[0081 ]步骤2.22:删除第一个结点Node;
[00剧步骤2.23:删除中间n-1个结点Node;
[0083] 步骤2.24:删除最后一个结点Node,本流程结束;
[0084] 步骤2.25:判断是否删除整个结点;
[0085] 若是,则执行下述步骤2.26;
[0086] 若否,则执行下述步骤2.27;
[0087] 步骤2.26:将结点Node置为墓碑,本流程结束;
[0088] 步骤2.27:判断是否删除结点前部分;
[0089] 若是,则执行下述步骤2.28;
[0090] 若否,则执行下述步骤2.30;
[0091] 步骤2.28:将结点Node分裂为FNode和LNode;
[0092] 步骤2.29:将FNode置为墓碑,本流程结束;
[0093] 步骤2.30:判断是否删除结点后部分;
[0094] 若是,则执行下述步骤2.31;
[00M]若否,则执行下述步骤2.33;
[0096] 步骤2.31:将结点Node分裂为FNode和LNode;
[0097] 步骤2.32:将LNode置为墓碑,本流程结束;
[0098] 步骤2.33:将结点Node分裂为=个子结点,记作FNode、MNode和LNode;
[0099] 步骤2.34:将MNode置为墓碑,本流程结束。
[0100] 作为优选,如果要维持结点Node之间的全序关系不仅需要给每个结点Node分配唯 一的ID,而且还需要维护一个哈希表HT。
[0101] 作为优选,当ID中若干判定条件相等情况下,则能用站点号来定序,基于哈希表HT 和唯一的ID,通过哈希映射,能在0( 1)时间内找到双链表Lmodel中目标结点Node。
[0102] 作为优选,双链表Lmodel中的Node可能由于并发并发操作导致Node分裂,因此需 要找Node分裂的子结点,故需要给子结点分配唯一的ID;找到子结点后,能执行相应的插入 或删除操作。
[0103] 本方法不仅可维护操作意图的一致性还能实现结果一致性。该方法比目前典型的 CRDT方法的效率都高,可提供很好的操作响应性,并适合大规模的协同编辑环境。
【附图说明】
[0104] 图1:本发明实施例的整体框架图;
[0105] 图2:本发明实施例的本地操作流程图;
[0106] 图3:本发明实施例的远程操作流程图;
[0107] 图4:本发明实施例的协同工作场景示意图;
[0108] 图5:本发明实施例的S个站点的协同工作场景示意图。
【具体实施方式】
[0109] 为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发 明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不 用于限定本发明。
[0110] 请见图1,本发明提供的一种支持字符串操作的一致性维护方法的每个站点都维 护两层数据结构:视图层(View)和模型层(Model) DModel包括哈希表化T,Hash hble)和双 链表(Lmodel)DHT哈希存储所有结点Node。其中,每个Node存储操作的字符串。Lmodel全序 链接HT中的Node sView提供了用户交互的界面,包括一个双链表Lview,是由Lmodel中所有 可见的Node链接而成。
[0111] 控制流程分为本地操作处理和远程操作处理。本地操作产生后,遍历Lmodel,找到 目标结点后执行本地操作,并生成操作的传播形式化emote后向各个站点传播。当接收到远 程操作时,首先在HT中获取有效目标结点,然后在Lmodel中获取有效的操作位置,执行远程 操作。View和Model之间的同步过程为Lview链接Lmodel中所有可见结点(不包括Lmodel中 的墓碑结点)。
[0112] W下通过具体实施例对本发明做进一步的阐述;
[0113] 请见图2,本实施例的本地操作处理分为本地插入操作和本地删除操作,执行步骤 如下:
[0114] (1)本地插入操作
[0115] 基于插入操作的目标结点Node在Lmodel中位置,分两种情况:第一,如果在头结点 插入,直接将新结点化w_Node链接到Lmodel中,并将^w_Node添加到HT中;第二,如果不在 头结点插入,在Lmodel中找到目标结点后,具体分两种情况:①如果在目标结点内插入,目 标结点被分裂成前后两个子结点FNode和LNode,需要将FNode、新结点^w_Node、LNode链接 到Lmodel中,并将运;个结点添加到HT中;②如果在目标结点后插入,需要将新结点New_ Node链接到Lmodel中,并且将化w_Node添加到HT中。
[0116] (2)本地删除操作
[0117] 本地删除操作需要考虑五种情况。第一,删除整个结点,直接将其置为墓碑。第二, 删除结点前部分,导致原始结点分裂成前后两个结点,将前结点置为墓碑,并将前后结点链 接到Lmodel中。第S,删除结点后部分,导致原始结点分裂成前后两个结点,将后结点置为 墓碑,并将前后结点链接到Lmodel中。第四,删除结点的中间部分,导致原始结点分裂成前、 中、后立个结点,将中间结点置为墓碑,并将运立个结点链接到Lmodel中。第五,删除的字符 序列跨越多个结点。
[0118] 请见图3,本实施例的远程操作处理分为远程插入操作和远程删除操作,执行步骤 如下:
[0119] (1)远程插入操作
[0120] 根据接收的远程插入操作的原结点的key,在HT中找有效的目标结点。找到目标结 点后,插入新结点^w_Node分如下两种情况。(1)目标结点不是头结点,分①②两种情况。① 在目标结点后插入,需要与目标结点后的多个并发插入结点比较各自的key,直到某个并发 插入结点的4巧<新结点^w_Node的key,将化w_Node双向链接到该并发结点前,并将化讯_ Node插入到HT中;②在目标结点内插入,导致目标结点被分裂成前后两个结点FNode和 LNode,将新结点化w_Node双向链接到FNode和LNode之间,并将r^ew_Node、FNode和LNode插 入到HT中。(2)目标结点是头结点,分为①②两种情况。①目标结点后有多个结点,需要逐个 遍历目标结点后的结点,直到某个结点的4巧<新结点^w_Node的key,将化w_Node双向链接 到该结点前,并将^w_Node插入到HT中;②目标结点后无结点,直接将化w_Node双向链接到 目标结点后,将新结点化w_Node插入到HT中。
[0121] (2)远程删除操作
[0122] 远程删除操作需要考虑两种情况。第一,若删除的字符串位于一个结点内,直接将 删除的字符串设置为墓碑。第二,若删除的字符串跨越多个结点,需要先删除第一结点,再 删除中间的n-1个结点,最后删除第n个结点,分别将相应的结点设置为墓碑。
[0123] 首先进行相关定义:
[0124] 定义lNode<key, f Ia邑,visible, content ,prior ,next, link, list〉是一个八元组。 key为Node的唯一标识;flag表示Node是否分裂;visible表示Node是否可见;content表示 存储的字符串;prior、next和link用于链接Node; list存储分裂的Node。
[01巧]定义2ID<s, SSV, site, off set, len〉为一个五元组,s为session的标识符,一个全 局递增整数;SSV为状态向量sv[k]的求和,MV = X.叫/(] :site为站点号;off set为偏移量, A二1 即当前Node的最左面字符与原始Node(未被分裂的结点)的最左面字符的距离,初值为0; 1 en为Node的长度,即对应字符串的长度。
[0126] 定义3给定Pfcclei和Pfcdes的ID为化kfe,和巧,如果社3AWe, ^ ,当且仅当满足下 列条件之一:(1)巧<恐MW,柏:(2)如果有Ww响W =化心:M,且/成,*[.?节] < 端。冰的: 或(3)如果存/。、、,吨[叫=八入M "入叫=哗…/护 果有巧V。脚M=Ww,[小恐邮,,DmJ=ZAn冰冲,巧VaJw'化]=巧
[0127] 基于定义1到定义3,在图4的协同工作场景中,有sitel,site2和site3共同参与,且 session的计数为1。各操作Oi,〇2,〇3,〇4对应的字序列长度分别3,4,6,5,各站点产生的操作及对应 的SV如图4所示。操作结点的ID分别为=(U,l,〇,化W.V。*。,=(1,2丄〇, 4),皿V。*。气1山2,〇向, ?A'"/e4=(リ,3凡5)。基于定义巧口定义3,有化w。沁(,<化'v。沁巧'<化W化/崎<風^?沁0。'
[0128] 图5为一个session中=个站点的协同工作场景。假设session的计数为1,初始状 态为空,站点号大小为sitel<site2<site3,其中为在第i个站点的第j个状态,表示为墓 碑字符。为更好描述字符序列对应的结点的前后位置和结点分裂情况,本文用"一"连接字 符序列对应的结点。Sitel产生本地操作01 = inse;rt(0,0, "aaa" ),04 = inse;rt(l ,2, "ddd" ); site2产生本地操作02 = inse;rt(0,0, "bbb" ),05 = inse;rt( I, I, "eee" ); site3产生 本地操作 03 = 1邮6的(0,0,"(3(3(3"),06 = (161616(1,1,2)。各个操作的5¥分别为5¥(01) = (1,0, 0),SV 他)=(0,1,0),^(03) = (0,0,1),8¥(04) = (2,1,0)苗¥(肪)=(0,2,0),5¥(06) = (0,0,2)。各个操 作对象分配的ID为曲W。心=(U,l,〇,3),扭A,。*。, =(U,m巧,=(U,3,〇,巧,思,,。&。^ =(13,1 A媒 :二(!,2,2,〇,3), /公、:二(―1,2,3,0,2)。按照 I D 的全序机制,有 胆俯斬、亩{〇邮化化令取邮化。,< 心舌化拥&化令取触抽。
[0129] 表1给出该方法的执行过程。利用本发明提出的支持字符串操作的协同编辑方法, S个站点都收敛于"cc-c-b-eee-b-ddd-b-aaa",即"cbeeebdcMbaaa"。综上所述,支持字符 串的文本编辑实时协同方法,能够实现多个站点维护协同结果的一致性。
[0130] 表1各站点操作的执行
[01331
[0134] 本方法比目前典型的CRDT方法的效率都高,可提供很好的操作响应性,并适合大 规模的协同编辑环境。
[0135] 应当理解的是,本说明书未详细阐述的部分均属于现有技术。
[0136] 应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本 发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权 利要求所保护的范围情况下,还可W做出替换或变形,均落入本发明的保护范围之内,本发 明的请求保护范围应W所附权利要求为准。
【主权项】
1. 一种支持字符串操作的实时协同编辑一致性维护方法,其特征在于:所述方法中的 每个站点都维护两层数据结构:视图层View和模型层Model;所述模型层Model包括哈希表 HT和双链表Lmodel;所述哈希表HT哈希存储所有结点Node,其中,每个结点Node存储操作的 字符串;所述双链表Lmode 1全序链接所述哈希表HT中的结点Node;所述视图层Vi ew提供了 用户交互的界面,包括一个双链表Lview,是由所述双链表Lmodel中所有可见的结点Node链 接而成;所述方法的控制流程分为本地操作处理和远程操作处理;本地操作产生后,遍历所 述双链表Lmodel,找到目标结点后执行本地操作,并生成操作的传播形式Oremote后向各个 站点传播;当接收到远程操作时,首先在所述哈希表HT中获取有效目标结点,然后在所述双 链表Lmodel中获取有效的操作位置,执行远程操作;所述视图层View和所述模型层Model之 间的同步过程为所述双链表Lview链接所述双链表Lmodel中所有可见结点。2. 根据权利要求1所述的支持字符串操作的实时协同编辑一致性维护方法,其特征在 于,本地操作具体实现包括以下子步骤: 步骤1.1:用户产生本地元操作0; 步骤1.2:判断元操作0是否为插入操作; 若是,则执行下述步骤1.3; 若否,则执行下述步骤1.15; 步骤1.3:判断结点Node是否为双链表Lmodel中的头结点; 若是,则执行下述步骤1.4; 若否,则执行下述步骤1.7; 步骤1.4 :创建新结点New_Node; 步骤1.5:将新结点New_Node链接到Lmodel中的头结点后; 步骤1.6:将新结点New_Node添加到所述哈希表HT中,本流程结束; 步骤1.7:判断是否在结点Node内部插入; 若是,则执行下述步骤1.8; 若否,则执行下述步骤1.12; 步骤1.8:创建新结点New_Node; 步骤1.9:将结点Node分裂为两个子结点,分别记作FNode和LNode; 步骤1.10:将新结点New_Node链接到FNode和LNode之间; 步骤1.11:将新结点New_Node、FNode和LNode添加到所述哈希表HT中,本流程结束; 步骤1.12:仓ij建新结点New_Node; 步骤1.13:将新结点New_Node链接到双链表Lmodel中的Node后; 步骤1.14:将新结点New_Node添加到所述哈希表HT中,本流程结束; 步骤1.15:判断删除字符串是否跨越多个结点; 若是,则执行下述步骤1.16; 若否,则执行下述步骤1.19; 步骤1.16:删除第一个结点Node; 步骤1.17:删除中间n-1个结点Node; 步骤1.18:删除最后一个结点Node,本流程结束; 步骤1.19:判断是否删除整个结点; 若是,则执行下述步骤1.20; 若否,则执行下述步骤1.21; 步骤1.20:将结点Node置为墓碑,本流程结束; 步骤1.21:判断是否删除结点前部分; 若是,则执行下述步骤1.22; 若否,则执行下述步骤1.24; 步骤1.22:将结点Node分裂为子结点FNode和LNode; 步骤1.23:将FNode置为墓碑,本流程结束; 步骤1.24:判断是否删除结点后部分; 若是,则执行下述步骤1.25; 若否,则执行下述步骤1.27; 步骤1.25:将结点Node分裂为子结点FNode和LNode; 步骤1.26:将LNode置为墓碑,本流程结束; 步骤1.27:将结点Node分裂为三个子结点,记作FNode、MNode和LNode; 步骤1.28:将MNode置为墓碑,本流程结束。3.权利要求1所述的支持字符串操作的实时协同编辑一致性维护方法,其特征在于,远 程操作具体实现包括以下子步骤: 步骤2.1:针对接收到的远程操作0,判断0是否为插入操作; 若是,则执行下述步骤2.2; 若否,则执行下述步骤2.21; 步骤2.2:寻找目标结点Node; 步骤2.3:判断目标结点Node是否为双链表Lmodel中的头结点; 若是,则执行下述步骤2.4; 若否,则执行下述步骤2.12; 步骤2.4:判断目标结点Node后是否有其它并发插入的结点; 若是,则执行下述步骤2.5; 若否,则执行下述步骤2.9; 步骤2.5 :创建新结点New_Node; 步骤2.6:比较新结点New_Node与其它并发插入结点的标识符Key,找插入位置; 步骤2.7:找并发插入结点的标识符Key小于New_Node的标识符Key的第一个结点,记作 Tar_Node,新结点 New_Node 插入到 Tar_Node 前; 步骤2.8:将新结点New_Node添加到所述哈希表HT中,本流程结束; 步骤2.9:创建新结点New_Node; 步骤2.10:将新结点New_Node链接到所述双链表Lmodel中的Node后; 步骤2.11:将新结点New_Node添加到所述哈希表HT中,本流程结束; 步骤2.12:判断是否在结点Node内部插入; 若是,则执行下述步骤2.13; 若否,则执行下述步骤2.17; 步骤2.13:仓ij建新结点New_Node; 步骤2.14:将结点Node分裂为两个子结点FNode和LNode; 步骤2.15:将新结点New_Node链接到FNode和LNode之间; 步骤2.16:将新结点New_Node、FNode和LNode添加到所述哈希表HT中,本流程结束; 步骤2.17:仓ij建新结点New_Node; 步骤2.18:比较新结点New_Node与Node后其他并发插入结点的标识符Key,找插入位 置; 步骤2.19:找并发插入结点中的标识符Key小于New_Node的标识符Key的第一个结点, 记作Tar_Node,新结点New_Node插入到Tar_Node前; 步骤2.20:将新结点NeW_N〇de添加到所述哈希表HT中,本流程结束; 步骤2.21:判断删除字符串是否跨越多个结点; 若是,则执行下述步骤2.22; 若否,则执行下述步骤2.25; 步骤2.22:删除第一个结点Node; 步骤2.23:删除中间n-1个结点Node; 步骤2.24:删除最后一个结点Node,本流程结束; 步骤2.25:判断是否删除整个结点; 若是,则执行下述步骤2.26; 若否,则执行下述步骤2.27; 步骤2.26:将结点Node置为墓碑,本流程结束; 步骤2.27:判断是否删除结点前部分; 若是,则执行下述步骤2.28; 若否,则执行下述步骤2.30; 步骤2.28:将结点Node分裂为FNode和LNode; 步骤2.29:将FNode置为墓碑,本流程结束; 步骤2.30:判断是否删除结点后部分; 若是,则执行下述步骤2.31; 若否,则执行下述步骤2.33; 步骤2.31:将结点Node分裂为FNode和LNode; 步骤2.32:将LNode置为墓碑,本流程结束; 步骤2.33:将结点Node分裂为三个子结点,记作FNode、MNode和LNode; 步骤2.34:将MNode置为墓碑,本流程结束。4. 根据权利要求1-3任意一项所述的支持字符串操作的实时协同编辑一致性维护方 法,其特征在于:如果要维持结点Node之间的全序关系不仅需要给每个结点Node分配唯一 的ID,而且还需要维护一个哈希表HT。5. 根据权利要求4任意一项所述的支持字符串操作的实时协同编辑一致性维护方法, 其特征在于:当ID中若干判定条件相等情况下,则能用站点号来定序,基于哈希表HT和唯一 的ID,通过哈希映射,能在0( 1)时间内找到双链表Lmodel中目标结点Node。6. 根据权利要求5任意一项所述的支持字符串操作的实时协同编辑一致性维护方法, 其特征在于:双链表Lmodel中的Node可能由于并发并发操作导致Node分裂,因此需要找 Node分裂的子结点,故需要给子结点分配唯一的ID;找到子结点后,能执行相应的插入或删 除操作。
【文档编号】G06F17/24GK105955828SQ201610238983
【公开日】2016年9月21日
【申请日】2016年4月18日
【发明人】何发智, 吕晓, 蔡维纬
【申请人】武汉大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1