当前位置: 首页 > 专利查询>浙江大学专利>正文

一种用于检索字符串的方法技术

技术编号:2846709 阅读:792 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种用于检索字符串的方法。相对于传统索引技术如Hash或Btree或AVL-树等,本发明专利技术以多叉树的存储方式来记录字符串的字符序列结构信息,并在检索方法中利用了这些信息,能够高效地实现对字符串检索,尤其适合在大规模字符串集合环境下字符串的精确快速查找和前缀、后缀等模糊查找。同时对多叉树结点的内存分配进行了分层管理,并对最后生成的多叉树进行了适度的压缩,有效的节省了内存资源,克服了传统检索字符串方法所存在的检索效率低、或者检索效率虽高但是过分消耗内存资源、不支持模糊查询等不足,是一种既高效又实用的字符串检索方法。

【技术实现步骤摘要】

本专利技术涉及大量字符串集合管理相关的
,特别是涉及。
技术介绍
今年来,随着计算机用户的持续增加,各种计算机应用不断涌现,而许多计算机应用都涉及到对一个非常大的字符串集合的有效管理问题。例如,从档案管理、文献目录查找、地理信息索引、搜索引擎到WEB上大量文本的处理都涉及到一个非常大的字符串集合。同时,随着IPv6的兴起,如何在巨量的IP地址中实现对IP的快速检索成为一个人们关心的问题;目前已有许多用于字符串管理的数据结构,其中二叉搜索树BST是最简单且最直观的一种。BST结构的性能主要取决于树的形态,与输入字符串集的排列有关。假设字符串集合的分布是稳定的,则BST结构是相当快的;如果字符串集合的分布不稳定,特别是有序的,BST的性能最差为(o(n));BST退化为一棵单枝树。因此BST特别不适合有序排列的输入字符串集合。此外BST有许多的变种,如AVL-树和红-黑树,它们与BST树的不同在于插入字符串的过程中重组树的结构,保持树的近似平衡,从而保证不会出现单枝树,BST树及其变种虽然占用空间少但速度慢,所以并不是最理想的数据结构。字符串处理中常用的另外一种数据结构是哈希表和B树。哈希表是一种直接计算记录存放地址的方法,它在关键码(字符串)与存储位置之间直接建立映像。但是,在某些要求字符串有序存储(如索引维护及前缀查找)的应用中,哈希表就价值就不是很大了。B树在要求快速检索字符串时也存在这个问题;如果能针对要访问数据的内部结构特点,定义一个通用的数据存储和访问方法,则可以提高存储效率,并降低数据访问的时间。
技术实现思路
本专利技术的目的在于提供一种用于高效检索字符串的方法。本专利技术解决其技术问题采用的技术方案如下1)以多叉树的存储方式来记录字符串的字符序列结构信息,同时对多叉树结点的内存分配进行了分层管理用多叉树的形式来存储字符串,树的第一层为根结点,接下来的每一层依次表示该字符串中的一个字符,每个树结点存储了当前字符,从根结点到该结点所形成的字符串的编号id和后继结点的指针,该编号id用于标识一个唯一的字符串,程序中默认从1开始,按序分配,或由用户指定;对中文字符串来说,多叉树的第一层为根结点,第二层则按照字符串第一个汉字的GB2312编码来标识,共有三千多个分支,分别表示三千多个汉字,最左边分支的GB2312编码最小,表示汉字“阿”,其他的汉字就利用它与“阿”的GB2312编码的差值来索引;第三层表示字符串中的第二个汉字,由于汉语词汇固定的组合和搭配形式,并不是任意两个汉字都可以组成一个词语,每个汉字后面可能出现的汉字是有限的,而不是汉字的全集;所以从第三层开始,如果每个汉字结点下一层可能出现的后续汉字的数目大于等于不同汉字数目的一半,就用后继汉字与“阿”的GB2312编码的差值来索引;否则,如果每个汉字结点下一层可能出现的后续汉字的数目小于不同汉字数目的一半,就只存储汉字结点下一层可能出现的后续汉字的信息;依此类推,这样就可以大大节省存储空间;对英文字符串来说,多叉树的第一层也为根结点,第二层表示字符串的第一个字母,共有26个分支,分别对应26个英文字母,由于英文字母的个数少,不会占用很大的存储空间,因此多叉树第二层以下的各层也采用同样的方式来依次表示字符串中的各个字母,即每一层都包括26个分支;2)将字符串插入到多叉树中a)对于中文字符串第一步,以字符串中的第一个汉字的GB2312编码与“阿”的GB2312编码的差值索引到多叉树第二层的分支结点,这个分支结点存储的是其下层结点,也就是字符串的第二个汉字的信息的指针;第二步,如果第一个汉字可能的后继汉字的数目大于等于不同汉字数目的一半,则后继汉字的GB2312编码与“阿”的GB2312编码的差值索引到第三层的分支结点;否则为第一个汉字结点预分配16个下层结点存储单元(这里为了避免每次添加字符串时都要重新分配,每次分配时将一次性预分配16个下层结点单元);如果已经为该分支结点分配了存储下层(第三层)结点的空间,则给第二个汉字分配其中的一个单元;如果上一次分配的16个单元已经用完,则重新再分配16个;第三层结点单元中存储了第二个汉字,和当前已添加的字符串的编号id号以及第三个汉字的信息的指针;第三步,同理,如果第二个汉字可能的后继汉字的数目大于等于不同汉字数目的一半,则后继汉字的GB2312编码与“阿”的GB2312编码的差值索引到第四层的分支结点;否则给第三层结点预分配16个下层结点存储单元,存储第三个汉字和当前已添加的字符串的编号id号以及第四个汉字的信息的指针;依此类推,依次为每一个结点分配其下层结点的存储空间,直到字符串的末尾,此时该字符串就添加到多叉树中了;b)对于英文字符串第一步,根据字符串中的第一个字母在字母表中的序号索引到多叉树第二层的分支结点,这个分支结点存储的是第三层结点,也就是字符串的第二个字母的信息的指针;第二步,同理根据字符串中第二个字母在字母表中的序号索引到多叉树第三层的分支结点;依此类推,直到字符串的末尾,此时该字符串就添加到多叉树中了;3)字符串集的压缩由于建立多叉树时,有些层可能存在多个分支,比如中文的多叉树的第二层就有三千多个分支,对一个字符串集而言有些分支可能并没有用到;而且分支较少的层每次都是为结点预分配16个下层结点存储单元,这样有些分配出去的空间可能并没有使用;因此先把多叉树结构写入外存,需要读入内存时,释放多叉树中这些空的不用的单元,只把有数据的单元按照原来的结构读到内存中,这样就大大实现了字符串集的压缩;4)在多叉树中精确检索字符串a)对于中文字符串第一步,根据字符串中的第一个汉字的GB2312编码与“阿”的GB2312编码的差值找到该汉字在多叉树中第二层的分支结点;第二步,沿着该分支往下,根据待检索的字符串的第二个汉字找到第三层的分支结点;再从第三层的分支结点出发,根据待检索字符串中第三个汉字找到第四层的分支结点;依此类推,直到该字符串的末尾,末尾所在的结点记录了该字符串的编号id,返回该编号id号则完成了字符串的精确检索;若多叉树的分支无法到达该字符串的末尾,则证明该字符串不在多叉树中;b)对于英文字符串第一步,根据字符串中的第一个字母在字母表中的序号找到该字母在多叉树中第二层的分支结点;第二步,沿着该分支往下,根据字符串中第二个字母在字母表中的序号找到该字母在多叉树中第三层的分支结点;依此类推,直到字符串的末尾,末尾所在的结点记录了该字符串的编号id,返回该编号id号则完成了字符串的精确检索;若多叉树的分支无法到达该字符串的末尾,则证明该字符串不在多叉树中;5)在多叉树中模糊检索字符串字符串的模糊检索是指给定字符串的前缀或后缀,在多叉树中检索出所有包含该前缀或后缀的字符串;对前缀字符串的检索,采用与精确检索相同的方式,从多叉树的根结点开始逐层找到该字符串前缀所在分支上的结点,直到前缀的末尾,找到从末尾结点开始的所有的下层分支,这些下层分支表示的是该前缀的后续字符串,该前缀字符串分别与这些下层分支表示的后续字符串组合即为模糊检索的结果;若多叉树的分支无法到达该前缀字符串的末尾,则检索失败;对后缀字符串的检索,则反方向从多叉树的底层结点开始,向上逐层找到与后缀字符串中的字符相对应的分支结点本文档来自技高网...

【技术保护点】
一种用于检索字符串的方法,其特征在于:1)以多叉树的存储方式来记录字符串的字符序列结构信息,同时对多叉树结点的内存分配进行了分层管理用多叉树的形式来存储字符串,树的第一层为根结点,接下来的每一层依次表示该字符串中的一个字符, 每个树结点存储了当前字符,从根结点到该结点所形成的字符串的编号id和后继结点的指针,该编号id用于标识一个唯一的字符串,程序中默认从1开始,按序分配,或由用户指定;对中文字符串来说,多叉树的第一层为根结点,第二层则按照字符串第一个汉字的GB2312编码来标识,共有三千多个分支,分别表示三千多个汉字,最左边分支的GB2312编码最小,表示汉字“阿”,其他的汉字就利用它与“阿”的GB2312编码的差值来索引;第三层表示字符串中的第二个汉字,由于汉语词汇固定的组合和搭配形式,并不是任意两个汉字都可以组成一个词语,每个汉字后面可能出现的汉字是有限的,而不是汉字的全集;所以从第三层开始,如果每个汉字结点下一层可能出现的后续汉字的数目大于等于不同汉字数目的一半,就用后继汉字与“阿”的GB2312编码的差值来索引;否则,如果每个汉字结点下一层可能出现的后续汉字的数目小于不同汉字数目的一半,就只存储汉字结点下一层可能出现的后续汉字的信息;依此类推,这样就可以大大节省存储空间;对英文字符串来说,多叉树的第一层也为根结点,第二层表示字符串的第一个字母,共有2 6个分支,分别对应26个英文字母,由于英文字母的个数少,不会占用很大的存储空间,因此多叉树第二层以下的各层也采用同样的方式来依次表示字符串中的各个字母,即每一层都包括26个分支;2)将字符串插入到多叉树中a)对于中文字符串: 第一步,以字符串中的第一个汉字的GB2312编码与“阿”的GB2312编码的差值索引到多叉树第二层的分支结点,这个分支结点存储的是其下层结点,也就是字符串的第二个汉字的信息的指针;第二步,如果第一个汉字可能的后继汉字的数目大 于等于不同汉字数目的一半,则后继汉字的GB2312编码与“阿”的GB2312编码的差值索引到第三层的分支结点;否则为第一个汉字结点预分配16个下层结点存储单元(这里为了避免每次添加字符串时都要重新分配,每次分配时将一次性预分配16个下层结点单元);如果已经为该分支结点分配了存储下层(第三层)结点的空间,则给第二个汉字分配其中的一个单元;如果上一次分配的16个单元已...

【技术特征摘要】
1.一种用于检索字符串的方法,其特征在于1)以多叉树的存储方式来记录字符串的字符序列结构信息,同时对多叉树结点的内存分配进行了分层管理用多叉树的形式来存储字符串,树的第一层为根结点,接下来的每一层依次表示该字符串中的一个字符,每个树结点存储了当前字符,从根结点到该结点所形成的字符串的编号id和后继结点的指针,该编号id用于标识一个唯一的字符串,程序中默认从1开始,按序分配,或由用户指定;对中文字符串来说,多叉树的第一层为根结点,第二层则按照字符串第一个汉字的GB2312编码来标识,共有三千多个分支,分别表示三千多个汉字,最左边分支的GB2312编码最小,表示汉字“阿”,其他的汉字就利用它与“阿”的GB2312编码的差值来索引;第三层表示字符串中的第二个汉字,由于汉语词汇固定的组合和搭配形式,并不是任意两个汉字都可以组成一个词语,每个汉字后面可能出现的汉字是有限的,而不是汉字的全集;所以从第三层开始,如果每个汉字结点下一层可能出现的后续汉字的数目大于等于不同汉字数目的一半,就用后继汉字与“阿”的GB2312编码的差值来索引;否则,如果每个汉字结点下一层可能出现的后续汉字的数目小于不同汉字数目的一半,就只存储汉字结点下一层可能出现的后续汉字的信息;依此类推,这样就可以大大节省存储空间;对英文字符串来说,多叉树的第一层也为根结点,第二层表示字符串的第一个字母,共有26个分支,分别对应26个英文字母,由于英文字母的个数少,不会占用很大的存储空间,因此多叉树第二层以下的各层也采用同样的方式来依次表示字符串中的各个字母,即每一层都包括26个分支;2)将字符串插入到多叉树中a)对于中文字符串第一步,以字符串中的第一个汉字的GB2312编码与“阿”的GB2312编码的差值索引到多叉树第二层的分支结点,这个分支结点存储的是其下层结点,也就是字符串的第二个汉字的信息的指针;第二步,如果第一个汉字可能的后继汉字的数目大于等于不同汉字数目的一半,则后继汉字的GB2312编码与“阿”的GB2312编码的差值索引到第三层的分支结点;否则为第一个汉字结点预分配16个下层结点存储单元(这里为了避免每次添加字符串时都要重新分配,每次分配时将一次性预分配16个下层结点单元);如果已经为该分支结点分配了存储下层(第三层)结点的空间,则给第二个汉字分配其中的一个单元;如果上一次分配的16个单元已经用完,则重新再分配16个;第三层结点单元中存储了第二个汉字,和当前已添加的字符串的编号id号以及第三个汉字的信息的指针;第三步,同理,如果第二个汉字可能的后继汉字的数目大于等于不同汉字数目的一半,则后继汉字的GB2312编码与“阿”的GB2312编码的差值索引到第四层的分支结点;否则给第三层结点预分配16个下层结点存储单元,存储第三个汉字和当前已添加的字符串的编号id号以及第四个汉字的信息的指针;依此类推,依次为每一个结点分配其下层结点的存储空间,直到字符串的末尾,此时该字符串就添加到多叉树中了;b)对于英文字符串第一步,根据字符串中的第一个字母在字母表中的序号索引到多叉树第二层的分支结点,这个分支结点存储的是第三层结...

【专利技术属性】
技术研发人员:陈纯卜佳俊刘康苗陈伟赵梦潘照明
申请(专利权)人:浙江大学
类型:发明
国别省市:86[中国|杭州]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1