数据访问方法和装置转让专利

申请号 : CN201611088064.7

文献号 : CN106815282B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈佐伟

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种数据访问方法和装置。其中,该方法包括:获取数据访问请求,其中,数据访问请求中携带有待访问的第一字符串的标识;根据第一字符串的标识获取第一字符串中的后缀字符,及第一字符串的前缀字符指示信息,其中,前缀字符指示信息用于指示第一字符串中的前缀字符,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,第二字符串位于第一字符串之前,且与第一字符串相邻;根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符;将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串,并返回第一字符串。本发明解决了数据访问的效率降低的技术问题。

权利要求 :

1.一种数据访问方法,其特征在于,包括:

获取数据访问请求,其中,所述数据访问请求中携带有待访问的第一字符串的标识;

根据所述第一字符串的标识获取所述第一字符串中的后缀字符,及所述第一字符串的前缀字符指示信息,其中,所述前缀字符指示信息用于指示所述第一字符串中的前缀字符,所述前缀字符为从所述第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,所述第二字符串位于所述第一字符串之前,且与所述第一字符串相邻,所述后缀字符根据所述第一字符串的标识从预先存储在存储区的数据结构中获得;

根据所述第一字符串的前缀字符指示信息获取所述第一字符串的所述前缀字符,其中,所述第一字符串的前缀字符被分别压缩在位于所述第一字符串之前的各个字符串中;

将所述第一字符串的所述前缀字符及所述第一字符串的所述后缀字符合成得到所述第一字符串,并返回所述第一字符串。

2.根据权利要求1所述的方法,其特征在于,根据所述第一字符串的标识获取所述第一字符串的所述前缀字符指示信息包括:在用于存储字符串的结构信息的元信息块中,获取与所述第一字符串的标识对应的所述第一字符串的前缀字符指示信息,其中,所述第一字符串的前缀字符指示信息中包括一个或多个前缀指针,每一个所述前缀指针分别用于指示所述第一字符串的所述前缀字符中的部分字符所在的字符串。

3.根据权利要求2所述的方法,其特征在于,所述获取与所述第一字符串的标识对应的所述第一字符串的前缀字符指示信息包括:根据所述第一字符串的标识获取所述第一字符串的前缀字符指示信息中的第一个前缀指针;

重复执行以下步骤,直至获取所述第一字符串的前缀字符指示信息中的全部前缀指针,其中,所述第一字符串为初始的当前字符串,所述第一字符串的前缀字符指示信息中的第一个前缀指针为初始的当前前缀指针:获取所述当前前缀指针所指示的位于所述当前字符串之前的目标字符串的标识;

根据所述目标字符串的标识获取所述目标字符串的前缀字符指示信息中的第一个前缀指针,作为所述第一字符串的前缀字符指示信息中的下一个前缀指针;

将所述目标字符串作为下一个所述当前字符串,将所述目标字符串的前缀字符指示信息中的第一个前缀指针作为下一个所述当前前缀指针。

4.根据权利要求2所述的方法,其特征在于,所述根据所述第一字符串的前缀字符指示信息获取所述第一字符串的所述前缀字符包括:依次获取所述第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串在所述元信息块中对应存储的后缀字符;

从所述各个前缀指针所指示的字符串在所述元信息块中对应存储的后缀字符中分别获取所述第一字符串的前缀字符中的部分字符,以得到所述第一字符串的所述前缀字符。

5.根据权利要求4所述的方法,其特征在于,所述从所述各个前缀指针所指示的字符串在所述元信息块中对应存储的后缀字符中分别获取所述第一字符串的前缀字符中的部分字符包括:按照所述第一字符串的前缀字符指示信息中包括的各个前缀指针的指示顺序,重复执行以下步骤,其中,所述第一字符串的前缀字符指示信息中的第一个前缀指针作为初始的当前指针,所述第一字符串的前缀长度作为初始的当前未获取前缀字符的字符长度:获取所述当前指针所指示的字符串的前缀长度;

获取所述当前未获取前缀字符的字符长度与所述当前指针所指示的字符串的前缀长度二者之间的第一差值;

从所述当前指针所指示的字符串在所述元信息块中对应存储的后缀字符中依序获取所述第一差值所指示数量的字符,作为所述第一字符串的前缀字符中的部分字符;

将所述各个前缀指针中位于所述当前指针之后的下一个指针作为所述当前指针,并从所述当前未获取前缀字符的字符长度中减去所述第一差值,得到下一个所述当前未获取前缀字符的字符长度。

6.根据权利要求2所述的方法,其特征在于,所述将所述第一字符串的所述前缀字符及所述第一字符串的所述后缀字符合成得到所述第一字符串包括:获取所述第一字符串的字符串总长度;

根据所述字符串总长度为所述第一字符串分配存储地址,并获取用于存储所要返回的所述第一字符串的首地址;

重复执行以下步骤,直至所述第一字符串中当前未获取字符的字符长度小于等于0,其中,所述第一字符串的标识作为初始的当前标识,所述第一字符串的所述字符串总长度作为初始的所述当前未获取字符的字符长度:获取所述当前未获取字符的字符长度与所述当前标识所标识的字符串的前缀长度之间的第二差值,作为当前待合成的字符长度;

从所述当前标识所标识的字符串在所述元信息块中对应存储的后缀字符中依序获取所述当前待合成的字符长度所指示的数量的字符,作为待合成字符;

获取所述当前未获取字符的字符长度与所述当前待合成的字符长度之间的第三差值;

在所述首地址上叠加所述第三差值,得到所述待合成字符的存储地址;

将所述待合成字符存储到所述存储地址中;

从所述当前未获取字符的字符长度中减去所述当前待合成的字符长度,得到下一个所述当前未获取字符的字符长度;

在下一个所述当前未获取字符的字符长度大于0时,获取下一个所述当前标识,其中,下一个所述当前标识依次从所述第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串的标识中获取。

7.根据权利要求1所述的方法,其特征在于,在所述获取数据访问请求之前,还包括:配置用于存储所述第一字符串的结构信息的元信息块,其中,所述元信息块中包括:所述第一字符串的前缀长度、所述第一字符串的后缀存储位置、所述第一字符串的前缀字符指示信息及所述第一字符串的后缀字符。

8.根据权利要求7所述的方法,其特征在于,所述配置用于存储所述第一字符串的结构信息的元信息块包括:获取所述第一字符串的前缀长度;

重复执行以下步骤,直至当前标识所指示的字符串的前缀长度小于所述第一字符串的前缀长度,其中,所述第一字符串的标识作为初始的当前标识:判断所述当前标识所指示的字符串的前缀长度是否大于等于所述第一字符串的前缀长度;在所述当前标识所指示的字符串的前缀长度大于等于所述第一字符串的前缀长度时,获取下一个所述当前标识,其中,下一个所述当前标识按照在所述元信息块所存储的字符串的存储顺序依次向前获取;

在所述当前标识所指示的字符串的前缀长度小于所述第一字符串的前缀长度时,获取所述第一字符串的标识与所述当前标识之间的第四差值作为所述第一字符串的前缀字符指示信息中的第一个前缀指针,其中,所述前缀指针用于指示所述第一字符串的所述前缀字符中的部分字符所在的字符串;

将所述第一个前缀指针存储在所述元信息块中与所述第一字符串匹配的前缀字符指示信息中。

9.一种数据访问装置,其特征在于,包括:

第一获取单元,用于获取数据访问请求,其中,所述数据访问请求中携带有待访问的第一字符串的标识;

第二获取单元,用于根据所述第一字符串的标识获取所述第一字符串中的后缀字符,及所述第一字符串的前缀字符指示信息,其中,所述前缀字符指示信息用于指示所述第一字符串中的前缀字符,所述前缀字符为从所述第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,所述第二字符串位于所述第一字符串之前,且与所述第一字符串相邻,所述后缀字符根据所述第一字符串的标识从预先存储在存储区的数据结构中获得;

第三获取单元,用于根据所述第一字符串的前缀字符指示信息获取所述第一字符串的所述前缀字符,其中,所述第一字符串的前缀字符被分别压缩在位于所述第一字符串之前的各个字符串中;

合成单元,用于将所述第一字符串的所述前缀字符及所述第一字符串的所述后缀字符合成得到所述第一字符串,并返回所述第一字符串。

10.根据权利要求9所述的装置,其特征在于,所述第二获取单元包括:

第一获取模块,用于在用于存储字符串的结构信息的元信息块中,获取与所述第一字符串的标识对应的所述第一字符串的前缀字符指示信息,其中,所述第一字符串的前缀字符指示信息中包括一个或多个前缀指针,每一个所述前缀指针分别用于指示所述第一字符串的所述前缀字符中的部分字符所在的字符串。

11.根据权利要求10所述的装置,其特征在于,所述第一获取模块包括:第一获取子模块,用于根据所述第一字符串的标识获取所述第一字符串的前缀字符指示信息中的第一个前缀指针;

第一处理子模块,用于重复执行以下步骤,直至获取所述第一字符串的前缀字符指示信息中的全部前缀指针,其中,所述第一字符串为初始的当前字符串,所述第一字符串的前缀字符指示信息中的第一个前缀指针为初始的当前前缀指针:获取所述当前前缀指针所指示的位于所述当前字符串之前的目标字符串的标识;根据所述目标字符串的标识获取所述目标字符串的前缀字符指示信息中的第一个前缀指针,作为所述第一字符串的前缀字符指示信息中的下一个前缀指针;将所述目标字符串作为下一个所述当前字符串,将所述目标字符串的前缀字符指示信息中的第一个前缀指针作为下一个所述当前前缀指针。

12.根据权利要求10所述的装置,其特征在于,所述第三获取单元包括:第二获取模块,用于依次获取所述第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串在所述元信息块中对应存储的后缀字符;

第三获取模块,用于从所述各个前缀指针所指示的字符串在所述元信息块中对应存储的后缀字符中分别获取所述第一字符串的前缀字符中的部分字符,以得到所述第一字符串的所述前缀字符。

13.根据权利要求12所述的装置,其特征在于,所述第三获取模块包括:第二处理子模块,用于按照所述第一字符串的前缀字符指示信息中包括的各个前缀指针的指示顺序,重复执行以下步骤,其中,所述第一字符串的前缀字符指示信息中的第一个前缀指针作为初始的当前指针,所述第一字符串的前缀长度作为初始的当前未获取前缀字符的字符长度:获取所述当前指针所指示的字符串的前缀长度;

获取所述当前未获取前缀字符的字符长度与所述当前指针所指示的字符串的前缀长度二者之间的第一差值;

从所述当前指针所指示的字符串在所述元信息块中对应存储的后缀字符中依序获取所述第一差值所指示数量的字符,作为所述第一字符串的前缀字符中的部分字符;

将所述各个前缀指针中位于所述当前指针之后的下一个指针作为所述当前指针,并从所述当前未获取前缀字符的字符长度中减去所述第一差值,得到下一个所述当前未获取前缀字符的字符长度。

14.根据权利要求10所述的装置,其特征在于,所述合成单元包括:

第四获取模块,用于获取所述第一字符串的字符串总长度;

分配模块,用于根据所述字符串总长度为所述第一字符串分配存储地址,并获取用于存储所要返回的所述第一字符串的首地址;

第一处理模块,用于重复执行以下步骤,直至所述第一字符串中当前未获取字符的字符长度小于等于0,其中,所述第一字符串的标识作为初始的当前标识,所述第一字符串的所述字符串总长度作为初始的所述当前未获取字符的字符长度:获取所述当前未获取字符的字符长度与所述当前标识所标识的字符串的前缀长度之间的第二差值,作为当前待合成的字符长度;

从所述当前标识所标识的字符串在所述元信息块中对应存储的后缀字符中依序获取所述当前待合成的字符长度所指示的数量的字符,作为待合成字符;

获取所述当前未获取字符的字符长度与所述当前待合成的字符长度之间的第三差值;

在所述首地址上叠加所述第三差值,得到所述待合成字符的存储地址;

将所述待合成字符存储到所述存储地址中;

从所述当前未获取字符的字符长度中减去所述当前待合成的字符长度,得到下一个所述当前未获取字符的字符长度;

在下一个所述当前未获取字符的字符长度大于0时,获取下一个所述当前标识,其中,下一个所述当前标识依次从所述第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串的标识中获取。

15.根据权利要求9所述的装置,其特征在于,还包括:

配置单元,用于在所述获取数据访问请求之前,配置用于存储所述第一字符串的结构信息的元信息块,其中,所述元信息块中包括:所述第一字符串的前缀长度、所述第一字符串的后缀存储位置、所述第一字符串的前缀字符指示信息及所述第一字符串的后缀字符。

16.根据权利要求15所述的装置,其特征在于,所述配置单元包括:

第五获取模块,用于获取所述第一字符串的前缀长度;

第二处理模块,用于重复执行以下步骤,直至当前标识所指示的字符串的前缀长度小于所述第一字符串的前缀长度,其中,所述第一字符串的标识作为初始的当前标识:判断所述当前标识所指示的字符串的前缀长度是否大于等于所述第一字符串的前缀长度;在所述当前标识所指示的字符串的前缀长度大于等于所述第一字符串的前缀长度时,获取下一个所述当前标识,其中,下一个所述当前标识按照在所述元信息块所存储的字符串的存储顺序依次向前获取;

在所述当前标识所指示的字符串的前缀长度小于所述第一字符串的前缀长度时,获取所述第一字符串的标识与所述当前标识之间的第四差值作为所述第一字符串的前缀字符指示信息中的第一个前缀指针,其中,所述前缀指针用于指示所述第一字符串的所述前缀字符中的部分字符所在的字符串;

将所述第一个前缀指针存储在所述元信息块中与所述第一字符串匹配的前缀字符指示信息中。

17.一种计算机可读的存储介质,所述计算机可读的存储介质包括存储的程序,其中,所述程序运行时执行上述权利要求1至8任一项中所述的方法。

说明书 :

数据访问方法和装置

技术领域

[0001] 本发明涉及计算机领域,具体而言,涉及一种数据访问方法和装置。

背景技术

[0002] 在现有的数据访问过程中,待访问的数据常用的存储结构包括:1)树形压缩结构,2)线性压缩结构。也就是说,通过将部分数据压缩存储,来达到节省存储空间的目的。具体的,结合以下给定的有序的字符串集合来说明上述存储结构:
[0003] {“aa”,“abc”,“abcd”,“abd”,“abe”}
[0004] 1)树形压缩结构,主要用于二分查找。首先设置一个根节点(如图1所示最顶层的节点)。其中,根节点中将记录与其关联的子节点的位置信息,通过这个位置信息可以读取到子节点中的数据。这就使得在访问树形压缩结构中的数据时,需要从根节点开始访问,沿着节点的分叉访问与根节点对应的子节点,对一层层的数据进行逐层获取,直到目标节点。即,要进行数据访问时,就要对树形压缩结构进行有序地遍历访问,直到到达第N个叶节点,其中,N为输入的标识。
[0005] 2)线性压缩结构,在这种结构中,将集合中的字符串有序依次存储,但是相同的前缀只保存一次,对于每个字符串只保存与前一个字符串的非共同前缀部分的内容。从而达到节省存储空间的目的。
[0006] 对于上述两种存储结构,均需对原始字符串进行前缀压缩,多个字符串相同的前缀只存储一份,而每个字符串不同的后缀都可以直接通过字符串的编号获取到。也就是说,要得到某个字符串的完整内容,就必须向前顺序扫描,直到获取该字符串的全部前缀内容。例如,假设字典中有n个字符串,都有相同的前缀“a”,那么这个前缀“a”只会保存在第一个字符串中。要得到第n个字符串的完整内容,就必须向前依次扫描每个字符串,直到第一个字符串。在n的数值较大时,若仍然通过上述扫描方式获取字符串的全部前缀内容,以得到完整的字符串,将大大延长获取所访问的数据的时长,从而导致数据访问的效率降低的问题。
[0007] 针对上述的问题,目前尚未提出有效的解决方案。

发明内容

[0008] 本发明实施例提供了一种数据访问方法和装置,以至少解决数据访问的效率降低的技术问题。
[0009] 根据本发明实施例的一个方面,提供了一种数据访问方法,包括:获取数据访问请求,其中,上述数据访问请求中携带有待访问的第一字符串的标识;根据上述第一字符串的标识获取上述第一字符串中的后缀字符,及上述第一字符串的前缀字符指示信息,其中,上述前缀字符指示信息用于指示上述第一字符串中的前缀字符,上述前缀字符为从上述第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,上述第二字符串位于上述第一字符串之前,且与上述第一字符串相邻;根据上述第一字符串的前缀字符指示信息获取上述第一字符串的上述前缀字符;将上述第一字符串的上述前缀字符及上述第一字符串的上述后缀字符合成得到上述第一字符串,并返回上述第一字符串。
[0010] 根据本发明实施例的另一方面,还提供了一种数据访问装置,包括:第一获取单元,用于获取数据访问请求,其中,上述数据访问请求中携带有待访问的第一字符串的标识;第二获取单元,用于根据上述第一字符串的标识获取上述第一字符串中的后缀字符,及上述第一字符串的前缀字符指示信息,其中,上述前缀字符指示信息用于指示上述第一字符串中的前缀字符,上述前缀字符为从上述第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,上述第二字符串位于上述第一字符串之前,且与上述第一字符串相邻;第三获取单元,用于根据上述第一字符串的前缀字符指示信息获取上述第一字符串的上述前缀字符;合成单元,用于将上述第一字符串的上述前缀字符及上述第一字符串的上述后缀字符合成得到上述第一字符串,并返回上述第一字符串。
[0011] 在本发明实施例中,在获取到携带有待访问的第一字符串的标识的数据访问请求后,通过根据上述第一字符串的标识获取到第一字符串的前缀字符指示信息,以利用该前缀字符指示信息直接获取到第一字符串中的前缀字符,而无需再对位于第一字符串之前的字符串进行依次逐个扫描,以分别获取各个字符串中分别压缩的第一字符串中的部分前缀字符,从而达到快速准确获取第一字符串中的前缀字符的目的,并在与第一字符串中的后缀字符合成后,得到所要访问的第一字符串,实现缩短数据访问的等待时长,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率,进而解决了数据访问的效率降低的技术问题。

附图说明

[0012] 此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
[0013] 图1是根据现有技术的一种数据访问结构的示意图;
[0014] 图2是根据本发明实施例的一种可选的数据访问方法的应用环境示意图;
[0015] 图3是根据本发明实施例的一种可选的数据访问方法的流程图;
[0016] 图4是根据本发明实施例的一种可选的数据访问结构的示意图;
[0017] 图5是根据本发明实施例的一种可选的数据访问装置的示意图;
[0018] 图6是根据本发明实施例的一种可选的数据访问设备的示意图。

具体实施方式

[0019] 为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
[0020] 需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0021] 实施例1
[0022] 在本发明实施例中,提供了一种上述数据访问方法的实施例。作为一种可选的实施方式,该数据访问方法可以但不限于应用于如图2所示的应用环境中,即应用于终端与服务器之间的交互场景,终端202通过网络204向服务器206发送数据访问请求,其中,数据访问请求中携带有待访问的第一字符串的标识,服务器206根据上述第一字符串的标识获取第一字符串中的后缀字符,及第一字符串的前缀字符指示信息,其中,前缀字符指示信息用于指示第一字符串中的前缀字符,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,第二字符串位于第一字符串之前,且与第一字符串相邻;并根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符;然后,将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串,并向终端202返回第一字符串。
[0023] 作为另一种可选的实施方式,上述数据访问方法也可以但不限于应用于服务器与服务器之间的交互场景,还可以但不限于应用于独立的终端设备内部数据访问的场景中,其中,后两种应用场景未在图中示出。上述应用场景仅是一种示例,本实施例中对此不做任何限定。
[0024] 在本实施例中,在获取到数据访问请求后,根据数据访问请求中所携带的待访问的第一字符串的标识获取第一字符串中的后缀字符,及用于指示第一字符串中的前缀字符的前缀字符指示信息,并根据该前缀字符指示信息获取第一字符串的前缀字符,从而实现将获取到的前缀字符和后缀字符合成得到第一字符串,而无需再通过相关技术中提供的方式依次逐个扫描当前字符串之前的每个字符串,才能获取到分别压缩到不同字符串中的当前字符串的前缀字符,从而克服了相关技术中数据访问时间较长,访问效率较低的问题,进而达到节省扫描时间,提高数据访问的效率的效果。
[0025] 可选地,在本实施例中,上述终端可以包括但不限于以下至少之一:手机、平板电脑、笔记本电脑、PC机及其他应用数据访问过程的硬件设备。可选地,在本实施例中,上述网络可以包括但不限于以下至少之一:广域网、城域网、局域网。上述仅是一种示例,本实施例中对此不做任何限定。
[0026] 根据本发明实施例,提供了一种数据访问方法,如图3所示,该方法包括:
[0027] S302,获取数据访问请求,其中,数据访问请求中携带有待访问的第一字符串的标识;
[0028] S304,根据第一字符串的标识获取第一字符串中的后缀字符,及第一字符串的前缀字符指示信息,其中,前缀字符指示信息用于指示第一字符串中的前缀字符,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,第二字符串位于第一字符串之前,且与第一字符串相邻;
[0029] S306,根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符;
[0030] S308,将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串,并返回第一字符串。
[0031] 可选地,在本实施例中,可以但不限于以将上述数据访问方法应用于图2所示的应用环境中为例进行说明,也就是说,服务器通过网络获取终端发送的数据访问请求,其中,该数据访问请求中携带有待访问的第一字符串的标识,服务器根据上述第一字符串的标识将从预先存储在存储区的数据结构中获取到第一字符串中的后缀字符,及用于指示第一字符串的前缀字符指示信息,并利用该前缀字符指示信息直接获取第一字符串中的前缀字符,从而实现将获取到第一字符串中的前缀字符及后缀字符合成得到所要访问的第一字符串,并返回该第一字符串给终端。
[0032] 需要说明的是,在本实施例中,在获取到携带有待访问的第一字符串的标识的数据访问请求后,通过根据上述第一字符串的标识获取到第一字符串的前缀字符指示信息,以利用该前缀字符指示信息直接获取到第一字符串中的前缀字符,而无需再对位于第一字符串之前的字符串进行依次逐个扫描,以分别获取各个字符串中分别压缩的第一字符串中的部分前缀字符,从而达到快速准确获取第一字符串中的前缀字符的目的,并在与第一字符串中的后缀字符合成后,得到所要访问的第一字符串,进而实现缩短数据访问的等待时长,提高数据访问效率的效果。
[0033] 也就是说,在本实施例中,根据位于第一字符串之前,且与第一字符串相邻的第二字符串确定第一字符串中的前缀字符,其中,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,而上述确定出的第一字符串的前缀字符被分别压缩在位于第一字符串之前的各个字符串中。
[0034] 可选地,在本实施例中,在获取数据访问请求之前,还包括:配置用于存储第一字符串的结构信息的元信息块,其中,元信息块中包括:第一字符串的前缀长度、第一字符串的后缀存储位置、第一字符串的前缀字符指示信息及第一字符串的后缀字符。也就是说,上述待访问的数据可以但不限于预先以元信息块的形式存储在存储区域中,其中,上述前缀字符指示信息可以但不限于通过记录部分前缀字符所在字符串的编号与当前字符串(即第一字符串)的编号之间的距离,这里的距离可以但不限于为上述两个字符串的编号之间的差值。
[0035] 例如,如表1所示,每一个字符串都可以将字符串的结构信息以线性的存储结构的形式存储在一个对应的元信息块中,如元信息块中可以包括但不限于如下的4元组:
[0036] 表1
[0037]
[0038] 需要说明的是,1)prefix_length块:用于表示当前字符串(即第一字符串)与前一个字符串(即第二字符串)的相同的前缀字符的长度,其中,前缀字符为从当前字符串(即第一字符串)的起始字符开始,与前一个字符串(即第二字符串)中自起始字符起连续相同的有序字符;2)suffix块:用于表示当前字符串(即第一字符串)相比前一个字符串(即第二字符串)的非共同前缀部分的具体内容,即当前字符串(即第一字符串)的后缀字符;3)suffix_position块:用于表示当前字符串(即第一字符串)的后缀字符的后缀存储位置;4)effective_prefix_distance块:用于表示当前字符串(即第一字符串)的编号与其之前最近的、真实保存了当前字符串(即第一字符串)部分前缀内容的字符串的编号的差值。
[0039] 例如,以字符串集合{“aa”,“abc”“,abcd”,“abd”“,abe”}为示例,假设最后一个字符串“abe”为第一字符串,与前一个字符串“abd”相比,共同的前缀字符为“ab”,则prefix_length为2,后缀字符为“e”。此外,尽管其前一个字符串“abd”与其有共同的前缀字符为“ab”,但是前缀字符“ab”并没有保存在字符串“abd”所属的4元组中,而是在集合中的第2个字符串“abc”中保存了前缀字符“ab”的部分内容“b”。因此,字符串“abe”对应的effective_prefix_distance块将指示“abc”的编号与“abe”的编号的差值。
[0040] 可选地,在本实施例中,包括多个待访问的字符串的字符串集合对应的元信息块可以但不限于为:1)并列存储;2)线性存储。其中,并列存储指每一个字符串分别配置一个如表1所示的一个独立的元信息块;而线性存储指在上述表1所示的元信息块中依次将多个字符串的结构信息存储在对应的块中。
[0041] 例如,仍以字符串集合{“aa”“,abc”“,abcd”“,abd”“,abe”}为例,每个字符串的后缀字符分别为{“aa”,“bc”“, d”“,d”,“e”}。那么线性存储指的是将在元信息块的suffix块中依次存储上述后缀字符,即suffix块中包括:“aabcdde”,所有的后缀字符可以但不限于连续存储在一起。而元信息块的suffix_position块中将依次存储上述后缀字符的后缀存储位置,以从0开始为例,{0,2,4,5,6,7},即,每一个字符串的后缀字符在suffix块中的偏移。其中,最后一个数值7可以但不限于是为了简化程序处理逻辑,额外添加的一个个数值,该值等于元信息块中整个suffix块的长度(如字符长度)。上述仅是一种示例,本实施例中对此不做任何限定。
[0042] 进一步,在本实施例中,上述元信息块可以但不限于用于记录四个结构块的起始地址,此外,元信息块中也记录了字符串的个数。其中,对于上述四个结构块,由于prefix_length块,suffix_position块和effective_prefix_distance块,三个块中的内容字段都是使用定长类型表示,如以prefix_length块(前缀长度)为例,在该结构块中不同的字符串分别使用相同长度的字段表示对应字符串的前缀长度。进一步,在通过线性存储的方式存储上述元信息块的情况下,可以但不限于通过以下方式获取指定字符串中的结构信息:起始地址+(编号*单个字段长度)。
[0043] 例如,仍以字符串集合{“aa”“,abc”“,abcd”“,abd”“,abe”}为例,假设要获取字符串标识为4(即第5个)字符串的前缀长度,其中,prefix_length块起始地址为1,单个字段长度假设为2,则可从1+2*4=9的地址上获取所存储的标识为4(即第5个)字符串的前缀长度。
[0044] 可选地,在本实施例中,根据第一字符串的标识获取第一字符串的前缀字符指示信息包括:在用于存储字符串的结构信息的元信息块中,获取与第一字符串的标识对应的第一字符串的前缀字符指示信息,其中,第一字符串的前缀字符指示信息中包括与一个或多个前缀指针,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。其中,上述第一字符串的标识可以但不限于为第一字符串的编号,上述仅是一种示例,本实施例中对此不做任何限定。
[0045] 可选地,在本实施例中,根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符包括以下至少一种方式:
[0046] 1)获取第一字符串中全部前缀字符对应的前缀字符指示信息,根据已获取到的全部前缀字符指示信息,再一次性从位于第一字符串之前的字符串中获取第一字符串中的全部前缀字符;
[0047] 2)依次获取第一字符串的各个前缀字符指示信息,在获取到前缀字符指示信息的同时获取该前缀字符指示信息所指示的第一字符串中的部分前缀字符;
[0048] 需要说明的是,上述方式是获取第一字符串中的前缀字符时的两种不同的实现手段,可以分别独立使用,也可以进行相应结合,本实施例中对此不做任何限定。
[0049] 可选地,在本实施例中,上述前缀字符指示信息可以但不限于包括一个或多个前缀指针,其中,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。结合元信息块为例进行说明,上述前缀字符指示信息可以但不限于为元信息块中的有效前缀长度effective_prefix_distance,以effective_prefix_distance中的一个前缀指针为例,该前缀指针用于指示当前字符串(即第一字符串)的编号与位于当前字符串(即第一字符串)之前最近的、真实保存了第一字符串部分前缀内容的字符串的编号的差值,从而实现根据第一字符串的编号可以获知上述前缀字符所在的字符串的编号,进而便于直接从中获取第一字符串被压缩的前缀字符。
[0050] 通过本申请提供的实施例,在获取到携带有待访问的第一字符串的标识的数据访问请求后,通过根据上述第一字符串的标识获取到第一字符串的前缀字符指示信息,以利用该前缀字符指示信息直接获取到第一字符串中的前缀字符,而无需再对位于第一字符串之前的字符串进行依次逐个扫描,以分别获取各个字符串中分别压缩的第一字符串中的部分前缀字符,从而达到快速准确获取第一字符串中的前缀字符的目的,并在与第一字符串中的后缀字符合成后,得到所要访问的第一字符串,进而实现缩短数据访问的等待时长,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率。
[0051] 作为一种可选的方案,根据第一字符串的标识获取第一字符串的前缀字符指示信息包括:
[0052] S1,在用于存储字符串的结构信息的元信息块中,获取与第一字符串的标识对应的第一字符串的前缀字符指示信息,其中,第一字符串的前缀字符指示信息中包括与一个或多个前缀指针,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。
[0053] 可选地,在本实施例中,获取与第一字符串的标识对应的第一字符串的前缀字符指示信息可以包括但不限于:
[0054] S11,根据第一字符串的标识获取第一字符串的前缀字符指示信息中的第一个前缀指针;
[0055] S12,重复执行以下步骤,直至获取第一字符串的前缀字符指示信息中的全部前缀指针,其中,第一字符串为初始的当前字符串,第一字符串的前缀字符指示信息中的第一个前缀指针为初始的当前前缀指针:
[0056] S12-1,获取当前前缀指针所指示的位于当前字符串之前的目标字符串的标识;
[0057] S12-2,根据目标字符串的标识获取目标字符串的前缀字符指示信息中的第一个前缀指针,作为第一字符串的前缀字符指示信息中的下一个前缀指针;
[0058] S12-3,将目标字符串作为下一个当前字符串,将目标字符串的前缀字符指示信息中的第一个前缀指针作为下一个当前前缀指针。
[0059] 可选地,在本实施例中,上述前缀字符指示信息中包括的前缀指针所指示的距离,可以但不限于是相对于不同的参考字符串的距离。
[0060] 例如,仍以字符串集合{“aa”“,abc”“,abcd”“,abd”“,abe”}为例,上述各个字符串的后缀字符(去除与相邻的前一个字符串相同的前缀字符之后的内容)分别为{“aa”“, bc”,“d”“,d”,“e”},则在suffix_positioin块中存储的上述字符串的后缀存储位置分别为{0,2,4,5,6,7}。在Prefix_length块中存储的上述字符串的前缀长度分别为{0,1,3,2,2}。那么在effective_prefix_distance块中每个字符串对应的有效前缀的位置(即最近的、可获取到第一字符串中的部分前缀字符的字符串的编号)分别为{0,0,1,1,1}。
[0061] 以最后一个字符串“abe”为例,所保存的后缀字符为“e”,压缩前缀字符为“ab”,前缀长度为2,整个前缀字符“ab”被分散保存在两个位置:即第2个字符串“abc”对应的后缀字符“bc”中保存了前缀字符“b”,第一个字符串“aa”的后缀字符“aa”中保存了前缀字符“a”。在effective_prefix_distance块中保存的是当前字符串(即第一字符串)的位置(即编号)与有效前缀所在字符串(如第二字符串)的位置(即编号)的差值。即{0,1,2,3,4}与{0,0,1,
1,1}分别相减,从而得到effective_prefix_distance块中存储的内容为{0,1,1,2,3}。
[0062] 其中,以字符串“abe”为例说明,“3”用于指示字符串“abe”与字符串“abc”(字符串“abc”的后缀字符中存储有字符串“abe”中的部分有效的前缀字符“b”)之间的距离,即,该距离是相对参考字符串“abe”得到的;正序第一个“1”用于指示字符串“abc”与字符串“aa”(字符串“aa”的后缀字符中存储有字符串“abc”中的部分有效的前缀字符“a”,同时也是字符串“abe”中的部分有效的前缀字符“a”)之间的距离,即,该距离是相对参考字符串“abc”得到的。这里两个前缀指针{1,3}构成了字符串“abe”的前缀指示信息。
[0063] 也就是说,依次将获取到的前缀指针所指示的字符串作为下一个需要获取前缀指针的参考字符串(即目标字符串),基于参考字符串获取第一字符串的下一个前缀指针。换言之,基于每个参考字符串所获取到的第一个前缀指针,将得到第一字符串的前缀指示信息中的全部前缀指针。需要说明的是,这里的参考字符串是指分别存储有第一字符串中的部分前缀字符的相关字符串。
[0064] 通过本申请提供的实施例,通过重复执行上述步骤,以实现从预存的元信息块中分别获取与第一字符串相关联的参考字符串(即目标字符串)的第一个前缀指针,构成第一字符串的前缀指示信息中的前缀指针,从而达到利用上述前缀指针直接获取第一字符串中的前缀字符的目的,而无需扫描全部字符串,以实现节省访问时间,提高访问效率的效果。
[0065] 作为一种可选的方案,根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符包括:
[0066] S1,依次获取第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串在元信息块中对应存储的后缀字符;
[0067] S2,从各个前缀指针所指示的字符串在元信息块中对应存储的后缀字符中分别获取第一字符串的前缀字符中的部分字符,以得到第一字符串的前缀字符。
[0068] 需要说明的是,在本实施例中,由于每个第一字符串与相邻的第二字符串相同的前缀字符被压缩在了位于第一字符串之前的一个或多个字符串中,因而,本实施例中可以但不限于从每个字符串所存储的有效的后缀字符中分别获取第一字符串中的部分前缀字符。
[0069] 可选地,在本实施例中,从各个前缀指针所指示的字符串在元信息块中对应存储的后缀字符中分别获取第一字符串的前缀字符中的部分字符包括:
[0070] S21,按照第一字符串的前缀字符指示信息中包括的各个前缀指针的指示顺序,重复执行以下步骤,其中,第一字符串的前缀字符指示信息中的第一个前缀指针作为初始的当前指针,第一字符串的前缀长度作为初始的当前未获取前缀字符的字符长度:
[0071] S21-1,获取当前指针所指示的字符串的前缀长度;
[0072] S21-2,获取当前未获取前缀字符的字符长度与当前指针所指示的字符串的前缀长度二者之间的第一差值;
[0073] S21-3,从当前指针所指示的字符串在元信息块中对应存储的后缀字符中依序获取第一差值所指示数量的字符,作为第一字符串的前缀字符中的部分字符;
[0074] S21-4,将各个前缀指针中位于当前指针之后的下一个指针作为当前指针,并从当前未获取前缀字符的字符长度中减去第一差值,得到下一个当前未获取前缀字符的字符长度。
[0075] 可选地,在本实施例中,可以但不限于从元信息块的prefix_length块中直接获取编号为i的字符串的前缀长度,此外,还可以但不限于通过以下方式获取编号为i的字符串的后缀长度。
[0076] 例如,在字符串的编号从0开始取值的情况下,可以但不限于通过以下公式得到编号为n的字符串的suffix的长度L:
[0077] L=suffix_position[n+1]–suffix_position[n]
[0078] 例如,仍以字符串集合{“aa”“,abc”“,abcd”“,abd”“,abe”}为例,上述各个字符串的后缀字符(去除与相邻的前一个字符串相同的前缀字符之后的内容)分别为{“aa”“, bc”,“d”“,d”,“e”},则在suffix_positioin块中存储的上述字符串的后缀存储位置分别为{0,2,4,5,6,7},相邻两两相减,得到的后缀长度分别为{2,2,1,1,1}。
[0079] 具体结合以下示例说明从各个前缀指针所指示的字符串在元信息块中对应存储的后缀字符中分别获取第一字符串的前缀字符中的部分字符的过程,执行代码可以如下:
[0080]
[0081]
[0082] 其中,length为编号为id的字符串的长度=共同前缀长度+后缀长度,offset表示编号为id的字符串还未获取到的字符的数量,其中,offset初始值为length,即初始状态为整个字符串都需要获取,当offset>0时,表示字符串内容还未获取完整;而当offset=0时表示未获取的字符数量为0,即已经获取了完整内容,则可退出循环重复过程。
[0083] 此外,在上述代码中可以但不限于通过一个if结构。比如,如果用2字节定长空间来保存单个effective_prefix_distance值的话,能有效表示的最大间距是65536。如果用1字节表示的话,最大间距就是256。但是实际中,有可能真实的effective_prefix_distance值可能超过65536或者256。这时跳到那个位置之后,是无法获取到有效前缀内容的。这时计算出的copy_len会小于等于0。因此当copy_len小于等于0时,不执行memcpy和offset-=copy_len这两步操作,让for循环继续执行。从而获取到有效前缀内容。在保证效率的同时节省的存储空间,还在空间和性能间折衷时,仅用1字节来存储effective_prefix_distance值。
[0084] 进一步,copy_len用于表示可以获取到的有效前缀的长度,即当前待获取的字符数量,是个变量;cur表示当前从编号为cur的字符串的后缀字符中获取第一字符串中的部分前缀字符。其中,上述公式cur=cur-effective_prefix_distance[cur],用于指示通过直接跳转到那个可以有效获取到部分前缀的字符串所在位置(即对应编号),以避免重复、无效的扫描开销。
[0085] 通过本申请提供的实施例,通过判断当前未获取到的前缀字符的数量是否已达到0,来确定是否已经获取第一字符串的完整的前缀字符,其中,在上述获取前缀字符的循环过程中,具体是通过从各个前缀指针所指示的可以有效获取到部分前缀的字符串中的后缀字符中,按照当前这一轮循环过程中可获取的待获取的字符数量依序获取部分字符作为第一字符串中的前缀字符,从而避免对所有字符串进行重复、无效的扫描,以降低访问开销,提高访问效率。
[0086] 作为一种可选的方案,将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串包括:
[0087] S1,获取第一字符串的字符串总长度;
[0088] S2,根据字符串总长度为第一字符串分配存储地址,并获取用于存储所要返回的第一字符串的首地址;
[0089] S3,重复执行以下步骤,直至第一字符串中当前未获取字符的字符长度小于等于0,其中,第一字符串的标识作为初始的当前标识,第一字符串的字符串总长度作为初始的当前未获取字符的字符长度:
[0090] S31,获取当前未获取字符的字符长度与当前标识所标识的字符串的前缀长度之间的第二差值,作为当前待合成的字符长度;
[0091] S32,从当前标识所标识的字符串在元信息块中对应存储的后缀字符中依序获取当前待合成的字符长度所指示的数量的字符,作为待合成字符;
[0092] S33,获取当前未获取字符的字符长度与当前待合成的字符长度之间的第三差值;
[0093] S34,在首地址上叠加第三差值,得到待合成字符的存储地址;
[0094] S35,将待合成字符存储到存储地址中;
[0095] S36,从当前未获取字符的字符长度中减去当前待合成的字符长度,得到下一个当前未获取字符的字符长度;
[0096] S37,在下一个当前未获取字符的字符长度大于0时,获取下一个当前标识,其中,下一个当前标识依次从第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串的标识中获取。
[0097] 具体结合图4所示示例进行说明,假设仍以字符串集合{“aa”“, abc”“, abcd”,“abd”,“abe”}为例。
[0098] 上述字符串集合对应的后缀字符(去除与相邻的前一个字符串相同的前缀字符之后的内容)为{“aa”“, bc”“,d”,“d”“, e”}。因此,在suffix_positioin块中上述字符串集合对应的后缀存储位置分别为{0,2,4,5,6,7}。在Prefix_length块中上述字符串集合对应的前缀字符分别为{0,1,3,2,2}。那么每个字符串对应的有效前缀的位置(即最近的、可获取到第一字符串中的部分有效的前缀字符的字符串的编号)分别为{0,0,1,1,1},对应的在effective_prefix_distance块中存储的内容为{0,1,1,2,3},即,由各个字符串的编号{0,1,2,3,4}与上述有效前缀的位置(编号){0,0,1,1,1}分别相减得到。
[0099] 以最后一个字符串“abe”为例,所保存的后缀字符为“e”,压缩前缀字符为“ab”,前缀长度为2,整个前缀字符“ab”被分散保存在两个位置:即第2个字符串“abc”对应的后缀字符“bc”中保存了前缀字符“b”,第一个字符串“aa”的后缀字符“aa”中保存了前缀字符“a”。具体的结合以下执行步骤,及上述执行代码,说明获取字符传“abe”的全部前缀字符的过程:
[0100] 首先,suffix_len=suffix_position[5]–suffix_position[4]=7–6=1。
[0101] Length=prefix_length[4]+suffix_len=2+1=3。
[0102] 因此得到要获取的字符串总长度为3。通过str->resize(length)将str的长度设置为3。
[0103] cur=id,即cur被初始化为4。
[0104] 在for循环中,offset被初始化为length(offset=length),即offset初始值为3.[0105] Copy_len=offset–prefix_length[cur]=3–prefix_length[4]=3–2=1。
[0106] Memcpy(ptr+offset–copy_len),suffix[cur],copy_len),其中ptr+offset–copy_len=ptr+3–1=ptr+2。Ptr指向str的起始地址,str的长度为3.也就是ptr+2指向str的最后一个字符的位置。Suffix[cur]=suffix[4]=“e”。copy_len=1。也就是从“e”中拷贝1个字符到str的最后一个字符,这样str的内容变成了“XXe”。XX表示str最前面两个字符的内容未设置。
[0107] 之后,offset=offset–copy_len=3–1=2。
[0108] 然后,cur=cur–effective_prefix_distance[cur]=4–effective_prefix_distance[4]=4-3=1。
[0109] 进行下一次循环:
[0110] Copy_len=offset–prefix_length[cur]=2–prefix_length[1]=2–1=1。
[0111] Ptr+offset-copy_len=ptr+2–1=ptr+1,即指向str的第1个字符的位置(从0开始计数),也即倒数第2个字符的位置。Suffix[cur]=suffix[1]=“bc”。Copy_len为1,也即从“bc”中拷贝1个字符到str的第1个字符的位置,也就是把“b”拷贝到str的第一个字符的位置。这时str的内容从“XXe”变成了“Xbe”。
[0112] 然后,offset=offset–copy_len=2–1=1。
[0113] Cur=cur–effective_prefix_distance[cur]=1–effective_prefix_distance[1]=1–1=0。
[0114] 进行下一次循环:
[0115] Copy_len=offset–prefix_length[cur]=1–prefix_length[0]=1–0=1。Ptr+offset–copy_len=ptr+1–1=ptr,即指向str的第0个字符(首字符)的位置。Suffix[cur]=suffix[0]=“aa”,copy_len=1。即从“aa”拷贝1个字符到str的首字符位置。即把“a”拷到str首符串位置,那么str就从”Xbe”变成了“abe”。然后,offset=offset–copy_len=1–1=0。
[0116] 在上述示例中,For循环继续的条件为offset>0;在不满足条件时,循环结束,并且获取到编号为4的字符串完整内容,即“abe”。
[0117] 通过本申请提供的实施例,通过前缀指示信息effective_prefix_distance来加速获取第一字符串中各部分前缀的效率,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率。此外,使用编号的差值来作为索引,还可以节省存储空间。
[0118] 作为一种可选的方案,在获取数据访问请求之前,还包括:
[0119] S1,配置用于存储第一字符串的结构信息的元信息块,其中,元信息块中包括:第一字符串的前缀长度、第一字符串的后缀存储位置、第一字符串的前缀字符指示信息及第一字符串的后缀字符。
[0120] 可选地,在本实施例中,配置用于存储第一字符串的结构信息的元信息块包括:
[0121] S11,获取第一字符串的前缀长度;
[0122] S12,重复执行以下步骤,直至当前标识所指示的字符串的前缀长度小于第一字符串的前缀长度,其中,第一字符串的标识作为初始的当前标识:判断当前标识所指示的字符串的前缀长度是否大于等于第一字符串的前缀长度;在当前标识所指示的字符串的前缀长度大于等于第一字符串的前缀长度时,获取下一个当前标识,其中,下一个当前标识按照在元信息块所存储的字符串的存储顺序依次向前获取;
[0123] S12-1,在当前标识所指示的字符串的前缀长度小于第一字符串的前缀长度时,获取第一字符串的标识与当前标识之间的第四差值作为第一字符串的前缀字符指示信息中的第一个前缀指针,其中,前缀指针用于指示第一字符串的前缀字符中的部分字符所在的字符串;
[0124] S12-2,将第一个前缀指针存储在元信息块中与第一字符串匹配的前缀字符指示信息中。
[0125] 具体结合以下示例进行说明,假设要计算第n个字符串的effective_prefix_number,这里,n–effective_prefix_number的结果值,将作为元信息块中effective_prefix_distance块中第n个字符串的字段。在本实施例中,将effective_prefix_number也可称为prefix_number,使用strs[i]来表示第i个字符串,用prefixs[i]表示编号i的字符串与编号为i-1的字符串的共同前缀,即编号i的字符串的前缀字符。prefix_length[i]表示编号为i的字符串前缀的长度。其中,执行代码可以如下:
[0126]
[0127]
[0128] 需要说明的是,在本实施例中,从预存的元信息块中编号为n–1的字符串开始,向前循环扫描字符串的前缀长度,其中,prefix_number–n用于表示effective_prefix_distance[n]。在上述循环过程中,for循环是从n-1向前扫描prefix_length[],找到第一个prefix_length[j]小于prefix_length[n]的编号时,即可将编号j作为编号为n的字符串的第一个前缀指针所指示的字符串的编号,其中,这里的第一个前缀指针为上述编号之间的差值(即n-j),编号为n的字符串在effective_prefix_distance块中存储的字段即为n-j。
[0129] 假设仍以{“aa”“, abc”,“abcd”“,abd”,“abe”}为例。这里strs[n]的内容为“abe”,前缀为“ab”。因为strs[…]是有序的。那么从n-1开始向前扫描,至少连续有1个或以上字符串的内容以“ab”打头。在字符串“abe”之前,有3个字符串连续以“ab”打头,即,{“abc”,“abcd”“,abd”},这3个字符串之前的字符串不以“ab”打头,如“aa”。其中,字符串“abc”对应的prefix_length小于2,因此,字符串“abc”的后缀字符中至少包含了“abe”的前缀“ab”的最后一个字符,即至少包含了“b”。因此,字符串“abe”可以从“abc”的后缀字符里获取到部分有效前缀字符,即,至少获取到“ab”中的“b”。
[0130] 而“abc”之后的字符串,直到“abe”,即{“abcd,abd”},都以“ab”开头,这些字符串的prefix_length都至少为2,即大于等于2,因此,它们的后缀字符中不会记录“abe”的前缀“ab”中的任何内容,即“abe”不能从这些字符串的后缀字符中获取到字符串“abe”中的有效前缀字符。
[0131] 综上所述,“abe”是从“abe”前一个位置开始往前扫,第一个可以获取到有效前缀字符的字符串。并且它的prefix_length小于2(“ab”的长度),而“abc”与“abe”之间的字符串的prefix_length都大于等于2。
[0132] 通过本申请提供的实施例,通过在元信息块中配置字符串的前缀指示信息effective_prefix_distance,来加速获取第一字符串中各部分前缀的效率,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率。
[0133] 需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
[0134] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0135] 实施例2
[0136] 根据本发明实施例,还提供了一种用于实施上述数据访问方法的数据访问装置,如图5所示,该装置包括:
[0137] 1)第一获取单元502,用于获取数据访问请求,其中,数据访问请求中携带有待访问的第一字符串的标识;
[0138] 2)第二获取单元504,用于根据第一字符串的标识获取第一字符串中的后缀字符,及第一字符串的前缀字符指示信息,其中,前缀字符指示信息用于指示第一字符串中的前缀字符,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,第二字符串位于第一字符串之前,且与第一字符串相邻;
[0139] 3)第三获取单元506,用于根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符;
[0140] 4)合成单元508,用于将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串,并返回第一字符串。
[0141] 可选地,在本实施例中,可以但不限于以将上述数据访问装置应用于图2所示的应用环境中为例进行说明,也就是说,服务器通过网络获取终端发送的数据访问请求,其中,该数据访问请求中携带有待访问的第一字符串的标识,服务器根据上述第一字符串的标识将从预先存储在存储区的数据结构中获取到第一字符串中的后缀字符,及用于指示第一字符串的前缀字符指示信息,并利用该前缀字符指示信息直接获取第一字符串中的前缀字符,从而实现将获取到第一字符串中的前缀字符及后缀字符合成得到所要访问的第一字符串,并返回该第一字符串给终端。
[0142] 需要说明的是,在本实施例中,在获取到携带有待访问的第一字符串的标识的数据访问请求后,通过根据上述第一字符串的标识获取到第一字符串的前缀字符指示信息,以利用该前缀字符指示信息直接获取到第一字符串中的前缀字符,而无需再对位于第一字符串之前的字符串进行依次逐个扫描,以分别获取各个字符串中分别压缩的第一字符串中的部分前缀字符,从而达到快速准确获取第一字符串中的前缀字符的目的,并在与第一字符串中的后缀字符合成后,得到所要访问的第一字符串,进而实现缩短数据访问的等待时长,提高数据访问效率的效果。
[0143] 也就是说,在本实施例中,根据位于第一字符串之前,且与第一字符串相邻的第二字符串确定第一字符串中的前缀字符,其中,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,而上述确定出的第一字符串的前缀字符被分别压缩在位于第一字符串之前的各个字符串中。
[0144] 可选地,在本实施例中,在获取数据访问请求之前,还包括:配置用于存储第一字符串的结构信息的元信息块,其中,元信息块中包括:第一字符串的前缀长度、第一字符串的后缀存储位置、第一字符串的前缀字符指示信息及第一字符串的后缀字符。也就是说,上述待访问的数据可以但不限于预先以元信息块的形式存储在存储区域中,其中,上述前缀字符指示信息可以但不限于通过记录部分前缀字符所在字符串的编号与当前字符串(即第一字符串)的编号之间的距离,这里的距离可以但不限于为上述两个字符串的编号之间的差值。
[0145] 例如,如表2所示,每一个字符串都可以将字符串的结构信息以线性的存储结构的形式存储在一个对应的元信息块中,如元信息块中可以包括但不限于如下的4元组:
[0146] 表2
[0147]
[0148] 需要说明的是,1)prefix_length块:用于表示当前字符串(即第一字符串)与前一个字符串(即第二字符串)的相同的前缀字符的长度,其中,前缀字符为从当前字符串(即第一字符串)的起始字符开始,与前一个字符串(即第二字符串)中自起始字符起连续相同的有序字符;2)suffix块:用于表示当前字符串(即第一字符串)相比前一个字符串(即第二字符串)的非共同前缀部分的具体内容,即当前字符串(即第一字符串)的后缀字符;3)suffix_position块:用于表示当前字符串(即第一字符串)的后缀字符的后缀存储位置;4)effective_prefix_distance块:用于表示当前字符串(即第一字符串)的编号与其之前最近的、真实保存了当前字符串(即第一字符串)部分前缀内容的字符串的编号的差值。
[0149] 例如,以字符串集合{“aa”,“abc”“,abcd”,“abd”“,abe”}为示例,假设最后一个字符串“abe”为第一字符串,与前一个字符串“abd”相比,共同的前缀字符为“ab”,则prefix_length为2,后缀字符为“e”。此外,尽管其前一个字符串“abd”与其有共同的前缀字符为“ab”,但是前缀字符“ab”并没有保存在字符串“abd”所属的4元组中,而是在集合中的第2个字符串“abc”中保存了前缀字符“ab”的部分内容“b”。因此,字符串“abe”对应的effective_prefix_distance块将指示“abc”的编号与“abe”的编号的差值。
[0150] 可选地,在本实施例中,包括多个待访问的字符串的字符串集合对应的元信息块可以但不限于为:1)并列存储;2)线性存储。其中,并列存储指每一个字符串分别配置一个如表2所示的一个独立的元信息块;而线性存储指在上述表2所示的元信息块中依次将多个字符串的结构信息存储在对应的块中。
[0151] 例如,仍以字符串集合{“aa”“,abc”“,abcd”“,abd”“,abe”}为例,每个字符串的后缀字符分别为{“aa”,“bc”“, d”“,d”,“e”}。那么线性存储指的是将在元信息块的suffix块中依次存储上述后缀字符,即suffix块中包括:“aabcdde”,所有的后缀字符可以但不限于连续存储在一起。而元信息块的suffix_position块中将依次存储上述后缀字符的后缀存储位置,以从0开始为例,{0,2,4,5,6,7},即,每一个字符串的后缀字符在suffix块中的偏移。其中,最后一个数值7可以但不限于是为了简化程序处理逻辑,额外添加的一个个数值,该值等于元信息块中整个suffix块的长度(如字符长度)。上述仅是一种示例,本实施例中对此不做任何限定。
[0152] 进一步,在本实施例中,上述元信息块可以但不限于用于记录四个结构块的起始地址,此外,元信息块中也记录了字符串的个数。其中,对于上述四个结构块,由于prefix_length块,suffix_position块和effective_prefix_distance块,三个块中的内容字段都是使用定长类型表示,如以prefix_length块(前缀长度)为例,在该结构块中不同的字符串分别使用相同长度的字段表示对应字符串的前缀长度。进一步,在通过线性存储的方式存储上述元信息块的情况下,可以但不限于通过以下方式获取指定字符串中的结构信息:起始地址+(编号*单个字段长度)。
[0153] 例如,仍以字符串集合{“aa”“,abc”“,abcd”“,abd”“,abe”}为例,假设要获取字符串标识为4(即第5个)字符串的前缀长度,其中,prefix_length块起始地址为1,单个字段长度假设为2,则可从1+2*4=9的地址上获取所存储的标识为4(即第5个)字符串的前缀长度。
[0154] 可选地,在本实施例中,第二获取单元504包括:第一获取模块,用于在用于存储字符串的结构信息的元信息块中,获取与第一字符串的标识对应的第一字符串的前缀字符指示信息,其中,第一字符串的前缀字符指示信息中包括与一个或多个前缀指针,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。其中,上述第一字符串的标识可以但不限于为第一字符串的编号,上述仅是一种示例,本实施例中对此不做任何限定。
[0155] 可选地,在本实施例中,根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符包括以下至少一种方式:
[0156] 1)获取第一字符串中全部前缀字符对应的前缀字符指示信息,根据已获取到的全部前缀字符指示信息,再一次性从位于第一字符串之前的字符串中获取第一字符串中的全部前缀字符;
[0157] 2)依次获取第一字符串的各个前缀字符指示信息,在获取到前缀字符指示信息的同时获取该前缀字符指示信息所指示的第一字符串中的部分前缀字符;
[0158] 需要说明的是,上述方式是获取第一字符串中的前缀字符时的两种不同的实现手段,可以分别独立使用,也可以进行相应结合,本实施例中对此不做任何限定。
[0159] 可选地,在本实施例中,上述前缀字符指示信息可以但不限于包括一个或多个前缀指针,其中,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。结合元信息块为例进行说明,上述前缀字符指示信息可以但不限于为元信息块中的有效前缀长度effective_prefix_distance,以effective_prefix_distance中的一个前缀指针为例,该前缀指针用于指示当前字符串(即第一字符串)的编号与位于当前字符串(即第一字符串)之前最近的、真实保存了第一字符串部分前缀内容的字符串的编号的差值,从而实现根据第一字符串的编号可以获知上述前缀字符所在的字符串的编号,进而便于直接从中获取第一字符串被压缩的前缀字符。
[0160] 通过本申请提供的实施例,在获取到携带有待访问的第一字符串的标识的数据访问请求后,通过根据上述第一字符串的标识获取到第一字符串的前缀字符指示信息,以利用该前缀字符指示信息直接获取到第一字符串中的前缀字符,而无需再对位于第一字符串之前的字符串进行依次逐个扫描,以分别获取各个字符串中分别压缩的第一字符串中的部分前缀字符,从而达到快速准确获取第一字符串中的前缀字符的目的,并在与第一字符串中的后缀字符合成后,得到所要访问的第一字符串,进而实现缩短数据访问的等待时长,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率。
[0161] 作为一种可选的方案,第二获取单元504包括:
[0162] 1)第一获取模块,用于在用于存储字符串的结构信息的元信息块中,获取与第一字符串的标识对应的第一字符串的前缀字符指示信息,其中,第一字符串的前缀字符指示信息中包括与一个或多个前缀指针,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。
[0163] 可选地,在本实施例中,第一获取模块包括:
[0164] (1)第一获取子模块,用于根据第一字符串的标识获取第一字符串的前缀字符指示信息中的第一个前缀指针;
[0165] (2)第一处理子模块,用于重复执行以下步骤,直至获取第一字符串的前缀字符指示信息中的全部前缀指针,其中,第一字符串为初始的当前字符串,第一字符串的前缀字符指示信息中的第一个前缀指针为初始的当前前缀指针:
[0166] S1,获取当前前缀指针所指示的位于当前字符串之前的目标字符串的标识;S2,根据目标字符串的标识获取目标字符串的前缀字符指示信息中的第一个前缀指针,作为第一字符串的前缀字符指示信息中的下一个前缀指针;S3,将目标字符串作为下一个当前字符串,将目标字符串的前缀字符指示信息中的第一个前缀指针作为下一个当前前缀指针。
[0167] 可选地,在本实施例中,上述前缀字符指示信息中包括的前缀指针所指示的距离,可以但不限于是相对于不同的参考字符串的距离。
[0168] 也就是说,依次将获取到的前缀指针所指示的字符串作为下一个需要获取前缀指针的参考字符串(即目标字符串),基于参考字符串获取第一字符串的下一个前缀指针。换言之,基于每个参考字符串所获取到的第一个前缀指针,将得到第一字符串的前缀指示信息中的全部前缀指针。需要说明的是,这里的参考字符串是指分别存储有第一字符串中的部分前缀字符的相关字符串。
[0169] 通过本申请提供的实施例,通过重复执行上述步骤,以实现从预存的元信息块中分别获取与第一字符串相关联的参考字符串(即目标字符串)的第一个前缀指针,构成第一字符串的前缀指示信息中的前缀指针,从而达到利用上述前缀指针直接获取第一字符串中的前缀字符的目的,而无需扫描全部字符串,以实现节省访问时间,提高访问效率的效果。
[0170] 作为一种可选的方案,第三获取单元506包括:
[0171] 1)第二获取模块,用于依次获取第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串在元信息块中对应存储的后缀字符;
[0172] 2)第三获取模块,用于从各个前缀指针所指示的字符串在元信息块中对应存储的后缀字符中分别获取第一字符串的前缀字符中的部分字符,以得到第一字符串的前缀字符。
[0173] 需要说明的是,在本实施例中,由于每个第一字符串与相邻的第二字符串相同的前缀字符被压缩在了位于第一字符串之前的一个或多个字符串中,因而,本实施例中可以但不限于从每个字符串所存储的有效的后缀字符中分别获取第一字符串中的部分前缀字符。
[0174] 可选地,在本实施例中,第三获取模块包括:
[0175] (1)第二处理子模块,用于按照第一字符串的前缀字符指示信息中包括的各个前缀指针的指示顺序,重复执行以下步骤,其中,第一字符串的前缀字符指示信息中的第一个前缀指针作为初始的当前指针,第一字符串的前缀长度作为初始的当前未获取前缀字符的字符长度:
[0176] S1,获取当前指针所指示的字符串的前缀长度;
[0177] S2,获取当前未获取前缀字符的字符长度与当前指针所指示的字符串的前缀长度二者之间的第一差值;
[0178] S3,从当前指针所指示的字符串在元信息块中对应存储的后缀字符中依序获取第一差值所指示数量的字符,作为第一字符串的前缀字符中的部分字符;
[0179] S4,将各个前缀指针中位于当前指针之后的下一个指针作为当前指针,并从当前未获取前缀字符的字符长度中减去第一差值,得到下一个当前未获取前缀字符的字符长度。
[0180] 可选地,在本实施例中,可以但不限于从元信息块的prefix_length块中直接获取编号为i的字符串的前缀长度,此外,还可以但不限于通过以下方式获取编号为i的字符串的后缀长度。
[0181] 通过本申请提供的实施例,通过判断当前未获取到的前缀字符的数量是否已达到0,来确定是否已经获取第一字符串的完整的前缀字符,其中,在上述获取前缀字符的循环过程中,具体是通过从各个前缀指针所指示的可以有效获取到部分前缀的字符串中的后缀字符中,按照当前这一轮循环过程中可获取的待获取的字符数量依序获取部分字符作为第一字符串中的前缀字符,从而避免对所有字符串进行重复、无效的扫描,以降低访问开销,提高访问效率。
[0182] 作为一种可选的方案,合成单元508包括:
[0183] 1)第四获取模块,用于获取第一字符串的字符串总长度;
[0184] 2)分配模块,用于根据字符串总长度为第一字符串分配存储地址,并获取用于存储所要返回的第一字符串的首地址;
[0185] 3)第一处理模块,用于重复执行以下步骤,直至第一字符串中当前未获取字符的字符长度小于等于0,其中,第一字符串的标识作为初始的当前标识,第一字符串的字符串总长度作为初始的当前未获取字符的字符长度:
[0186] S1,获取当前未获取字符的字符长度与当前标识所标识的字符串的前缀长度之间的第二差值,作为当前待合成的字符长度;
[0187] S2,从当前标识所标识的字符串在元信息块中对应存储的后缀字符中依序获取当前待合成的字符长度所指示的数量的字符,作为待合成字符;
[0188] S3,获取当前未获取字符的字符长度与当前待合成的字符长度之间的第三差值;
[0189] S4,在首地址上叠加第三差值,得到待合成字符的存储地址;
[0190] S5,将待合成字符存储到存储地址中;
[0191] S6,从当前未获取字符的字符长度中减去当前待合成的字符长度,得到下一个当前未获取字符的字符长度;
[0192] S7,在下一个当前未获取字符的字符长度大于0时,获取下一个当前标识,其中,下一个当前标识依次从第一字符串的前缀字符指示信息中包括的各个前缀指针所指示的字符串的标识中获取。
[0193] 通过本申请提供的实施例,通过前缀指示信息effective_prefix_distance来加速获取第一字符串中各部分前缀的效率,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率。此外,使用编号的差值来作为索引,还可以节省存储空间。
[0194] 作为一种可选的方案,还包括:
[0195] 1)配置单元,用于在获取数据访问请求之前,配置用于存储第一字符串的结构信息的元信息块,其中,元信息块中包括:第一字符串的前缀长度、第一字符串的后缀存储位置、第一字符串的前缀字符指示信息及第一字符串的后缀字符。
[0196] 可选地,在本实施例中,配置单元包括:
[0197] 1)第五获取模块,用于获取第一字符串的前缀长度;
[0198] 2)第二处理模块,用于重复执行以下步骤,直至当前标识所指示的字符串的前缀长度小于第一字符串的前缀长度,其中,第一字符串的标识作为初始的当前标识:判断当前标识所指示的字符串的前缀长度是否大于等于第一字符串的前缀长度;在当前标识所指示的字符串的前缀长度大于等于第一字符串的前缀长度时,获取下一个当前标识,其中,下一个当前标识按照在元信息块所存储的字符串的存储顺序依次向前获取;
[0199] S1,在当前标识所指示的字符串的前缀长度小于第一字符串的前缀长度时,获取第一字符串的标识与当前标识之间的第四差值作为第一字符串的前缀字符指示信息中的第一个前缀指针,其中,前缀指针用于指示第一字符串的前缀字符中的部分字符所在的字符串;
[0200] S2,将第一个前缀指针存储在元信息块中与第一字符串匹配的前缀字符指示信息中。
[0201] 通过本申请提供的实施例,通过在元信息块中配置字符串的前缀指示信息effective_prefix_distance,来加速获取第一字符串中各部分前缀的效率,以加速线性前缀压缩存储结构的随机访问效率,同时也提高了在线性前缀压缩存储结构上的二分查找效率。
[0202] 实施例3
[0203] 根据本发明实施例,还提供了一种用于实施上述数据访问方法的数据访问设备,如图6所示,该设备包括:
[0204] 1)通讯接口602,设置为获取数据访问请求,其中,数据访问请求中携带有待访问的第一字符串的标识;还设置为根据第一字符串的标识获取第一字符串中的后缀字符,及第一字符串的前缀字符指示信息,其中,前缀字符指示信息用于指示第一字符串中的前缀字符,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,第二字符串位于第一字符串之前,且与第一字符串相邻;还设置为根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符;
[0205] 2)处理器604,与通讯接口602连接,设置为将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串,并返回第一字符串;
[0206] 3)存储器606,与通讯接口602及处理器604连接,设置为存储第一字符串中的前缀字符及后缀字符。
[0207] 可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。
[0208] 实施例4
[0209] 本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以位于网络中的多个网络设备中的至少一个网络设备。
[0210] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:
[0211] S1,获取数据访问请求,其中,数据访问请求中携带有待访问的第一字符串的标识;
[0212] S2,根据第一字符串的标识获取第一字符串中的后缀字符,及第一字符串的前缀字符指示信息,其中,前缀字符指示信息用于指示第一字符串中的前缀字符,前缀字符为从第一字符串的起始字符开始,与第二字符串中自起始字符起连续相同的有序字符,第二字符串位于第一字符串之前,且与第一字符串相邻;
[0213] S3,根据第一字符串的前缀字符指示信息获取第一字符串的前缀字符;
[0214] S4,将第一字符串的前缀字符及第一字符串的后缀字符合成得到第一字符串,并返回第一字符串。
[0215] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
[0216] S1,在用于存储字符串的结构信息的元信息块中,获取与第一字符串的标识对应的第一字符串的前缀字符指示信息,其中,第一字符串的前缀字符指示信息中包括与一个或多个前缀指针,每一个前缀指针分别用于指示第一字符串的前缀字符中的部分字符所在的字符串。
[0217] 可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0218] 可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。
[0219] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0220] 上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
[0221] 在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0222] 在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
[0223] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0224] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0225] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。