一种对字符串排序和查找的方法 【技术领域】
本发明涉及字符处理领域,特别涉及一种对字符串排序和查找的方法。
背景技术
当前,在计算机上对字符串做包括排序、查找在内的处理操作在日常工作、学习或研究中都有广泛的需求。举一个简单的例子,在一个Excel文档中,用户可能需要对表格中的字符串做排序操作。在一个相对复杂的例子中,根据蛋白质数据库建立对应的肽序列数据库,同样需要对用于表示肽序列的字符串(通常为英文字母串)进行排序操作。此外,在建立各种语言的电子辞典以及在电话簿中查找人名等操作中,也都需要对字符串进行处理。
现有技术中,在计算机上对字符串进行处理通常以字符串本身作为处理对象。以字符串处理中的字符串排序为例,对字符串排序的一种方法是采用快速排序思想。根据这一思想,在排序过程中比较两个字符串的大小时,将两个字符串按位从高到低逐一进行比较,如对字符串“ABCDE”和“ABCEF”,由于前者的第四个字符“D”小于后者的第四个字符“E”,所以字符串“ABCDE”的顺序先于“ABCEF”。此外,这一方法中通常还认为一个字符串的子串在顺序上先于该字符串,即“ABCE”小于“ABCEF”。由于要对字符串中的字符按位逐一比较,因此字符串采用上述方法进行排序时,所要耗费的时间代价较高,特别是对字符串长度很长的情况。如果用代价计算公式对这一字符串排序方法进行表示的话,若字符串的平均长度是M,则比较两个字符串的时间复杂度就是O(M),而对所有的字符串做快速排序的时间复杂度就可近似地认为是O(M*n*log(n)),其中n是字符串个数。从上述代价计算公式看,当字符串个数n的取值很大,或字符串的平均长度很长时,为字符串排序所要花费的时间代价是相当可观的。
上文中以字符串处理中的字符串排序为例,对排序所要花费的时间代价做了初步的探讨,而字符串处理中的其他操作,如字符串查找,大多以字符串排序为前提,因此,字符串处理的其他操作也会有时间代价高的缺陷。对现有字符串排序方法的实现原理进行研究的话,可以发现,排序所要花费的时间较长的一个主要原因是对于两个比较对象(即两个字符串)无法通过一次比较就得到比较结果,对于高位字符相同的两个字符串通常需要做多次比较才能知道它们是否相同或相异。总之,在计算机上对字符串进行处理的现有方法不利于降低时间开销,为进一步提高字符串处理的效率造成了障碍。
【发明内容】
本发明的目的是克服现有的字符串处理方法中由于需要对字符串中的各个字符分别进行处理而带来的处理效率低、时间开销大的缺陷,从而提供一种基于歌德尔编码方法实现的字符串处理方法。
为了实现上述目的,本发明提供了一种对字符串进行排序的方法,包括:
步骤1)、为所要排序的所有字符串中的字符分类,为一个类别的字符赋予一个数值,不同类别的字符所赋予的数值互不相同;
步骤2)、结合所述步骤1)中为各个字符所赋予的值,采用哥德尔编码方法对所要排序的各个字符串分别进行编码,一个字符串得到一个用数字表示的哥德尔编码值;
步骤3)、对所要排序的所有字符串根据它们的哥德尔编码值做排序操作。
上述技术方案中,所述的步骤2)包括:
步骤2-1)、用一个素数表示字符串中的一个位置,不同地位置用不同的素数表示;
步骤2-2)、将所述字符串中一个位置上的字符在所述步骤1)中所被赋予的数值与表示该位置的素数的对数值做乘积,将该字符串中所有位置所能得到的乘积的相加结果作为所述的哥德尔编码值。
上述技术方案中,还包括一个预先计算步骤,在该步骤中预先计算并存储与字符串位置所对应的素数的对数值,在所述的步骤2-2)中,直接调用所述的素数的对数值。
上述技术方案中,在所述的预先计算步骤中,还包括预先计算并存储各个字符在所述步骤1)中所被赋予的数值与各个素数的对数值的乘积,在所述的步骤2-2)中,直接调用字符被赋予的数值与素数的对数值的乘积。
上述技术方案中,所述的哥德尔编码值用64位的双精度浮点数表示。
本发明还提供了一种对字符串进行查找的方法,包括:
步骤1)、采用所述的对字符串进行排序的方法对被查找的数据源中的所有字符串进行排序操作;
步骤2)、对待查找的字符串计算它的哥德尔编码值;
步骤3)、利用待查找的字符串的哥德尔编码值从步骤1)的排序操作的结果中查找对应的字符串。
本发明又提供了一种肽序列词典的创建方法,包括:
步骤1)、对蛋白质数据库中的蛋白质序列做模拟酶切,得到肽序列;
步骤2)、对步骤1)所得到的肽序列按照质量进行排序,对于质量相同的肽序列,采用所述的对字符串进行排序的方法对用于表示肽序列的英文字母做进一步排序;
步骤3)、根据排序结果去除冗余肽序列,然后将去冗余后的肽序列写入肽序列词典。
上述技术方案中,在采用所述的对字符串进行排序的方法对用于表示肽序列的英文字母做进一步排序的过程中,计算出所述肽序列的哥德尔编码值后,为所述肽序列的数据结构添加用于表示哥德尔编码值的域,利用该域中的哥德尔编码为所述肽序列做排序。
本发明还提供了一种对字符串进行排序的装置,包括字符串赋值模块、哥德尔编码生成模块以及排序模块;其中,
所述的字符串赋值模块用于为所要排序的所有字符串中的字符分类,为一个类别的字符赋予一个数值,不同类别的字符所赋予的数值互不相同;
所述的哥德尔编码生成模块结合所述字符串赋值模块中为各个字符所赋予的值,采用哥德尔编码方法对所要排序的各个字符串分别进行编码,一个字符串得到一个用数字表示的哥德尔编码值;
所述的排序模块对所要排序的所有字符串比较它们的哥德尔编码值,根据所述哥德尔编码值间的大小,对所述字符串做排序操作。
本发明的优点在于:
1、在本发明的字符串排序方法中,采用哥德尔编码方法将字符串映射成用浮点数表示的哥德尔编码值,然后通过对所述的哥德尔编码值的排序实现对字符串的排序,显著提高了排序效率。
2、在本发明的字符串查找方法中,将所要查找的字符串以及被查找的字符串分别映射成用浮点数表示的哥德尔编码值,从而利用对哥德尔编码值的查找来实现对字符串的查找,在查找效率上有很大的提高。
3、在本发明的肽序列词典创建方法中,将用于表示肽序列的英文字母映射成用浮点数表示的哥德尔编码值,将具有相同质量的肽序列通过所述的哥德尔编码值进行排序,从而创建肽序列词典,提高了肽序列词典的创建效率。
4、在本发明中,还通过对素数对数值以及字符数值的预先计算,使得在计算哥德尔编码的过程中,可以直接调用计算结果,加快了在计算机上计算哥德尔编码的效率。
【附图说明】
图1为现有的建立肽序列词典的方法流程图;
图2为本发明的字符串排序方法的流程图。
【具体实施方式】
下面结合附图和具体实施方式对本发明做进一步说明。
在本发明的一个实施例中,以为一个蛋白质数据库建立肽序列词典为例,对本发明方法的具体实现及应用加以说明。
在一个蛋白质数据库中存储有大量的关于蛋白质序列的数据,蛋白质序列由多个氨基酸组成,其子序列称为肽序列。由于在现有技术中通常用英文字母表示氨基酸,因此由氨基酸组成的肽序列通常用一个英文字母串表示。例如,“AAIK”、“GK”等。
由蛋白质数据库建立肽序列词典的过程可参考图1,它主要包括:模拟生物学中的酶切过程将蛋白质数据库中的蛋白质序列切分成肽序列,然后在所得到的肽序列结果中去除冗余肽序列。由于肽序列按照质量存放可以加速蛋白质搜索引擎读取肽序列,因此,去除冗余序列的一种方式是将所有肽序列按照质量进行排序,对于质量相同的肽序列,则按照用于表示肽序列的英文字母串的顺序做进一步的排序。完成对所有肽序列的排序后,从前到后扫描肽序列,将第一条肽序列写入肽序列词典,之后每条肽序列与前一条肽序列比较,质量不同则写入肽序列词典,质量相同则比较序列,序列不同则写入词典,否则不写入,直到扫描到最后一条肽序列,从而建立了对应的肽序列词典。
从上面的描述中可以看到,在建立肽序列词典的过程中,当肽序列质量相同时,需要对用于表示肽序列的英文字母串按照字母的顺序进行排序。由于蛋白质数据库中所具有的蛋白质数目通常数以万计,而由蛋白质所得到的肽序列数目更可达百万、千万乃至上百亿、上千亿,因此,对质量相同的肽序列按照英文字母的顺序进行排序需要花费大量的时间。例如,在常用的swiss-prot数据库中大约包含有3千万条肽序列,采用基于现有的字符串排序方式构建词典的蛋白质数据库索引工具集IndexToolKit2.0处理这一数据库需要约50分钟,显然在时间上的花费较大。而在实际应用中,还存在比swiss-prot数据库数据量更大的其它数据库,如NCBInr数据库约含3亿条肽序列,对于这些数据库,如果仍然采用现有的字符串排序方式,则所花费的时间将更加令人难以承受。
为了有效地降低对字符串排序的时间代价,在本发明中采用了哥德尔编码方法实现字符串到数字的转换。在现有技术中,哥德尔编码方法的本质是把一个自然数(含零)序列变换成一个自然数,例如,一个自然数序列abc所对应的哥德尔编码是一个自然数P1a×P2b×P3c,其中的P1、P2和P3是不同的素数,即在哥德尔编码中将一个数字在序列中的位置用不同的素数予以区别,例如,用第一个素数2标记序列中的第一个位置,用第二个素数3标记序列中的第二个位置;自然数序列中某一位置上的数字由表示对应位置的素数的幂来表示。如一个自然数序列123表示成哥德尔编码后就可以得到21×32×53。
在本实施例中,由于肽序列都用英文字母表示,因此,利用哥德尔编码的思想,同样可以将用于表示肽序列的英文字母串转换成数字。参考图2,并以一个用于表示肽序列的英文字母串ACCDDD为例进行说明。根据前述的哥德尔编码思想,该英文字母串可以表示成2A×3C×5C×7D×11D×13D,然后对其中所涉及的英文字母进行赋值,原则上只要保证相同的字母有相同的值,不同的字母有不同的值即可,在本实施例中,则可以根据各个英文字母在字母表中的位置为它们赋予对应的值。例如,A用0表示,C用2表示,D用3表示。由于转换后的哥德尔编码的值太大,在计算机上实现时不仅一个编码需要采用较多的位数,而且也容易造成编码值的越位,因此,还要对所得到的编码值取对数,即将前述的字母串ACCDDD表示为以下公式:
A×log2+C×log3+C×log5+D×log7+D×log11+D×log13 (1)
通过上述的操作,可以将一个字符串压缩成64位的双精度浮点数(double)。
在将上述的哥德尔编码思想应用到肽序列词典的创建过程中,当由蛋白质数据库中的蛋白质序列得到肽序列,并对肽序列去冗余时,可根据上述的哥德尔编码方法对用于表示肽序列的英文字母串进行转换。在利用哥德尔编码方法进行转换前,在计算机上所存储的关于肽序列的数据结构如下面的表1所示,包括有肽序列质量(size_t,整数类型)和肽序列(string,字符串型)两个域。在关于肽序列的域中,用前述的英文字母串对肽序列进行了表示,如果要对肽序列按照现有技术中的快速排序方法进行排序的话,就需要用肽序列域中的内容实现排序操作。
表1
肽序列质量 肽序列
在利用哥德尔编码方法进行转换后,在计算机上所存储的关于肽序列的数据结构有了相应的改变,如表2所示,它除了有肽序列质量(size_t)和肽序列(string)两个域外,还包括有肽序列对应哥德尔编码值(double)。肽序列的数据结构有了肽序列对应哥德尔编码值这一域后,在对肽序列排序时,就可以用该域中的内容进行排序操作。
表2
肽序列质量 肽序列 肽序列对应哥德尔编码值
在现有技术中,对肽序列按照结构中的质量进行排序,质量相同时按照肽序列的字典序排序,而在哥德尔编码后,则按照结构中的质量进行排序,质量相同时按照哥德尔编码值排序。由于在哥德尔编码后,排序的对象由一串英文字母变成了一个具体的数字,由对英文字母串中的各个字母的多次分别比对转变成了对一个数字的一次比较,在排序效率上显然可以得到很大的提高。
本发明方法的应用前提是哥德尔编码值与肽序列一一对应,在本发明的实验中,对1亿左右的肽序列进行验证,哥德尔编码值与肽序列是一一对应的。从理论上分析,由于哥德尔编码值占64位(bit),当不重复的肽序列(字符串)数量超过264时,哥德尔编码值会产生冲突,但是该数量的肽序列(字符串)在实际问题中极难出现。
在上述的实施例中,介绍了利用哥德尔编码实现肽序列排序,进而建立肽序列词典的一种实现方式。在又一个实施例中,还可以对利用哥德尔编码实现用于表示肽序列的字母串到数字的转换过程做进一步的改进。从前面的公式(1)可以看出,在将字母串转换为哥德尔编码的过程中,包含有对数计算、乘法运算以及加法运算。在计算机上实现时,对数计算所要消耗的时间要高于乘法运算,而乘法运算较加法运算而言,又会花费更多的时间。为了进一步提高本发明在计算机上实现时的效率,可以预先计算出前N个素数的对数值,其中的N大于最长字母串的长度,这样在计算哥德尔编码时可以直接采用预先计算出来的对数值,节省计算对数的时间。此外,如果构成字母串的字母表已知,则还可以将字母编码与对数值的乘积也预先进行计算,然后将计算结果存储在一个二维数组中,在计算哥德尔编码时就可以直接从二维数组中调取相关的数据,再进行计算。例如,若构成字母串的字母表用∑表示,假设∑的长度是M,则可以预先计算一个二维数组Value[N][M],其中每个元素代表素数的对数值和字母编码的乘积,例如Value[i][j]表示第i个素数的对数值和∑中第j个字母的乘积。前述的公式(1)也就可以转换为如下的计算公式:
Value[0][0]+Value[1][2]+Value[2][2]+Value[3][3]+Value[4][3]+Value[5][3] (2)
与公式(1)相比,在这一公式中只需要进行浮点数的加法计算,避免了对数运算和浮点数的乘法运算,可以进一步提高运算效率。
运用本发明的方法建立肽序列词典时,可以大大提高运算效率。仍以前文中所提到的swiss-prot数据库为例,IndexToolKit2.1采用本发明的方法为该数据库建立肽序列词典只需要大约6分钟,与IndexToolKit2.0所需要的50分钟相比,显然有了很大的提高。即使是NCBInr数据库,也只需要大约3小时。
在上述实施例中,以肽序列词典的建立过程为例,对本发明方法的实现与应用做了具体的说明。在这一说明过程中,实现了英文字母串的哥德尔编码,从而完成了英文字母串的排序。本领域的普通技术人员应当了解,本发明的方法并不局限于本实施例中所涉及的英文字母,对于其他类型的字符,如罗马字母、希腊字母甚至中文字符都可以用类似的方法进行处理,以提高对这些字符的处理效率,只要保证对字符的编码定义在一次完整的处理过程中前后统一即可。
本发明的方法除了实现字符串的排序外,还可以进一步应用在对字符串的其他处理中,例如在一个查找电话簿的问题中,将电话簿中用字符串表示的人名按照哥德尔编码值排序,并记录相关的哥德尔编码值信息与字符串信息,然后将输入的待查找的人名的字符串也转换成哥德尔编码值,将这一编码值与电话簿中已有的值进行二分查找,找到相同的哥德尔编码值时即找到所要查找的人名。此外,在日常生活中有广泛应用的数据库,同样可以用本发明的方法实现对数据的加速查找。
以本发明方法的构思为基础,本发明还提供一种对字符串进行排序的装置,该装置中包括有字符串赋值模块、哥德尔编码生成模块以及排序模块。其中,
所述的字符串赋值模块用于为所要排序的所有字符串中的字符分类,为一个类别的字符赋予一个数值,不同类别的字符所赋予的数值互不相同。
所述的哥德尔编码生成模块结合所述字符串赋值模块中为各个字符所赋予的值,采用哥德尔编码方法对所要排序的各个字符串分别进行编码,一个字符串得到一个用数字表示的哥德尔编码值。
所述的排序模块对所要排序的所有字符串比较它们的哥德尔编码值,根据所述哥德尔编码值间的大小,对所述字符串做排序操作。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。