发明内容
本申请提供字符串存储、检索方法及装置,以解决现有存在存储的字符串占用较多内存的问题。
根据本申请实施例提供的一种字符串存储方法,所述方法包括:
步骤110:将待存储的字符串分解为单个的字符,得到字符集合;
步骤120:将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符;
步骤130:判断所述当前节点中是否存在所述当前字符;
步骤140:在所述当前节点中不存在所述当前字符的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符;
步骤150:将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,重复执行步骤130,直至所述字符集合中的字符都判断完毕。
可选的,在所述步骤130之后,所述方法还包括:
在所述当前节点中存在所述当前字符的情况下,执行步骤150。
可选的,所述步骤140,具体包括:
步骤141:在所述当前节点中不存在所述当前字符,并且所述当前节点不为第一级节点的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符,执行步骤150;
或者,
步骤142:在所述当前节点中不存在所述当前字符,并且所述当前节点为第一级节点的情况下,新增一个第一级节点,将所述当前字符写入该第一级节点中;
步骤143:将所述新增的节点确定为当前节点,将所述当前字符后一个字符确定为当前字符;
步骤144:在所述当前节点后新增一个节点,并将所述当前字符写入该新增的节点中,重复执行步骤143,直至所述字符集合中的字符都存储完毕。
根据本申请实施例提供的一种字符串检索方法,所述方法包括:
步骤210:接收传入的字符串;
步骤220:将所述字符串分解为单个的字符,得到字符集合;
步骤230:将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符;
步骤240:判断所述当前节点中是否存在所述当前字符;
步骤250:在所述当前节点中不存在所述当前字符的情况下,输出所述字符串不存在的检索结果。
可选的,所述方法还包括:
在所述当前节点中存在所述当前字符的情况下,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,重复执行步骤240。
可选的,所述步骤250,具体包括:
在所述当前节点中不存在所述当前字符的情况下,在数据库中检索所述字符串是否存在;
在数据库中也没有检索到所述字符串的情况下,输出所述字符串不存在的检测结果。
根据本申请实施例提供的一种字符串存储装置,所述装置包括:
分解单元,将待存储的字符串分解为单个的字符,得到字符集合;
处理单元,将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符;
判断单元,判断所述当前节点中是否存在所述当前字符;
存储单元,在所述当前节点中不存在所述当前字符的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符;
重复判断单元,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,输入到所述判断单元,直至所述字符集合中的字符都判断完毕。
可选的,所述重复判断单元还包括:
在所述当前节点中存在所述当前字符的情况下,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,输入到所述判断单元,直至所述字符集合中的字符都判断完毕。
可选的,所述存储单元,具体包括:
第一存储子单元,在所述当前节点中不存在所述当前字符,并且所述当前节点不为第一级节点的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符,执行所述重复判断单元;
或者,
第二存储子单元,在所述当前节点中不存在所述当前字符,并且所述当前节点为第一级节点的情况下,新增一个第一级节点,将所述当前字符写入该第一级节点中;
第三存储子单元,将所述新增的节点确定为当前节点,将所述当前字符后一个字符确定为当前字符;
第四存储子单元,在所述当前节点后新增一个节点,并将所述当前字符写入该新增的节点中,执行所述第三存储子单元,直至所述字符集合中的字符都存储完毕。
根据本申请实施例提供的一种字符串检索装置,所述装置包括:
接收单元,接收传入的字符串;
分解单元,将所述字符串分解为单个的字符,得到字符集合;
处理单元,将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符;
检索单元,判断所述当前节点中是否存在所述当前字符;
检索结果单元,在所述当前节点中不存在所述当前字符的情况下,输出所述字符串不存在的检索结果。
可选的,所述装置还包括:
重复检索单元,在所述当前节点中存在所述当前字符的情况下,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,输入到所述检索单元。
可选的,所述检索结果单元,具体包括:
第一检索结果子单元,在所述当前节点中不存在所述当前字符的情况下,在数据库中检索所述字符串是否存在;
第二检索结果子单元,在数据库中也没有检索到所述字符串的情况下,输出所述字符串不存在的检测结果。
本申请实施例中,通过在存储字符串的过程中,在当前字符已经存在于当前节点中的情况下,不存储该当前字符,而是共用当前节点。如此,由于每一级节点对于相同的字符只需存储一次,所以整体上本存储结构占用的内存空间相比现有技术中的要小。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以下列举一个在搜索网站中进行搜索的具体场景。在该场景中,搜索服务器对于用户提交的搜索关键词都会进行存储,便于用户查看历史搜索记录或者用于大数据分析等。具体地,所述服务器需要检索该搜索关键词是否已经存在,如果已经存在,则进入处理业务的流程;如果不存在,则需要存储该关键词,之后才能进入处理业务的流程。
在相关技术中,服务器对字符串进行存储,具体地,可以是存储在数据库中,也可以是存储在服务器的内存中。
对于所述存储在服务器内存中的情况,所述服务器进行检索时会变得相对较快,但是由于内存具有易失性,即如果服务器关闭那么该内存中存储的字符串就会全部丢失。
对于所述存储在数据库中的情况,由于数据库不存在易失性,所以存储在数据库中的字符串一般不是轻易丢失,但是由于相对于在内存中检索来说,在数据库中检索效率较低。
综合上述两种情况,服务器在存储字符串的过程中通常会做两手准备,即将字符串存储在数据库中,也将字符串存储在内存中。相应地,服务器在对传入的字符串检索时,是先在内存中进行检索,如果在内存中检索不到,再去数据库中检索。
所述数据库可以是位于所述服务器上的数据库,即服务器自身的内部数据库,也可以是与所述服务器关联的外部数据库。
如前所述,存储在内存中的字符串是以一个整体单独进行存储的,即每一个字符串都会完整的存储在服务器的内存中。相同的,存储在数据库中的字符串也是如此。
例如,有两个字符串分别是“1234”和“1235”。虽然这两个字符串中前三个字符“123”相同,仅仅最后一个字符不同,但是存储在内存中后依然是独立的两个字符串“1234”和“1235”,这两个字符串之间并无关联。如此,就会存在缓存的字符串占用较多内存的问题;特别是在缓存的字符串较多的情况下,容易造成占用较多内存,从而会由内存不足产生各种问题,例如检索效率低,检索时间长,服务器卡顿,死机、甚至崩溃等。
为了解决上述问题,请参见图1所示,为本申请一实施例提供的字符串存储方法的流程图,该实施例从服务器侧进行描述,所述方法可以包括以下步骤:
步骤110:将待存储的字符串分解为单个的字符,得到字符集合。
本实施例中,所述字符串是由至少一个的字符构成,而所述字符可以包括阿拉伯数字、各国文字(如英文、简体中文、繁体中文等)、特殊符号等计算机可直接或间接识别的数据。
服务器可以将待存储的字符串分解成单个的字符,从而得到字符集合。
例如,某一待存储的字符串为“12345”,则所述服务器可以将其分解成单个的字符:“1”,“2”,“3”,“4”,“5”;从而得到字符集合{1,2,3,4,5}。
步骤120:将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符。
本实施例中,所述存储结构位于内存中,并且所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符。具体地,所述存储结构是一种递归结构,包括两个域,一个是节点内的字符,另一个域是该节点的子节点集合。如图2所示,第一级节点内的字符为A,该节点的子节点集合即第二级节点(B、C所在的节点),构成了一个子结构。类似的,对于第二级节点内的字符B,与该节点的子节点集合即第三级节点合(D所在的节点)又构成了另一个子结构。
步骤130:判断所述当前节点中是否存在所述当前字符。
步骤140:在所述当前节点中不存在所述当前字符的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符;
步骤150:将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,重复执行步骤130,直至所述字符集合中的字符都判断完毕。
步骤160:在所述当前节点中存在所述当前字符的情况下,执行步骤150。
以下举例说明,如图3中所示,为一个待存储的字符串的存储过程示意图。其中,虚线部分为本次待存储的字符串“我是印度人”。服务器首先将其分解为单个的字符,得到字符集合{我,是,印,度,人}。
首先,判断存储结构的第一级节点中是否存在第一个字符“我”;
由于第一级节点中存在有字符“我”,判断所述第一级节点的下一级节点即第二级节点中是否存在第二个字符“是”;
由于第二级节点中存在有字符“是”,判断所述第二级节点的下一级节点即第三级节点中是否存在第三个字符“印”;
由于第三级节点中不存在有字符“印”,在所述第三级节点的父节点即字符为“是”的节点后新增一个子节点,并写入字符“印”;接着,判断所述第三级节点的下一级节点即第四级节点中是否存在第四个字符“度”;
由于第四级节点中不存在有字符“度”,在所述第四级节点的父节点即内容为“印”的节点后新增一个子节点,并写入字符“度”;接着,判断所述第四级节点的下一级节点即第五级节点中是否存在第五个字符“人”;
由于第五级节点中存在有字符“人”,并且所述字符集合中的字符都判断完毕了,所以,完成了将字符串“我是印度人”存储的过程。
由该例子可以看出,通过在存储字符串的过程中,在当前字符已经存在于当前节点中的情况下,不存储该当前字符,而是共用当前节点。如此,由于每一级节点对于相同的字符只需存储一次,所以整体上本存储结构占用的内存空间相比现有技术中的要小。
另举一个例子加以说明。如图4中所示,为另一个待存储的字符串的存储过程示意图。其中,虚线部分为本次待存储的字符串“我是新加坡人”。服务器首先将其分解为单个的字符,得到字符集合{我,是,新,加,坡,人}。
首先,判断存储结构的第一级节点中是否存在第一个字符“我”;
由于第一级节点中存在有字符“我”,判断所述第一级节点的下一级节点即第二级节点中是否存在第二个字符“是”;
由于第二级节点中存在有字符“是”,判断所述第二级节点的下一级节点即第三级节点中是否存在第三个字符“新”;
由于第三级节点中不存在有字符“新”,在所述第三级节点的父节点即字符为“是”的节点后新增一个子节点,并写入字符“新”;接着,判断所述第三级节点的下一级节点即第四级节点中是否存在第四个字符“加”;
由于第四级节点中不存在有字符“加”,在所述第四级节点的父节点即内容为“新”的节点后新增一个子节点,并写入字符“加”;接着,判断所述第四级节点的下一级节点即第五级节点中是否存在第五个字符“坡”;
由于第四级节点中不存在有字符“坡”,在所述第五级节点的父节点即内容为“加”的节点后新增一个子节点,并写入字符“坡”;接着,判断所述第五级节点的下一级节点即第六级节点中是否存在第六个字符“人”;
由于第六级节点中存在有字符“人”,并且所述字符集合中的字符都判断完毕了,所以,完成了将字符串“我是新加坡人”存储的过程。
由该例子可以看出,通过在存储字符串的过程中,在当前字符已经存在于当前节点中的情况下,不存储该当前字符,而是共用当前节点。如此,由于每一级节点对于相同的字符只需存储一次,所以整体上本存储结构占用的内存空间相比现有技术中的要小。
在实际应用中,当第一个字符不存在于第一级节点中的情况下,由于第一级节点(当前节点)没有父节点,无法在父节点后新增一个子节点。
在上述图1所述的实施例的基础上,如图5所示,所述步骤140,具体可以包括:
步骤141:在所述当前节点中不存在所述当前字符,并且所述当前节点不为第一级节点的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符,执行步骤150;
本实施例中,在当前节点不为第一级节点时,由于存在当前节点的父节点,所以依然按照:在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符,执行步骤150。
为了解决上述问题,本实施例提供了如下步骤:
步骤142:在所述当前节点中不存在所述当前字符,并且所述当前节点为第一级节点的情况下,新增一个第一级节点,将所述当前字符写入该第一级节点中;
步骤143:将所述新增的节点确定为当前节点,将所述当前字符后一个字符确定为当前字符;
步骤144:在所述当前节点后新增一个节点,并将所述当前字符写入该新增的节点中,重复执行步骤143,直至所述字符集合中的字符都存储完毕。
本实施例中,如果字符集合的第一个字符不存在于存储结构的第一级节点中,则服务器需要初始化一个第一级节点。
如图6中所示,为又一个待存储的字符串的存储过程示意图。其中,虚线部分为本次待存储的字符串“你是外国人”。服务器首先将其分解为单个的字符,得到字符集合{你,是,外,国,人}。
首先,判断存储结构的第一级节点中是否存在第一个字符“你”;
由于第一级节点中不存在字符“你”,服务器需要初始化一个第一级节点即新增一个第一级节点,并写入字符“你”;
接着,在第一级节点后新增一个子节点,并写入字符“是”;
在所述字符“是”所在的节点后新增一个子节点,并写入字符“外”;
在所述字符“外”所在的节点后新增一个子节点,并写入字符“国”;
在所述字符“国”所在的节点后新增一个子节点,并写入字符“人”。如此,完成了将字符串“你是外国人”存储的过程。
通过本实施例,在上述实施例中基础上,完善了字符集合的第一个字符不存在于存储结构的第一级节点中的情况。
在实际应用中,服务器内存中存储数据过多时,会影响该服务器的正常运行,例如响应延迟、卡顿、业务处理能力下降、甚至崩溃等。为了解决这个问题,在本申请的一个实施例中,所述方法还可以包括:
清除存储在所述内存中的存储结构。
本实施例中,清除存储在所述内存中的存储结构可以是服务器自动进行的,通过设置一个清除周期,例如1星期,即服务器1个星期清除一次存储在内存中的存储结构。
当然,清除存储在所述内存中的存储结构还可以是人为操控服务器进行清除的。例如,服务器可以提供用户一个用于清除存储结构的选项,在用户选择所述清除存储结构的选项后,服务器即可以接收到清除存储结构的指令,从而将存储在内存中的存储结构清除掉。
通过本实施例,系统可以定期或者不定期的清除存储在内存中的存储结构,避免存储字符串过多,导致服务器内存不足。
值得一提的是,如上所述对于待存储的字符串,服务器通常即会存储在内存中,也会存储在数据库中,所以即使将存储在内存中的字符串清除了,但是在数据库中的字符串并不受影响。
请参考图7所示,为本申请一实施例提供的字符串检索方法的流程图,该实施例从服务器侧进行描述,包括以下步骤:
步骤210:接收传入的字符串。
本实施例中,服务器实现字符串检索的过程中,首先需要接收传入的字符串。
步骤220:将所述字符串分解为单个的字符,得到字符集合。
本实施例中,所述字符串是由至少一个的字符构成,而所述字符可以包括阿拉伯数字、各国文字(如英文、简体中文、繁体中文等)、特殊符号等计算机可直接或间接识别的数据。
服务器可以将传入的字符串分解成单个的字符,从而得到字符集合。
例如,某一传入的字符串为“12345”,则所述服务器可以将其分解成单个的字符:“1”,“2”,“3”,“4”,“5”;从而得到字符集合{1,2,3,4,5}。
步骤230:将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符。
本步骤与上述实施例中步骤120相同,此处不再赘述。
步骤240:判断所述当前节点中是否存在所述当前字符。
步骤250:在所述当前节点中不存在所述当前字符的情况下,输出所述字符串不存在的检索结果。
步骤260:在所述当前节点中存在所述当前字符的情况下,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,重复执行步骤240。
本实施例中,服务器需要从所述字符集合的第一个字符开始检索。在检索到有字符不存在时,输出所述字符串不存在的检索结果。
以下举例说明。假设一个传入的字符串为“我是意大利人”,服务器分解后得到的字符集合{我,是,意,大,利,人},如图8所示为一个存储结构的示意图。
首先,服务器判断图8中的第一级节点中是否存在第一个字符“我”;
由于第一级节点中存在有字符“我”,判断所述第一级节点的下一级节点即第二级节点中是否存在第二个字符“是”;
由于第二级节点中存在有字符“是”,判断所述第二级节点的下一级节点即第三级节点中是否存在第三个字符“意”;
由于第三级节点中不存在字符“意”,所以服务器输出所述字符串不存在的检索结果。
需要说明的是,所述输出所述字符串不存在的检索结果后,所述服务器还需要将该字符串存储在存储结构中。具体地过程如上述字符串存储方法所示,此处不再赘述。
当然,在服务器检索所述字符集合中的字符均存在的情况下,所述服务器也可以输出所述字符串存在的检索结果。
假设一个传入的字符串为“我是印度人”,分解后得到的字符集合{我,是,印,度,人},依然沿用图8所示的存储结构。
首先,判断第一级节点中是否存在第一个字符“我”;
由于第一级节点中存在有字符“我”,判断所述第一级节点的下一级节点即第二级节点中是否存在第二个字符“是”;
由于第二级节点中存在有字符“是”,判断所述第二级节点的下一级节点即第三级节点中是否存在第三个字符“印”;
由于第三级节点中存在有字符“印”,判断所述第三级节点的下一级节点即第四级节点中是否存在第四个字符“度”;
由于第四级节点中存在有字符“度”,判断所述第四级节点的下一级节点即第五级节点中是否存在第五个字符“人”;
由于第五级节点中存在有字符“人”,并且所述字符集合中所有的字符都检索完毕,所以服务器输出该字符串已存在的检索结果。
在实际应用中,服务器内存缓存数据过多时,会影响系统的正常运行,例如响应延迟、卡顿、业务处理能力下降、甚至崩溃等。所以,一般的,系统会定时或者不定时的对内存中缓存的字符串进行清除。然而,在清除内存中缓存的字符串后,如果再次传入相同的字符串,那么在内存中就无法检索到,但是实际上该字符串的确存在过。为了解决这个问题,在图8所述实施例的基础上,所述步骤250,具体可以包括如下所示的步骤:
在所述当前节点中不存在所述当前字符的情况下,在数据库中检索所述字符串是否存在;
在数据库中也没有检索到所述字符串的情况下,输出所述字符串不存在的检测结果。
在本实施例中,如果传入的字符串在存储结构中不存在,还可以从数据库中进行进一步检索。由于存储字符串时,即缓存在内存的存储结构中,也存储在数据库中,所以对于已经传入过的字符串,即使由于内存清理后无法在存储结构中检索到,但依然还是可以在数据库中检索到;并且如果在数据库中检索到,那么所述服务器还需要将检索到的字符串同步到所述存储结构中去,即将所述字符串存储到所述存储结构中。
在本申请一实施例提供的字符串检索系统的架构图中,该系统可以包括服务器。
所述服务器可以用于接收传入的字符串,并将所述字符串在存储结构中进行检索,从而得出该字符串是否已经存在的检索结果;还用于在检索得到所述字符串不存在的情况下,将所述字符串存储到所述存储结构中。其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符。
需要说明的是,所述服务器可以向外部提供一个用于字符串检索的软件包,如此,外部调用方就可以安装所述用于字符串检索的软件包,并通过安装后的API(ApplicationProgramming Interface,应用程序编程接口)向所述服务器发送需要检索的字符串。
如图9所示的另一个系统的架构图中,该系统包括外部调用方和服务器。
所述外部调用方,用于通过字符串检索API向服务器发送需要检索的字符串;还用于接收所述服务器返回的检测结果。
所述服务器,用于接收传入的字符串,并将所述字符串在存储结构中进行检索,向所述外部调用分返回该字符串是否已经存在的检测结果;还用于在检索后输出该字符串不存在的情况下,还需要将该字符串存储到所述存储结构中。
除此之外,所述服务器在检索后输出该字符串不存在的情况下,还可以进一步在数据库中进行检索;如果在所述数据库中存在,则除了向所述外部调用方返回检测结果之外,还可以同步到存储结构中。具体地存储过程如上述字符串存储方法所示,此处不再赘述。
与前述字符串存储方法实施例相对应,本申请还提供了字符串存储装置的实施例。
本申请字符串存储装置的实施例可以分别应用在服务器。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图10所示,为本申请字符串存储装置所在设备的一种硬件结构图,除了图10所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据该字符串存储的实际功能,还可以包括其他硬件,对此不再赘述。
参见图11,为本申请一实施例提供的字符串存储装置的模块图,该实施例从服务器侧进行描述,所述装置包括:分解单元310、处理单元320、判断单元330、存储单元340和重复判断单元350。
其中,分解单元310,将待存储的字符串分解为单个的字符,得到字符集合;
处理单元320,将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符;
判断单元330,判断所述当前节点中是否存在所述当前字符;
存储单元340,在所述当前节点中不存在所述当前字符的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符;
重复判断单元350,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,输入到所述判断单元330,直至所述字符集合中的字符都判断完毕。
在一个可选的实现方式中:
所述重复判断单元350,还包括:
在所述当前节点中存在所述当前字符的情况下,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,输入到所述判断单元,直至所述字符集合中的字符都判断完毕。
在一个可选的实现方式中:
所述存储单元340,具体包括:
第一存储子单元,在所述当前节点中不存在所述当前字符,并且所述当前节点不为第一级节点的情况下,在所述当前节点的父节点后新增一个子节点,并在所述新增的子节点中写入所述当前字符,执行所述重复判断单元350;
或者,
第二存储子单元,在所述当前节点中不存在所述当前字符,并且所述当前节点为第一级节点的情况下,新增一个第一级节点,将所述当前字符写入该第一级节点中;
第三存储子单元,将所述新增的节点确定为当前节点,将所述当前字符后一个字符确定为当前字符;
第四存储子单元,在所述当前节点后新增一个节点,并将所述当前字符写入该新增的节点中,执行所述第三存储子单元,直至所述字符集合中的字符都存储完毕。
与前述字符串检索方法实施例相对应,本申请还提供了字符串检索装置的实施例。
本申请字符串检索装置的实施例可以分别应用在服务器。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图12所示,为本申请字符串检索装置所在设备的一种硬件结构图,除了图12所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据该字符串检索的实际功能,还可以包括其他硬件,对此不再赘述。
参见图13,为本申请一实施例提供的字符串检索装置的模块图,该实施例从服务器侧进行描述,所述装置包括:接收单元410、分解单元420、处理单元430、检索单元440和检索结果单元450。
其中,接收单元410,接收传入的字符串;
分解单元420,将所述字符串分解为单个的字符,得到字符集合;
处理单元430,将所述字符集合的第一个字符确定为当前字符,将预设的存储结构的第一级节点确定为当前节点;其中,所述存储结构由若干级节点构成,每个节点用于存储一个字符,且第n级节点用于存储字符串的第n个字符;
检索单元440,判断所述当前节点中是否存在所述当前字符;
检索结果单元450,在所述当前节点中不存在所述当前字符的情况下,输出所述字符串不存在的检索结果。
在一个可选的实现方式中:
所述装置还包括:
重复检索单元,在所述当前节点中存在所述当前字符的情况下,将所述当前字符的下一个字符确定为当前字符,将所述当前节点的下一级节点确定为当前节点,输入到所述检索单元440。
在一个可选的实现方式中:
所述检索结果单元450,具体包括:
第一检索结果子单元,在所述当前节点中不存在所述当前字符的情况下,在数据库中检索所述字符串是否存在;
第二检索结果子单元,在数据库中也没有检索到所述字符串的情况下,输出所述字符串不存在的检测结果。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。