一种基于排序字典树的计算机联锁码位搜索方法与流程

文档序号:37377206发布日期:2024-03-22 10:29阅读:11来源:国知局
一种基于排序字典树的计算机联锁码位搜索方法与流程

本发明属于计算机联锁系统领域,特别涉及一种基于排序字典树的计算机联锁码位搜索方法。


背景技术:

1、目前,国内计算机联锁系统存在如操作显示机-联锁机、联锁机-轨旁设备等诸多内部接口,此外还包括诸多外部接口,所述外部接口与tcc(列控中心)、rbc(无线闭塞中心)、邻站cbi(计算机联锁系统)、全电子等外部系统存在接口通信,内、外部接口通过协商码位表实现特定状态信息的收发,因此在计算机联锁系统的日常维护或仿真模拟等作业中,经常涉及到基于用户输入关键字对码位表进行匹配搜索,以追踪特定码位对象状态信息的操作。

2、当前基于关键字对码位表进行匹配搜索的方法,主要通过对码位表数据结构进行逐项遍历,在每个循环周期中将当前码位对象的名称字符串与关键字进行比对,若关键字为码位名称字符串的子串,则匹配成功,将码位对象放入搜索结果集,并进行下一轮循环迭代。这种方法本质上是三层循环的“暴力”搜索:(1)第一层循环对码位表数据结构逐项遍历,进入第二层循环;(2)第二层循环对当前码位对象的名称字符串逐字节遍历,直至找到关键字首字节,进入第三层循环;(3)第三层循环对名称字符串及关键字后续字节逐字节遍历。这种方法在最坏情况下时间复杂度为o(m*n*k),m为码位表大小,n为码位对象名称平均长度,k为关键字长度,当联锁车站码位数量变大,或码位对象名称平均长度变长,或用户输入关键字长度变长时,单次搜索消耗时间将显著增加,因此现有技术中的搜索方法无法满足用户对码位搜索高效性的需求,尤其在边输入边给出搜索结果集的实时响应搜索模块,将出现难以忍受的延迟卡顿。


技术实现思路

1、本发明的目的是提供一种基于排序字典树的计算机联锁码位搜索方法,以满足码位搜索的高效性的需求。

2、为实现上述目的,本发明提供一种基于排序字典树的计算机联锁码位搜索方法,其包含:

3、步骤s1、初始化排序字典树数据结构,所述排序字典树数据结构包括包含有一个根节点和若干个树节点的排序字典树、存放所有码位对象指针的排序一维数组sortedbitarr以及用于确定起始搜索字典树节点的二维数组val2nodesarr;

4、步骤s2、依次插入码位表中包含的所有码位对象,每次插入时根据码位对象名称字符串重构排序字典树数据结构,将每个码位对象指针按序插入排序一维数组sortedbitarr,并根据新增的树节点重新填充用于确定起始搜索字典树节点的二维数组val2nodesarr;

5、步骤s3、根据用户当前输入的关键字,基于二维数组val2nodesarr获得所有起始搜索字典树节点,从各起始搜索字典树节点依次前序遍历排序字典树,若关键字匹配成功,则结合排序一维数组sortedbitarr确定所有符合的码位对象并放入搜索结果集。

6、优选的,所述根节点和每个所述树节点包括:节点表示字符值val、指向第一个子节点的指针firstchild、指向同一层级的下一右侧兄弟节点的指针rightnode、节点在sortedbitarr首次出现的下标startidx。

7、优选的,步骤s1所述的初始化排序字典树数据结构,包括步骤s11:初始化字典树根节点root;所述步骤s11具体包括如下步骤:

8、步骤s111、将字典树根节点root的节点表示字符值val初始化为0,表示root仅代表字典树根节点,不表示任何码位对象关联节点;

9、步骤s112、将字典树根节点root的firstchild、rightnode初始化为nullptr,表示当前未插入任何码位对象;

10、步骤s113、将字典树根节点root的startidx初始化为0,表示从该字典树根节点往下遍历所得到的所有码位对象,在sortedbitarr中出现的最小下标为0。

11、优选的,步骤s1所述的初始化排序字典树数据结构,包括步骤s12:初始化存放所有码位对象指针的排序一维数组sortedbitarr,其中排序一维数组sortedbitarr内按照码位对象名称字符串进行升序排序。

12、优选的,步骤s1所述的初始化排序字典树数据结构,包括步骤s13:初始化用于确定起始搜索字典树节点的二维数组val2nodesarr,其中val2nodesarr的第一维表示字符值映射的下标,第二维表示存放对应字符值的所有字典树节点指针数组。

13、优选的,步骤s2具体包括如下步骤:

14、步骤s21、根据码位表生成码位对象,所述码位对象包括码位名称字符串;

15、步骤s22、初始化当前遍历处在的树节点curnode为字典树根节点root的firstchild,设置匹配成功的所有树节点数组为遍历数组parentnodes,并将字典树根节点root插入parentnodes中,表示成功匹配字典树根节点root;

16、步骤s23、依次取出码位对象名称字符串的字符char,根据当前遍历处在的树节点curnode状态重构排序字典树数据结构;

17、其中,当前遍历处在的树节点curnode含义为匹配成功的前一树节点的第一个子节点指针firstchild。、

18、优选的,若当前遍历处在的树节点curnode为nullptr,表示不存在当前字符char对应的树节点,匹配失败,创建第一新树节点,具体包括如下步骤:

19、步骤s231、初始化该第一新树节点的firstchild、rightnode为nullptr,且初始化该第一新树节点的val为当前字符char;

20、步骤s232、初始化该第一新树节点的startidx为对应父节点的startidx+1,将遍历数组parentnodes中的所有树节点进行递归前序遍历,使位于第一新树节点右侧的所有树节点的startidx自增1;其中,parentnodes中的所述右侧所有树节点包括所有匹配成功节点的firstchild节点、rightnode节点及firstchild节点和rightnode的衍生节点;

21、步骤s233、将码位对象指针插入sortedbitarr,插入位置为第一新树节点的startidx;

22、步骤s234、根据第一新树节点的val值,将第一新树节点插入到val2nodesarr的结构中。

23、优选的,若当前码位对象名称字符串还有剩余字符未处理,则依次创建剩余字符的第二新树节点,其包括如下步骤:

24、步骤s235、初始化第二新树节点的节点表示字符值val为当前字符char;

25、步骤s236、每次创建的第二新树节点为第一新树节点的firstchild,且由于是同一码位对象的名称字符串,设置第二新树节点的startidx为第一新树节点的startidx;

26、步骤s237、根据第二新树节点的val值,将各个第二新树节点插入到val2nodesarr的结构中,完成该码位对象的插入处理。

27、优选的,若当前遍历处在的树节点curnode不为nullptr,则依次向右遍历rightnode,进行匹配char,其包括三种情况:情况1:若某个树节点的val匹配char成功,表示存在相同前缀的树节点;情况2:若遍历到某个树节点的val大于char,表示匹配失败需创建第三新树节点;情况3:若遍历完所有右侧树节点,未找到某个树节点的val等于char,表示匹配失败需创建第四新树节点。

28、优选的,在情况1下,若当前码位对象名称字符串均处理完成,表示当前码位对象名称字符串为其他码位对象的名称字符串的前缀,对当前树节点curnode向下衍生出的所有子节点和同一层级的右侧所有兄弟节点及其衍生节点的startidx进行递归前序遍历使各自的startidx自增1,完成该码位对象的插入处理;同时对遍历数组parentnodes中的所有树节点进行递归前序遍历,使位于当前树节点curnode右侧的所有树节点的startidx自增1;其中,parentnodes中的所述右侧所有树节点包括所有匹配成功节点的firstchild节点、rightnode节点及firstchild节点和rightnode的衍生节点。

29、优选的,在情况2下,所述创建第三新树节点包括:

30、步骤s241、初始化第三新树节点的firstchild为nullptr,rightnode为curnode,初始化val为当前字符char;

31、步骤s242、设置第三新树节点的startidx等于curnode的startidx,对curnode向下衍生生成的的衍生节点和同一层级右侧的所有兄弟节点及其衍生节点进行递归前序遍历,使各树节点的startidx自增1;同时对遍历数组parentnodes中的所有树节点进行递归前序遍历,使位于第三新树节点右侧的所有树节点的startidx自增1;其中,parentnodes中的所述右侧所有树节点包括所有匹配成功节点的firstchild节点、rightnode节点及firstchild节点和rightnode的衍生节点;

32、步骤s243、将码位对象指针插入sortedbitarr,插入位置为第三新树节点的startidx;

33、步骤s244、根据第三新树节点的val值,将第三新树节点插入到val2nodesarr的结构中。

34、优选的,在情况3下,所述创建第四新树节点包括:

35、步骤s251、初始化第四新树节点的firstchild、rightnode为nullptr,初始化val为当前字符char;

36、步骤s252、设置第四新树节点的startidx为最后遍历树节点的startidx+1,同时对遍历数组parentnodes中的所有树节点进行递归前序遍历,使位于第四新树节点右侧的所有树节点的startidx自增1;其中,parentnodes中的所述右侧所有树节点包括所有匹配成功节点的firstchild节点、rightnode节点及firstchild节点和rightnode的衍生节点;

37、步骤s253、将码位对象指针插入sortedbitarr,插入位置为第四新树节点的startidx;

38、步骤s254、根据第四新树节点的val值,将第四新树节点插入到val2nodesarr的结构中。

39、优选的,若当前码位对象名称字符串还有字符未处理,则重复步骤s235~步骤s237依次创建剩余字符的树节点,完成该码位对象的插入处理。

40、优选的,每次根据码位表生成码位对象后,通过检查码位对象名称是否重复来判断码位对象是否重复,若码位对象名称重复,则将该码位对象舍弃,不插入所述排序字典树结构。

41、优选的,步骤s3具体包括如下步骤:

42、步骤s31、根据用户当前输入关键字的首字符,结合val2nodesarr确定所有起始搜索字典树节点;

43、步骤s32、依次遍历每个起始搜索字典树节点,设置当前遍历处在的节点curnode为当前起始搜索字典树节点的firstchild;

44、步骤s33、依次遍历输入关键字首字符后续字符char,根据每次遍历的curnode状态分别处理;

45、步骤s34、、若根据该次遍历curnode状态搜索成功,取出最后遍历树节点的startidx,确定满足该次搜索条件的码位对象在sortedbitarr结构的起始搜索下标,取出码位对象并放入搜索结果集,获得该次搜索的搜索结果集。

46、优选的,若curnode为nullptr,表示该次搜索失败,返回步骤s32进入下一次搜索;若curnode不为nullptr,则依次向右遍历rightnode,进行匹配char。

47、优选的,在curnode不为nullptr的情况下,若遍历到某个树节点的val大于char;或遍历完所有右侧树节点,仍未找到某个树节点的val等于char,表示该次搜索失败,返回步骤s32进入下一次搜索。

48、优选的,在curnode不为nullptr的情况下,若某个树节点的val匹配char成功,且输入的关键字字符串不存在字符未处理,表示该次搜索成功,取出该树节点的startidx,进入步骤s34继续处理;若存在输入的关键字字符串还存在未处理的字符,则将curnode设为curnode的firstchild,返回步骤s33进入下一次遍历。

49、优选的,在确定满足该次搜索条件的起始搜索下标后,依次遍历sortedbitarr结构,取出码位对象并放入搜索结果集,直到出现前缀不相同的码位对象,并记录当前下标为endidx。

50、优选的,若后续起始搜索字典树节点的startidx小于endidx,表示该次起始搜索字典树节点为上一次成功搜索的最后遍历的树节点的下游子树,若搜索成功,该次搜索的搜索结果集为当前已知搜索结果集的子集,需跳过该次搜索;

51、若后续起始搜索字典树节点的startidx大于或等于endidx,表示该次起始搜索字典树节点为上一次成功搜索的最后遍历的树节点的右侧节点,若搜索成功,该次搜索的搜索结果集与当前已知搜索结果集不相交,则合并搜索结果集,并重新记录endidx。

52、综上所述,与现有技术相比,本发明提供的一种基于排序字典树的计算机联锁码位搜索方法,具有如下有益效果:

53、(1)本发明通过确定起始搜索树节点,结合前序遍历匹配确定搜索结果集在有序码位对象数组sortedbitarr的起始搜索下标,减少大量重复、不必要的搜索过程,克服了现有“暴力”遍历搜索方法时间复杂度高的缺陷;

54、(2)本发明通过设置用于确定起始搜索字典树节点的二维数组val2nodesarr,克服了经典字典树只能从根节点开始遍历搜索的缺陷,克服了字典树搜索方法只能进行前缀匹配的缺陷,极大提高了方法的搜索效率、成功率和可用性;

55、(3)本发明还设置了指向第一个子节点的指针firstchild和指向同一层级的下一右侧兄弟节点的指针rightnode等成员变量,相比经典多叉树,极大降低了每个节点的地址空间消耗;

56、(4)本发明在码位对象插入过程中保证了字典树及sortedbitarr结构的有序性,即实现了边插入边搜索的功能,如插入前基于二分法结合sortedbitarr确定码位对象是否重复,在排序字典树结构构建完成前已可进行搜索等操作,极大地提高了搜索方法的灵活性。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1