一种数据结构的构造和存储方法

文档序号:6370492阅读:201来源:国知局
专利名称:一种数据结构的构造和存储方法
技术领域
本发明涉及数据结构技术,尤其涉及一种数据结构的构造和存储方法。
背景技术
现实中,很多数据的逻辑结构呈树状或网状。树状结构中,元素之间存在一对多关系,网状结构中,元素之间存在多对多关系。比如,将信息进行分类就是一种典型的树状结构,每细分一次,就增加一级树的节点,树状结构中,所有节点的上级节点数只有I个。网状结构在现实中的最典型表现是社会中人与人之间的关系,这种关系不是按树的结构进行层级划分,而是错综复杂的,网状结构中,所有节点的上级节点数是0个或多个。通常来说,固定知识的结构在某一个时间段T内不变(知识节点总数为N),而允许知识节点的信息在时间段T是实时变化。在很多具体应用中,知识的结构的变化是可以接受延迟的,而知识的信息是需要时刻更新的。比如分类信息网站58同城的二手手机分类,定义的手机品牌有若干种,品牌又细分了若干种型号。手机品牌和型号就形成了一个典型的树状知识结构。通常维护人员每个月添加几个手机品牌。而这些品牌/型号时刻都有相关的发布和浏览。所以品牌/型号的当前发帖量及浏览量是时刻变化的。对于树状或网状结构,各节点所含的信息分为静态信息和动态信息。静态信息在特定时间段内是固定不变的,比如某个手机型号的“名称”,“上市时间”。而动态信息会实时变化,动态信息又可以分为动态传入信息和动态计算信息。动态传入信息的变化是从外部系统获得的。比如有个系统专门提供手机型号的当日发帖量。动态计算信息的变化是需要本系统计算的。比如本系统要累计所有手机品牌的当日发帖量,然后从中找到当日发帖量最大的品牌。 参照图1,为常规树状结构的节点示意图。图中有5个节点,每个节点具有三个信息字段name、dynamic_value、result。name字段表示节点名称,其是固定的不随时间而改变,属于静态信息。dynamic_value表示动态变化的数值,result为基于动态变化数值计算的结果。dynamic_value和result都是随时变化的,属于动态信息。现有技术中,采用树状结构或网状结构存储各类数据并表示数据之间的相互关系时,存在三种方案方案一,每次计算时,临时构造数据结构,然后在数据结构上计算,获得输出结果;方案二,预先构造好一份数据结构,每次计算时,清空节点的动态传入信息,动态计算信息,然后在数据结构上计算,获得输出结果;方案三,预先构造好多份数据结构,作为多个线程之间的共享资源池,每次计算时,清空节点的动态传入信息,动态计算信息,然后在数据结构上计算,获得输出结果。就方案一而言,每次计算都要构造数据结构,带来申请内存空间和构造树两方面的时间开销,并且当有多个线程都要用同一数据结构时,需要为每个线程都临时构造一个数据结构,从而带来存储多份数据结构的内存开销;就方案二而言,虽然只要构造一次数据结构,但是同一份数据结构不能用于多个线程的并发计算,而且查找树的时间开销较大;就方案三而言,虽然可以用于多个线程的并发计算,但是会带来固定存储多份数据结构的内存开销。
上述现有技术的对于二叉树来说,查找节点的时间开销都是O(IogN),N为节点的总数。也就是说,查找节点的时间随节点数目增加成对数增长。因此,现有技术的分级数据结构的构造和存储方法在存储空间和查找时间方面的开销均比较大。

发明内容
本发明的目的是提供一种有效降低数据操作的空间复杂度和时间复杂度的方法,并适用于所有呈树状或网状的数据的数据结构构造和存储方法。根据本发明的一个方面,提供了一种数据结构的构造和存储方法,包括对数据结构中的各个节点进行编号; 设置至少一个关系数组用于依次存储数据结构中所有节点的上下级关系信息;设置至少一个动态数组用于依次存储数据结构中所有节点的动态信息字段;以及设置至少一个静态数组用于依次存储数据结构中所有节点的静态信息字段。与现有技术相比,本发明具有以下优点I)降低了数据操作的时间复杂度和空间复杂度;2)基于本发明提供的方法,可以提供高性能的数据服务。


通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显图I为根据现有技术的树状结构的节点示意图;图2为根据本发明一个优选实施例的数据结构构造和存储的方法流程图;以及图3为根据本发明一个优选实施例的数据结构构造和存储的示意图。
具体实施例方式下面结合附图对本发明作进一步详细描述。根据本发明的一个方面,提供了一种数据结构构造和存储的方法。请参考图2,图2为根据本发明一个优选实施例的数据结构构造和存储的方法流程图。如图2所示,根据本发明的数据结构构造和存储的方法包括如下步骤201,首先对分级数据结构中的各个节点编号,每个节点具有唯一的编号。进行编号的步骤可以包括对分级数据结构设定遍历的顺序,根据遍历的顺序将数据结构中的节点依次编号。设节点的总数为N,则编号的范围为0 N-1。具体地,分级数据结构包括但不限定树状、网状的具有父子关系的数据结构,在分级数据结构中,除部分特殊的节点(如树状结构中,根节点没有父亲节点)外,各节点通常具有上级节点和下级节点。在数据结构中,遍历是一种很重要的计算,通过特定的搜索方式,对数据结构中的每个节点做一次且仅做一次访问。遍历分为前序遍历、中序遍历和后续遍历。优选地,设遍历的顺序为先序遍历,根据遍历的顺序将分级数据结构中的节点依次编号。设分级数据结构中节点的总数为N,那么,节点编号的范围,为0 N-1。如图3所示,图3的左边所示的是一个树状的数据结构,该结构中节点的总数为6,根据先序遍历,依次访问A、B、Cl、C2、C3、D节点,那么按照访问的顺序,依次对这6个节点编号,编号的范围为0 5,如首先访问的节点A对应的编号为O,最后访问的节点D对应的编号为5。由于数据结构中节点的个数以及它们之间的关系是相对固定的,因此做完一次遍历操作后每个节点的编号都可以确定下来,并且在一段时间内保持不变。
在确定和存储节点编号之后,下面需要确定和存储具有编号的节点之间的相互关系或层级关系。步骤202,至少用一个一维数组表示每个节点的上级关系,根据特定的顺序,存储相应的数据。具体地,分级数据结构中,节点的上级关系包括每个节点所拥有的上级节点数和上级节点的编号。对于不同数据结构中节点的上级关系,用数组来表示时,所用的数组的数量是不同的。就树状结构而言,除根节点外,每个节点有且只有一个上级节点,因此,可以只用一个一维数组来表示每个节点的上级关系,按照节点编号的顺序,将所述节点的上级节点的编号依次存入所述数组中,其中,所述数组的长度为节点的总数,即N。参照图3,树状数据结构的节点数为6,按照先序遍历,各节点的编号依次为(T5,构造一个数组长度为6的数组,按照节点编号的顺序,依次将6个节点的上级节点的编号存入所述数组中,如编号为0的节点,其上级节点不存在,则将所述数组的第一个元素置为-1,如编号为5的节点,其上级节点的编号为0,则将所述数组的第六个元素的值置为0,依次类推,将各节点的上级节点的编号依次存入到该数组中。就网状结构而言,每个节点可能有多个上级节点(树状结构可以认为是一种特殊的网状结构)如上文所述,设定遍历的顺序,依据遍历的顺序对各节点进行编号,节点的总数为N,编号的范围为(TN-1,至少用三个一维数组表示每个节点的上级关系,为了各节点上级关系的表示更加明确,可以构造用以表示节点的上级关系的数组。本实施例以三个一维数组为例,分别命名为 ParentNum 数组、ParentSeg 和 ParentSegStartIndex。首先,计算每个节点的上级节点数,根据节点编号的顺序,将所述节点的上级节点数依次存入ParentNum数组,即ParentNum数组中每个数组元素的值为各节点的上级节点数,此处所述的上级节点数为该节点的上级节点的数目,由于需要记录N个节点的上级节点数,所以ParentNum数组的长度为N。存储每个节点的上级节点数后,由于网状结构比树状结构复杂,每个节点的上级关系复杂,为了明确各节点的上级节点编号,需要构造数组,顺序存储各节点的上级节点编号。设所构造的数组名为ParentSeg,根据节点编号的顺序,将各个节点的所有上级节点的编号分段存入ParentSeg数组,其中,所述段的数量等于具有上级节点的节点的数量,所述ParentSeg数组的长度为ParentNum数组中所有元素值的总和,也就是每个段中存入每个节点的所有上级节点的编号。对于没有上级节点的节点,由于其上级节点的数为0,不存在上级节点的编号,因此,该节点没有对应的内容存入ParentSeg数组段中,可以用数值_1表示该节点没有上级节点,或者直接置空NULL。为了更快更好地在ParentSeg数组中查找各节点的上级节点的编号,需要建立一个类似索引的数据结构,于是,构造一个长度为N的ParentSegStartIndex数组,更好地查找各节点的上级节点的编号,其中,ParentSegStartIndex数组元素的值为ParentSeg数组中各段的下标值。例如,设节点的总数为N,各节点的上节点的数量已经计算好,并且已经将该计算好的数值存入ParentNum数组中,构造整数变量index和i,其中,i的范围从O、,对index赋初值O,按照特定的顺序依次遍历编号为(TN-I的节点,对编号为i的节点,如果ParentNum[i]的值为0,也就是该节点没有上级节点,则在ParentSeg数组中不存入该节点对应的任何内容,并将ParentSegStartIndex[i]的值置为_1,否则I)置 ParentSegStartIndex[i]=index ;2) ParentSeg[index]至 ParentSeg[index+ParentNum[i]-I]依次存储编号为 i 的节点的所有上级节点的编号;3)index=ParentNum[i]+index。按照上述遍历的顺序,依次计算各节点对应的ParentSeg数组元素的值和·ParentSegStartIndex 数组元素的值。如图3所示,虽然图3的数据结构是树形结构,也可以按照上述方法进行记录,可以获得如下三个一维数组ParentNum 数组PN
=0、PN [I] =1、PN [2] =2、PN [3] =2、PN [4] =2、PN [5] =1ParentNum数组表示第i个节点的上级节点的数目。例如,PN
=0表示编号为0的节点A的上级节点的数目为0 ;PN[3]=2表示编号为3的节点C2的上级节点的数目为2,即节点B和A ;ParentSeg 数组PS
=-1 ;PS[1]=0 ;PS[2]=1、PS[3] =0 ;PS[4]=1、PS[5] =0 ;PS [6] =1、PS [7] =0 ;PS[8]=0ParentSeg数组分段表示第i个节点的上级节点的编号。在图3中除了最顶端节点之外,每个节点有一个或两个上级节点,因此每个节点的上级节点的编号为一个或两个。例如,PS
=-1表示编号0的节点没有上级节点,PS[1]=0表示编号为I的节点的上级节点是编号为0的节点,PS[2] =1、PS[3] =0表示编号为2的上级节点是编号为I和0的节点,如
i^-L -rf- -rf- oParentSegStartIndex 数组PI
=0、PI [I] =1、PI [2] =2、PI [3] =4、PI [4] =6、PI[5]=8ParentSegStartIndex表示ParentSeg数组中每个节点的上级节点的分段开始的索引。例如,PI
=0表示ParentSeg数组中的编号0的节点的上级节点段的开始索引为0,即PS
为编号0的节点的上级节点段。每个节点可以有多个上级节点,并且每个节点的上级的编号在ParentSeg数组中是以分段的方式连续排列的,因此需要数组ParentSegStartIndex[i]来表示第i个节点的上级节点段的开始位置,也就是说,在ParentSeg 数组中 ParentSegStartIndex [i]至 ParentSegStartIndex [i+1]-I 之间的序列是第i个节点的上级节点的编号集合。PI[3]=4、PI[4]=6表示编号为3的节点的上级节点段在ParentSeg数组中为数组下标为4和5的数组表示的值,即PS [4] =1、PS [5] =0。这样可以通过三个一维数组来存储和描述节点之间的上级关系。步骤203,用至少一个一维数组表示每个节点的下级关系,根据特定的顺序,存储相应的数据。具体地,分级数据结构中,节点的下级关系包括每个节点所拥有的下级节点数和下级节点的编号。对于不同数据结构中节点的下级关系,用数组来表示时,所用的数组的数量是不同的。就树状结构而言,除最深层次的节点外,每个节点通常有一个或多个下级节点,由于根据每个节点的编号及对应的下级节点的数量,就可以算出每个节点对应的所有下级节点的编号。因此,可以只用一个一维数组来表示每个节点的下级关系,按照节点编号的顺序,将所述节点的下级节点数依次存入所述数组中,其中,所述数组的长度为节点的总数,即N。如对于编号为i的下级节点,其下级节点数为m (m>0),假设对节点进行编号的步骤是按照先序遍历规则进行依次编号的 ,则该节点i的下级节点是编号为i之后的m个节点,即,节点i的下级节点编号的集合是U+1,…,i+m}。因此为了描述和存储节点i的下级节点,不需要直接存储其下级节点的编号,而是存储其下级节点的数目即可计算出其下级节点的编号。参照图3,树状数据结构的节点数为6,按照先序遍历,各节点的编号依次为(T5,构造一个数组长度为6的数组,按照节点编号的顺序,依次将6个节点的下级节点数存入所述数组中,如编号为0的节点,其有5个下级节点,则将所述数组的第一个元素置为5,如编号为5的节点,其下级节点数为0,则将所述数组的第六个元素的值置为0,依次类推,将各节点的下级节点数依次存入到该数组中。就网状结构而言,其不同于树状结构,每个节点的下级关系更加复杂,如上文所述,设定遍历的顺序,依据遍历的顺序对各节点进行编号,节点的总数为N,编号的范围为(TN-1,至少用三个一维数组表示每个节点的下级关系,为了各节点下级关系的表示更加明确,可以构造用以表示节点的下级关系的数组。本实施例以三个一维数组为例,分别命名为ChildNum 数组、ChildSeg 和 ChildSegStartlndex。首先,计算每个节点的下级节点数,根据节点编号的顺序,将所述节点的下级节点数依次存入ChildNum数组,即ChildNum数组中,每个数组元素的值为各节点的下级节点数,由于需要记录N个节点的下级节点数,所以ChildNum数组的长度为N。存储每个节点的下级节点数后,为了明确各节点的下级节点编号,需要构造数组,顺序存储各节点的下级节点编号。设所构造的数组名为ChildSeg,根据节点编号的顺序,将各个节点的所有下级节点的编号分段存入ChildSeg数组,其中,所述段的数量等于具有下级节点的节点的数量,所述Chi IdSeg数组的长度为Chi IdNum数组中所有元素值的总和,也就是每个段中存入每个节点的所有下级节点的编号。对于没有下级节点的节点,由于其下级节点的数为0,不存在下级节点的编号,因此,该节点没有对应的内容存入Chi I dSeg数组。为了更快地在ChildSeg数组中查找各节点的上级节点的编号,需要建立一个类似索引的数据结构,于是,构造一个长度为N的ChildSegStartlndex数组,更好地查找各节点的下级节点的编号,其中,ChildSegStartlndex数组元素的值为ChildSeg数组中各段的下标值。例如,设节点的总数为N,各节点的下级节点的数量已经计算好,并且已经将该计算好的数值存入ChildNum数组中,构造整数变量index、i,其中,i的范围从O、,对index赋初值0,按照特定的顺序依次遍历编号为(TN-I的节点,对编号为i的节点,如果Chi I dNum [ i ]的值为0,也就是该节点没有下级节点,则在Chi I dSeg数组中不存入该节点对应的任何内容,并将ChildSegStartIndex[i]的值置为_1,否则
I)置 ChildSegStartlndex[i]=index ;2)ChildSeg[index]至 ChildSeg[index+ChildNum[i]_l]依次存储编号为 i 的节点的所有下级节点的编号;3)index+=ChildNum[i]。按照上述遍历的顺序,依次计算各节点对应的ChildSeg数组元素的值和ChildSegStartlndex 数组元素的值。如图3所示,虽然图3的数据结构是树形结构,也可以按照上述方法进行记录,可以获得如下三个一维数组 Chi I dNum 数组:CN
=5、CN [ I ] =3、CN [2] =0、CN [3] =0、CN [4] =0、CN [5] =0ChildNum数组表示第i个节点的下级节点的数目。例如,CN
=5表示编号为0的节点A的下级节点的数目为5个;CN[3]=0表示编号为3的节点C2的下级节点的数目为0 ;ChildSeg 数组CS
=1、CS [I] =2、CS [2] =3、CS [3] =4、CS [4] =5 ;CS [5] =2、CS [6] =3、CS [7] =4ChildSeg数组分段表示第i个节点的下级节点的编号。在图3中除了最末端节点之外,每个节点有多个下级节点,因此每个节点的下级节点的编号为多个。例如,CS
=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4] =5表示编号0的节点的下级节点是1、2、3、4、5 ;没有下级节点的可以不记录,如此等等。ChildSegStartlndex 数组Cl
=0、Cl [I] =5、C I [2] =NULL, Cl [3] =NULL,Cl[4]=NULL,Cl[5]=NULLChildSegStartlndex表示ChildSeg数组中每个节点的下级节点的分段开始的索引。例如,Cl
=0表示ChildSeg数组中的编号0的节点的下级节点段的开始索引为0,即CS
为编号0的节点的下级节点段。每个节点可以有多个下级节点,并且每个节点的下级的编号在ChildSeg数组中是以分段的方式连续排列的,因此需要数组ChildSegStartlndex[i]来表示第i个节点的下级节点段的开始位置,也就是说,在ChildSeg 数组中 ChildSegStartlndex [i]至 ChildSegStartlndex [i+1]-I 之间的序列是第i个节点的下级节点的编号集合。CI
=0、CI[1]=5表示编号为0的节点的下级节点段在ChildSeg数组中为数组下标为0和4的数组表示的值,即CS
=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4] =5 ;对于没有下级节点的节点 i,ChildSegStartlndex[i] =NULL,并且在ChildSeg数组并不存储该节点下级节点段。这样可以通过三个一维数组来存储和描述节点之间的下级关系。上面给出的通过一个或多个一维数组描述和存储节点之间的上下级关系的例子,应当知道还可以有多种变形方式来用一维数组描述这些上下级关系,例如,在上文的ParentNum数组和ChildNum数组中可以存储直接上级和直接下级节点的数目而不是存储所有上级节点和下级节点的总数。同理,在上文的ParentSeg数组和ChildSeg数组中对应地仅仅存储直接上级节点和直接下级节点的编号。这样可以减少存储节点关系所需的空间。步骤204,构造相应的数组,存储各节点的信息字段,并根据各节点特定时间段内的信息字段的变化情况,确定所构造的数组的次数。
具体地,特定时间段内,各节点所具有的信息字段可以变化,也可以固定不变。其中,不变的信息字段,如分类信息网站中,手机的品牌通常在一定的时间段内是没有更新的,这类信息更新速度的要求通常也不高,通常一个月内才更新一次,因此,可视为这类信息在一个月内是不变的。其中,变化的信息字段,如分类信息网站中,手机的品牌的当前发帖量和浏览量是时刻变化的,通常这类信息需要时刻更新。其中,变化的信息分为动态传入的信息和动态计算的信息,动态传入的信息是指从外部系统获取的信息,如特定的系统专门提供手机型号的当日发帖量,通过该系统传入手机型号的当日发帖量;动态计算的信息是指本系统计算出来的信息,如本系统所累计的所有手机品牌的当日发帖量,并从中找到当日发帖量最大的品牌。对于各节点特定时间段内不变的信息字段称为静态信息字段,用与所述信息字段的类别的等数量的一维数组表示,根据特定的顺序,存储相应的信息字段,其中,所述的一维数组在特定时间段内只构造一次,且长度均为节点的数量。
每个节点可包含多类特定时间段内不变的信息字段,如手机的品牌、上市时间。如图3所示,各节点的名称、上级节点的下标、下级节点数是固定不变的,则分别构造相应数 量的长度为节点数的一维数组,根据节点编号的顺序,依次存储所有节点的名称信息到名称数组,依次存储所有节点的上级(节点)的下标信息到上级(节点)的下标数组,依次存储所有节点的下级节点数到下级节点数数组,如上级(节点)的下标数组中,下标为0的数组元素的值为-1,下标为0的数组元素的值为O。对于上述特定时间段内不变的信息字段,特定时间段内只构造一次相应的数组。对于各节点特定时间段内变化的信息字段称为动态信息字段,另用与所述信息字段的类别的等数量的一维数组表示,根据特定的顺序,存储相应的信息字段,其中,在特定时间段内,每计算一次数据,构造一次所述的一维数组,且长度均为节点的数量。每个节点可包含多类特定时间段内变化的信息字段,如手机品牌的当日发帖量、浏览量。如图3所示,各节点的Dynamicvalue、result代表特定时间段内变化的信息字段,则分别构造相应数量的长度为节点数的数组,根据节点编号的顺序,依次存储所有节点的Dynamic value信息到Dynamic value数组,依次存储所有节点的result信息到result数组。对于上述特定时间段内变化的信息字段,特定时间段内,每计算一次数据,构造一次相应的数组。其中,典型的计算如遍历,通过上述方法构造完数组,并在数组中存入相应的数据后,遍历各个数组就可以得到该数组所表示的知识节点的结构和信息,时间复杂度为0 (N),其中,N表示该数组的长度。其中,对上述实施例中的节点的编号,可以构造一个一维数组,按照编号的顺序存储各节点的编号,也可以不构造一维数组。其中,对分级数据结构中的每个节点,可定义一个不随时间变化的值,如一个永久的编号,用一张哈希表记录该值与所述节点编号之间的映射关系该值和所述数组的下标
--对应,并建立一张哈希表,记录每个节点所定义的值和所述数组的下标--对应的映
射关系,当利用节点的字段查找节点时,可以通过哈希表或者现有技术中的倒排索引的方法来实现所述节点的查找,查找的时间复杂度更小。其中,对于各节点所含的特定时间段内变化的信息字段,可以在每次计算时,临时构造一份数组,也可以预先构造多份数组,作为多个线程之间的共享资源池。对于每次计算时,临时构造一份数组,所计算的空间开销为特定时间段内变化的信息字段所占的空间*线程数+特定时间段内不变的信息字段所占的空间;对于预先构造多份数组,所计算的空间开销为特定时间段内变化的信息字段所占的空间*份数+特定时间段内不变的信息字段所占的空间。无论是上述哪种方式,都小于现有技术中所计算的空间开销。与现有技术相比,本发明所提供的将分级数据结构转化成一维数组的方法具有以下优点I)本方法将分级数据结构各节点的关系、各节点所含的信息分情况构造相应的数组,对于特定时间段内不变的静态信息,可以只维护一份数据在多个线程间共享,只需要一次申请静态空间进行构造和存储即可;对于特定时间段内变化的动态信息,根据线程的数目可以在需要时临时申请动态空间构造多个副本或者申请静态空间固定生成多个副本供多线程使用。存储一个数据结构的副本所计算的空间复杂度为0 (N*D),其中,N为节点数量,D为各节点所含的信息字段。由于本发明用多个一维数组分别存储静态信息和动态信息的每个字段,即,每个字段对于一个一维数值。因此本发明的方法很容易将每个节点的静 态信息字段与动态信息字段分开存储。对于本发明的第一实施例,对静态信息字段Dl分配一份静态空间,对于M个线程临时为动态信息字段D2申请M份动态空间,则总共需要的空间是0 (N*D1+N*D2*M)。对于本发明的第二实施例,对静态信息字段Dl分配一份静态空间,同时为动态信息字段D2预先申请K份静态空间并构造K个副本,则总共需要的空间是0 (N*D1+N*D2*K)。这两种方法相对于现有技术来说不需要为静态信息字段存储多个副本,因此都节约了空间开销。2)本方法按照节点编号访问各节点,所计算的时间复杂度为0 (1),在访问时间方面相对于现有技术的访问时间O(IogN)也是大大节约了时间开销。3)根据本方法进行数据的计算时,节点个数越多被查找的次数越多,本方法查找节点的时间复杂度的优势越明显。虽然上文的实施例以一维数组为例来构造和存储分级数据结构,但是应当知道本发明不限于此,也可以用多维数组来存储和构造分级数据结构,只要将每个节点中表示节点之间关系的信息、每个节点的动态信息字段、每个节点的静态信息字段分为不同的数组存储即可实现本发明的部分目的。例如,可以将存储节点之间关系信息的数组称为关系数组,将存储每个节点的动态信息字段的数组称为动态数组,将存储每个节点的静态信息字段的数组称为静态数组。这三类数组可以是多维也可以是一维的数组,但是优选为一维数组,每个一维数组存储所有节点的其中一个字段的信息。这样当需要增加或减少一个字段时不需要修改所有静态数组或动态数组,而只需要增加或删除一个一维数组即可。以上所揭露的仅为本发明的一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
权利要求
1.一种数据结构的构造和存储方法,包括 对数据结构中的各个节点进行编号; 设置至少一个关系数组用于依次存储数据结构中所有节点的上下级关系信息; 设置至少一个动态数组用于依次存储数据结构中所有节点的动态信息字段;以及 设置至少一个静态数组用于依次存储数据结构中所有节点的静态信息字段。
2.根据权利要求I所述的方法,包括 设定遍历的顺序,根据遍历的顺序将数据结构中的节点依次编号; 用至少一个一维数组表示每个节点的上级关系; 用至少一个一维数组表示每个节点的下级关系; 用至少一个一维数组分别存储各节点的信息字段,所有节点的每个信息字段存储在一个一维数组中,其中将实时变化的动态信息字段存储在动态数组中,将非实时变化的静态信息字段存储在静态数组中。
3.根据权利要求I或2所述的方法,其中,所述数据结构是网状结构; 设置至少一个关系数组用于存储数据结构中所有节点的上下级关系信息的步骤包括如下步骤 设置至少三个一维上级数组表示每个节点的上级关系,所述三个数组包括第一上级数组、第二上级数组和第三上级数组; 计算每个节点的上级节点数,按照节点编号的顺序,将所述节点的上级节点数依次存入第一上级数组; 根据节点编号的顺序,将各个节点的所有上级节点的编号分段存入第二上级数组;根据节点编号的顺序,将所述第二上级数组每一段的起始下标存入第三上级数组;设置至少三个一维下级数组表示每个节点的下级关系,所述三个下级数组包括第四下级数组、第五下级数组和第六下级数组; 计算每个节点的下级节点数,根据节点编号的顺序,将所述节点的下级节点数依次存入第四下级数组; 根据节点编号的顺序,将各个节点的所有下级节点的编号分段存入第五下级数组; 根据节点编号的顺序,将所述第五下级数组每一段的起始下标存入第六下级数组。
4.根据权利要求I或2所述的方法,其中,所述数据结构是网状结构; 设置至少一个关系数组用于存储数据结构中所有节点的上下级关系信息的步骤包括如下步骤 设置至少三个一维上级数组表示每个节点的上级关系,所述三个数组包括第七上级数组、第八上级数组和第九上级数组; 计算每个节点的直接上级节点数,按照节点编号的顺序,将所述节点的直接上级节点数依次存入第七上级数组; 根据节点编号的顺序,将各个节点的直接上级节点的编号分段存入第八上级数组;根据节点编号的顺序,将所述第八上级数组每一段的起始下标存入第九上级数组;设置至少三个一维下级数组表示每个节点的下级关系,所述三个下级数组包括第十下级数组、第i^一下级数组和第十二下级数组; 计算每个节点的直接下级节点数,根据节点编号的顺序,将所述节点的直接下级节点数依次存入第十下级数组; 根据节点编号的顺序,将各个节点的直接下级节点的编号分段存入第十一下级数组; 根据节点编号的顺序,将所述第i^一下级数组每一段的起始下标存入第十二下级数组。
5.根据权利要求I或2所述的方法,其中,所述数据结构是树状结构; 按照先序遍历方式对所述数据结构中的节点进行编号; 设置至少一个关系数组用于存储数据结构中所有节点的上下级关系信息的步骤进一步包括如下步骤 设置一个一维上级数组表示每个节点的上级关系,根据节点编号的顺序,将各个节点的上级节点的编号存入所述一维上级数组; 设置一个一维下级数组表示每个节点的下级关系,根据节点编号的顺序,将各个节点的下级节点的总数存入所述一维下级数组。
6.根据权利要求1-5任一项所述的方法,其中,按照先序遍历的次序对数据结构中的节点进行遍历和编号。
7.根据权利要求1-5任一项所述的方法,其中,在构造数据结构时执行如下步骤 申请一份固定的静态空间用于存储所述静态数组; 根据使用该数据结构的线程数目申请多份动态空间用于存储所述动态数组的多个副本。
8.根据权利要求1-5任一项所述的方法,其中,在构造数据结构时执行如下步骤 申请一份固定的静态空间用于存储所述静态数组; 申请多份固定的静态空间用于存储所述动态数组的多个副本。
9.根据权利要求1-5任一项所述的方法,还包括 构造一个数组,按照所述节点编号的顺序存储各节点的编号。
10.根据权利要求1-3任一项所述的方法,对所述分级数据结构中的每个节点定义一个不随时间变化的值,并用哈希表记录该值与所述节点编号之间的映射关系,当利用节点的字段查找节点时,通过哈希表实现所述节点的查找。
全文摘要
本发明提供了一种数据结构的构造和存储方法,包括对数据结构中的各个节点进行编号;设置至少一个关系数组用于依次存储数据结构中所有节点的上下级关系信息;设置至少一个动态数组用于依次存储数据结构中所有节点的动态信息字段;以及设置至少一个静态数组用于依次存储数据结构中所有节点的静态信息字段。本发明提供的方法,极大地降低了数据操作的时间复杂度和空间复杂度。
文档编号G06F17/30GK102750328SQ201210173119
公开日2012年10月24日 申请日期2012年5月29日 优先权日2012年5月29日
发明者孙海涛, 崔金峰, 王志强 申请人:北京城市网邻信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1