CN102750328A - 一种数据结构的构造和存储方法 - Google Patents

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

Info

Publication number
CN102750328A
CN102750328A CN201210173119XA CN201210173119A CN102750328A CN 102750328 A CN102750328 A CN 102750328A CN 201210173119X A CN201210173119X A CN 201210173119XA CN 201210173119 A CN201210173119 A CN 201210173119A CN 102750328 A CN102750328 A CN 102750328A
Authority
CN
China
Prior art keywords
node
array
data structure
superior
subordinate
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201210173119XA
Other languages
English (en)
Other versions
CN102750328B (zh
Inventor
王志强
孙海涛
崔金峰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing City Network Neighbor Technology Co Ltd
Original Assignee
Beijing City Network Neighbor Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing City Network Neighbor Technology Co Ltd filed Critical Beijing City Network Neighbor Technology Co Ltd
Priority to CN201210173119.XA priority Critical patent/CN102750328B/zh
Publication of CN102750328A publication Critical patent/CN102750328A/zh
Application granted granted Critical
Publication of CN102750328B publication Critical patent/CN102750328B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种数据结构的构造和存储方法,包括:对数据结构中的各个节点进行编号;设置至少一个关系数组用于依次存储数据结构中所有节点的上下级关系信息;设置至少一个动态数组用于依次存储数据结构中所有节点的动态信息字段;以及设置至少一个静态数组用于依次存储数据结构中所有节点的静态信息字段。本发明提供的方法,极大地降低了数据操作的时间复杂度和空间复杂度。

Description

一种数据结构的构造和存储方法
技术领域
本发明涉及数据结构技术,尤其涉及一种数据结构的构造和存储方法。
背景技术
现实中,很多数据的逻辑结构呈树状或网状。树状结构中,元素之间存在一对多关系,网状结构中,元素之间存在多对多关系。比如,将信息进行分类就是一种典型的树状结构,每细分一次,就增加一级树的节点,树状结构中,所有节点的上级节点数只有1个。网状结构在现实中的最典型表现是社会中人与人之间的关系,这种关系不是按树的结构进行层级划分,而是错综复杂的,网状结构中,所有节点的上级节点数是0个或多个。通常来说,固定知识的结构在某一个时间段T内不变(知识节点总数为N),而允许知识节点的信息在时间段T是实时变化。在很多具体应用中,知识的结构的变化是可以接受延迟的,而知识的信息是需要时刻更新的。比如分类信息网站58同城的二手手机分类,定义的手机品牌有若干种,品牌又细分了若干种型号。手机品牌和型号就形成了一个典型的树状知识结构。通常维护人员每个月添加几个手机品牌。而这些品牌/型号时刻都有相关的发布和浏览。所以品牌/型号的当前发帖量及浏览量是时刻变化的。
对于树状或网状结构,各节点所含的信息分为静态信息和动态信息。静态信息在特定时间段内是固定不变的,比如某个手机型号的“名称”,“上市时间”。而动态信息会实时变化,动态信息又可以分为动态传入信息和动态计算信息。动态传入信息的变化是从外部系统获得的。比如有个系统专门提供手机型号的当日发帖量。动态计算信息的变化是需要本系统计算的。比如本系统要累计所有手机品牌的当日发帖量,然后从中找到当日发帖量最大的品牌。
参照图1,为常规树状结构的节点示意图。图中有5个节点,每个节点具有三个信息字段:name、dynamic_value、result。name字段表示节点名称,其是固定的不随时间而改变,属于静态信息。dynamic_value表示动态变化的数值,result为基于动态变化数值计算的结果。dynamic_value和result都是随时变化的,属于动态信息。
现有技术中,采用树状结构或网状结构存储各类数据并表示数据之间的相互关系时,存在三种方案:方案一,每次计算时,临时构造数据结构,然后在数据结构上计算,获得输出结果;方案二,预先构造好一份数据结构,每次计算时,清空节点的动态传入信息,动态计算信息,然后在数据结构上计算,获得输出结果;方案三,预先构造好多份数据结构,作为多个线程之间的共享资源池,每次计算时,清空节点的动态传入信息,动态计算信息,然后在数据结构上计算,获得输出结果。就方案一而言,每次计算都要构造数据结构,带来申请内存空间和构造树两方面的时间开销,并且当有多个线程都要用同一数据结构时,需要为每个线程都临时构造一个数据结构,从而带来存储多份数据结构的内存开销;就方案二而言,虽然只要构造一次数据结构,但是同一份数据结构不能用于多个线程的并发计算,而且查找树的时间开销较大;就方案三而言,虽然可以用于多个线程的并发计算,但是会带来固定存储多份数据结构的内存开销。
上述现有技术的对于二叉树来说,查找节点的时间开销都是O(logN),N为节点的总数。也就是说,查找节点的时间随节点数目增加成对数增长。因此,现有技术的分级数据结构的构造和存储方法在存储空间和查找时间方面的开销均比较大。
发明内容
本发明的目的是提供一种有效降低数据操作的空间复杂度和时间复杂度的方法,并适用于所有呈树状或网状的数据的数据结构构造和存储方法。
根据本发明的一个方面,提供了一种数据结构的构造和存储方法,包括:
对数据结构中的各个节点进行编号;
设置至少一个关系数组用于依次存储数据结构中所有节点的上下级关系信息;
设置至少一个动态数组用于依次存储数据结构中所有节点的动态信息字段;以及
设置至少一个静态数组用于依次存储数据结构中所有节点的静态信息字段。
与现有技术相比,本发明具有以下优点:
1)降低了数据操作的时间复杂度和空间复杂度;
2)基于本发明提供的方法,可以提供高性能的数据服务。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1为根据现有技术的树状结构的节点示意图;
图2为根据本发明一个优选实施例的数据结构构造和存储的方法流程图;以及
图3为根据本发明一个优选实施例的数据结构构造和存储的示意图。
具体实施方式
下面结合附图对本发明作进一步详细描述。
根据本发明的一个方面,提供了一种数据结构构造和存储的方法。
请参考图2,图2为根据本发明一个优选实施例的数据结构构造和存储的方法流程图。
如图2所示,根据本发明的数据结构构造和存储的方法包括如下:
步骤201,首先对分级数据结构中的各个节点编号,每个节点具有唯一的编号。进行编号的步骤可以包括对分级数据结构设定遍历的顺序,根据遍历的顺序将数据结构中的节点依次编号。设节点的总数为N,则编号的范围为0~N-1。
具体地,分级数据结构包括但不限定树状、网状的具有父子关系的数据结构,在分级数据结构中,除部分特殊的节点(如树状结构中,根节点没有父亲节点)外,各节点通常具有上级节点和下级节点。在数据结构中,遍历是一种很重要的计算,通过特定的搜索方式,对数据结构中的每个节点做一次且仅做一次访问。遍历分为前序遍历、中序遍历和后续遍历。
优选地,设遍历的顺序为先序遍历,根据遍历的顺序将分级数据结构中的节点依次编号。设分级数据结构中节点的总数为N,那么,节点编号的范围,为0~N-1。如图3所示,图3的左边所示的是一个树状的数据结构,该结构中节点的总数为6,根据先序遍历,依次访问A、B、C1、C2、C3、D节点,那么按照访问的顺序,依次对这6个节点编号,编号的范围为0~5,如首先访问的节点A对应的编号为0,最后访问的节点D对应的编号为5。
由于数据结构中节点的个数以及它们之间的关系是相对固定的,因此做完一次遍历操作后每个节点的编号都可以确定下来,并且在一段时间内保持不变。
在确定和存储节点编号之后,下面需要确定和存储具有编号的节点之间的相互关系或层级关系。
步骤202,至少用一个一维数组表示每个节点的上级关系,根据特定的顺序,存储相应的数据。
具体地,分级数据结构中,节点的上级关系包括每个节点所拥有的上级节点数和上级节点的编号。对于不同数据结构中节点的上级关系,用数组来表示时,所用的数组的数量是不同的。
就树状结构而言,除根节点外,每个节点有且只有一个上级节点,因此,可以只用一个一维数组来表示每个节点的上级关系,按照节点编号的顺序,将所述节点的上级节点的编号依次存入所述数组中,其中,所述数组的长度为节点的总数,即N。
参照图3,树状数据结构的节点数为6,按照先序遍历,各节点的编号依次为0~5,构造一个数组长度为6的数组,按照节点编号的顺序,依次将6个节点的上级节点的编号存入所述数组中,如编号为0的节点,其上级节点不存在,则将所述数组的第一个元素置为-1,如编号为5的节点,其上级节点的编号为0,则将所述数组的第六个元素的值置为0,依次类推,将各节点的上级节点的编号依次存入到该数组中。
就网状结构而言,每个节点可能有多个上级节点(树状结构可以认为是一种特殊的网状结构)如上文所述,设定遍历的顺序,依据遍历的顺序对各节点进行编号,节点的总数为N,编号的范围为0~N-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的范围从0~N,对index赋初值0,按照特定的顺序依次遍历编号为0~N-1的节点,对编号为i的节点,如果ParentNum[i]的值为0,也就是该节点没有上级节点,则在ParentSeg数组中不存入该节点对应的任何内容,并将ParentSegStartIndex[i]的值置为-1,否则:
1)置ParentSegStartIndex[i]=index;
2)ParentSeg[index]至ParentSeg[index+ParentNum[i]-1]依次存储编号为i的节点的所有上级节点的编号;
3)index=ParentNum[i]+index。
按照上述遍历的顺序,依次计算各节点对应的ParentSeg数组元素的值和ParentSegStartIndex数组元素的值。
如图3所示,虽然图3的数据结构是树形结构,也可以按照上述方法进行记录,可以获得如下三个一维数组:
ParentNum数组:PN[0]=0、PN[1]=1、PN[2]=2、PN[3]=2、PN[4]=2、PN[5]=1
ParentNum数组表示第i个节点的上级节点的数目。例如,PN[0]=0表示编号为0的节点A的上级节点的数目为0;PN[3]=2表示编号为3的节点C2的上级节点的数目为2,即节点B和A;
ParentSeg数组:PS[0]=-1;PS[1]=0;PS[2]=1、PS[3]=0;PS[4]=1、PS[5]=0;PS[6]=1、PS[7]=0;PS[8]=0
ParentSeg数组分段表示第i个节点的上级节点的编号。在图3中除了最顶端节点之外,每个节点有一个或两个上级节点,因此每个节点的上级节点的编号为一个或两个。例如,PS[0]=-1表示编号0的节点没有上级节点,PS[1]=0表示编号为1的节点的上级节点是编号为0的节点,PS[2]=1、PS[3]=0表示编号为2的上级节点是编号为1和0的节点,如此等等。
ParentSegStartIndex数组:PI[0]=0、PI[1]=1、PI[2]=2、PI[3]=4、PI[4]=6、PI[5]=8
ParentSegStartIndex表示ParentSeg数组中每个节点的上级节点的分段开始的索引。例如,PI[0]=0表示ParentSeg数组中的编号0的节点的上级节点段的开始索引为0,即PS[0]为编号0的节点的上级节点段。每个节点可以有多个上级节点,并且每个节点的上级的编号在ParentSeg数组中是以分段的方式连续排列的,因此需要数组ParentSegStartIndex[i]来表示第i个节点的上级节点段的开始位置,也就是说,在ParentSeg数组中ParentSegStartIndex[i]至ParentSegStartIndex[i+1]-1之间的序列是第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的下级节点编号的集合是{i+1,…,i+m}。因此为了描述和存储节点i的下级节点,不需要直接存储其下级节点的编号,而是存储其下级节点的数目即可计算出其下级节点的编号。
参照图3,树状数据结构的节点数为6,按照先序遍历,各节点的编号依次为0~5,构造一个数组长度为6的数组,按照节点编号的顺序,依次将6个节点的下级节点数存入所述数组中,如编号为0的节点,其有5个下级节点,则将所述数组的第一个元素置为5,如编号为5的节点,其下级节点数为0,则将所述数组的第六个元素的值置为0,依次类推,将各节点的下级节点数依次存入到该数组中。
就网状结构而言,其不同于树状结构,每个节点的下级关系更加复杂,如上文所述,设定遍历的顺序,依据遍历的顺序对各节点进行编号,节点的总数为N,编号的范围为0~N-1,至少用三个一维数组表示每个节点的下级关系,为了各节点下级关系的表示更加明确,可以构造用以表示节点的下级关系的数组。本实施例以三个一维数组为例,分别命名为ChildNum数组、ChildSeg和ChildSegStartIndex。
首先,计算每个节点的下级节点数,根据节点编号的顺序,将所述节点的下级节点数依次存入ChildNum数组,即ChildNum数组中,每个数组元素的值为各节点的下级节点数,由于需要记录N个节点的下级节点数,所以ChildNum数组的长度为N。
存储每个节点的下级节点数后,为了明确各节点的下级节点编号,需要构造数组,顺序存储各节点的下级节点编号。设所构造的数组名为ChildSeg,根据节点编号的顺序,将各个节点的所有下级节点的编号分段存入ChildSeg数组,其中,所述段的数量等于具有下级节点的节点的数量,所述ChildSeg数组的长度为ChildNum数组中所有元素值的总和,也就是每个段中存入每个节点的所有下级节点的编号。对于没有下级节点的节点,由于其下级节点的数为0,不存在下级节点的编号,因此,该节点没有对应的内容存入ChildSeg数组。
为了更快地在ChildSeg数组中查找各节点的上级节点的编号,需要建立一个类似索引的数据结构,于是,构造一个长度为N的ChildSegStartIndex数组,更好地查找各节点的下级节点的编号,其中,ChildSegStartIndex数组元素的值为ChildSeg数组中各段的下标值。例如,设节点的总数为N,各节点的下级节点的数量已经计算好,并且已经将该计算好的数值存入ChildNum数组中,构造整数变量index、i,其中,i的范围从0~N,对index赋初值0,按照特定的顺序依次遍历编号为0~N-1的节点,对编号为i的节点,如果ChildNum[i]的值为0,也就是该节点没有下级节点,则在ChildSeg数组中不存入该节点对应的任何内容,并将ChildSegStartIndex[i]的值置为-1,否则:
1)置ChildSegStartIndex[i]=index;
2)ChildSeg[index]至ChildSeg[index+ChildNum[i]-1]依次存储编号为i的节点的所有下级节点的编号;
3)index+=ChildNum[i]。
按照上述遍历的顺序,依次计算各节点对应的ChildSeg数组元素的值和ChildSegStartIndex数组元素的值。
如图3所示,虽然图3的数据结构是树形结构,也可以按照上述方法进行记录,可以获得如下三个一维数组:
ChildNum数组:CN[0]=5、CN[1]=3、CN[2]=0、CN[3]=0、CN[4]=0、CN[5]=0
ChildNum数组表示第i个节点的下级节点的数目。例如,CN[0]=5表示编号为0的节点A的下级节点的数目为5个;CN[3]=0表示编号为3的节点C2的下级节点的数目为0;
ChildSeg数组:CS[0]=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4]=5;CS[5]=2、CS[6]=3、CS[7]=4
ChildSeg数组分段表示第i个节点的下级节点的编号。在图3中除了最末端节点之外,每个节点有多个下级节点,因此每个节点的下级节点的编号为多个。例如,CS[0]=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4]=5表示编号0的节点的下级节点是1、2、3、4、5;没有下级节点的可以不记录,如此等等。
ChildSegStartIndex数组:CI[0]=0、CI[1]=5、C I[2]=NULL、CI[3]=NULL、CI[4]=NULL、CI[5]=NULL
ChildSegStartIndex表示ChildSeg数组中每个节点的下级节点的分段开始的索引。例如,CI[0]=0表示ChildSeg数组中的编号0的节点的下级节点段的开始索引为0,即CS[0]为编号0的节点的下级节点段。每个节点可以有多个下级节点,并且每个节点的下级的编号在ChildSeg数组中是以分段的方式连续排列的,因此需要数组ChildSegStartIndex[i]来表示第i个节点的下级节点段的开始位置,也就是说,在ChildSeg数组中ChildSegStartIndex[i]至ChildSegStartIndex[i+1]-1之间的序列是第i个节点的下级节点的编号集合。CI[0]=0、CI[1]=5表示编号为0的节点的下级节点段在ChildSeg数组中为数组下标为0和4的数组表示的值,即CS[0]=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4]=5;对于没有下级节点的节点i,ChildSegStartIndex[i]=NULL,并且在ChildSeg数组并不存储该节点下级节点段。
这样可以通过三个一维数组来存储和描述节点之间的下级关系。
上面给出的通过一个或多个一维数组描述和存储节点之间的上下级关系的例子,应当知道还可以有多种变形方式来用一维数组描述这些上下级关系,例如,在上文的ParentNum数组和ChildNum数组中可以存储直接上级和直接下级节点的数目而不是存储所有上级节点和下级节点的总数。同理,在上文的ParentSeg数组和ChildSeg数组中对应地仅仅存储直接上级节点和直接下级节点的编号。这样可以减少存储节点关系所需的空间。
步骤204,构造相应的数组,存储各节点的信息字段,并根据各节点特定时间段内的信息字段的变化情况,确定所构造的数组的次数。
具体地,特定时间段内,各节点所具有的信息字段可以变化,也可以固定不变。其中,不变的信息字段,如分类信息网站中,手机的品牌通常在一定的时间段内是没有更新的,这类信息更新速度的要求通常也不高,通常一个月内才更新一次,因此,可视为这类信息在一个月内是不变的。其中,变化的信息字段,如分类信息网站中,手机的品牌的当前发帖量和浏览量是时刻变化的,通常这类信息需要时刻更新。其中,变化的信息分为动态传入的信息和动态计算的信息,动态传入的信息是指从外部系统获取的信息,如特定的系统专门提供手机型号的当日发帖量,通过该系统传入手机型号的当日发帖量;动态计算的信息是指本系统计算出来的信息,如本系统所累计的所有手机品牌的当日发帖量,并从中找到当日发帖量最大的品牌。
对于各节点特定时间段内不变的信息字段称为静态信息字段,用与所述信息字段的类别的等数量的一维数组表示,根据特定的顺序,存储相应的信息字段,其中,所述的一维数组在特定时间段内只构造一次,且长度均为节点的数量。
每个节点可包含多类特定时间段内不变的信息字段,如手机的品牌、上市时间。如图3所示,各节点的名称、上级节点的下标、下级节点数是固定不变的,则分别构造相应数量的长度为节点数的一维数组,根据节点编号的顺序,依次存储所有节点的名称信息到名称数组,依次存储所有节点的上级(节点)的下标信息到上级(节点)的下标数组,依次存储所有节点的下级节点数到下级节点数数组,如上级(节点)的下标数组中,下标为0的数组元素的值为-1,下标为0的数组元素的值为0。
对于上述特定时间段内不变的信息字段,特定时间段内只构造一次相应的数组。
对于各节点特定时间段内变化的信息字段称为动态信息字段,另用与所述信息字段的类别的等数量的一维数组表示,根据特定的顺序,存储相应的信息字段,其中,在特定时间段内,每计算一次数据,构造一次所述的一维数组,且长度均为节点的数量。
每个节点可包含多类特定时间段内变化的信息字段,如手机品牌的当日发帖量、浏览量。如图3所示,各节点的Dynamicvalue、result代表特定时间段内变化的信息字段,则分别构造相应数量的长度为节点数的数组,根据节点编号的顺序,依次存储所有节点的Dynamicvalue信息到Dynamic value数组,依次存储所有节点的result信息到result数组。
对于上述特定时间段内变化的信息字段,特定时间段内,每计算一次数据,构造一次相应的数组。其中,典型的计算如遍历,通过上述方法构造完数组,并在数组中存入相应的数据后,遍历各个数组就可以得到该数组所表示的知识节点的结构和信息,时间复杂度为O(N),其中,N表示该数组的长度。
其中,对上述实施例中的节点的编号,可以构造一个一维数组,按照编号的顺序存储各节点的编号,也可以不构造一维数组。
其中,对分级数据结构中的每个节点,可定义一个不随时间变化的值,如一个永久的编号,用一张哈希表记录该值与所述节点编号之间的映射关系该值和所述数组的下标一一对应,并建立一张哈希表,记录每个节点所定义的值和所述数组的下标一一对应的映射关系,当利用节点的字段查找节点时,可以通过哈希表或者现有技术中的倒排索引的方法来实现所述节点的查找,查找的时间复杂度更小。
其中,对于各节点所含的特定时间段内变化的信息字段,可以在每次计算时,临时构造一份数组,也可以预先构造多份数组,作为多个线程之间的共享资源池。对于每次计算时,临时构造一份数组,所计算的空间开销为:特定时间段内变化的信息字段所占的空间*线程数+特定时间段内不变的信息字段所占的空间;对于预先构造多份数组,所计算的空间开销为:特定时间段内变化的信息字段所占的空间*份数+特定时间段内不变的信息字段所占的空间。无论是上述哪种方式,都小于现有技术中所计算的空间开销。
与现有技术相比,本发明所提供的将分级数据结构转化成一维数组的方法具有以下优点:
1)本方法将分级数据结构各节点的关系、各节点所含的信息分情况构造相应的数组,对于特定时间段内不变的静态信息,可以只维护一份数据在多个线程间共享,只需要一次申请静态空间进行构造和存储即可;对于特定时间段内变化的动态信息,根据线程的数目可以在需要时临时申请动态空间构造多个副本或者申请静态空间固定生成多个副本供多线程使用。存储一个数据结构的副本所计算的空间复杂度为O(N*D),其中,N为节点数量,D为各节点所含的信息字段。由于本发明用多个一维数组分别存储静态信息和动态信息的每个字段,即,每个字段对于一个一维数值。因此本发明的方法很容易将每个节点的静态信息字段与动态信息字段分开存储。对于本发明的第一实施例,对静态信息字段D1分配一份静态空间,对于M个线程临时为动态信息字段D2申请M份动态空间,则总共需要的空间是O(N*D1+N*D2*M)。对于本发明的第二实施例,对静态信息字段D1分配一份静态空间,同时为动态信息字段D2预先申请K份静态空间并构造K个副本,则总共需要的空间是O(N*D1+N*D2*K)。这两种方法相对于现有技术来说不需要为静态信息字段存储多个副本,因此都节约了空间开销。
2)本方法按照节点编号访问各节点,所计算的时间复杂度为O(1),在访问时间方面相对于现有技术的访问时间O(logN)也是大大节约了时间开销。
3)根据本方法进行数据的计算时,节点个数越多被查找的次数越多,本方法查找节点的时间复杂度的优势越明显。
虽然上文的实施例以一维数组为例来构造和存储分级数据结构,但是应当知道本发明不限于此,也可以用多维数组来存储和构造分级数据结构,只要将每个节点中表示节点之间关系的信息、每个节点的动态信息字段、每个节点的静态信息字段分为不同的数组存储即可实现本发明的部分目的。例如,可以将存储节点之间关系信息的数组称为关系数组,将存储每个节点的动态信息字段的数组称为动态数组,将存储每个节点的静态信息字段的数组称为静态数组。这三类数组可以是多维也可以是一维的数组,但是优选为一维数组,每个一维数组存储所有节点的其中一个字段的信息。这样当需要增加或减少一个字段时不需要修改所有静态数组或动态数组,而只需要增加或删除一个一维数组即可。
以上所揭露的仅为本发明的一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。

Claims (10)

1.一种数据结构的构造和存储方法,包括:
对数据结构中的各个节点进行编号;
设置至少一个关系数组用于依次存储数据结构中所有节点的上下级关系信息;
设置至少一个动态数组用于依次存储数据结构中所有节点的动态信息字段;以及
设置至少一个静态数组用于依次存储数据结构中所有节点的静态信息字段。
2.根据权利要求1所述的方法,包括:
设定遍历的顺序,根据遍历的顺序将数据结构中的节点依次编号;
用至少一个一维数组表示每个节点的上级关系;
用至少一个一维数组表示每个节点的下级关系;
用至少一个一维数组分别存储各节点的信息字段,所有节点的每个信息字段存储在一个一维数组中,其中将实时变化的动态信息字段存储在动态数组中,将非实时变化的静态信息字段存储在静态数组中。
3.根据权利要求1或2所述的方法,其中,所述数据结构是网状结构;
设置至少一个关系数组用于存储数据结构中所有节点的上下级关系信息的步骤包括如下步骤:
设置至少三个一维上级数组表示每个节点的上级关系,所述三个数组包括第一上级数组、第二上级数组和第三上级数组;
计算每个节点的上级节点数,按照节点编号的顺序,将所述节点的上级节点数依次存入第一上级数组;
根据节点编号的顺序,将各个节点的所有上级节点的编号分段存入第二上级数组;
根据节点编号的顺序,将所述第二上级数组每一段的起始下标存入第三上级数组;
设置至少三个一维下级数组表示每个节点的下级关系,所述三个下级数组包括第四下级数组、第五下级数组和第六下级数组;
计算每个节点的下级节点数,根据节点编号的顺序,将所述节点的下级节点数依次存入第四下级数组;
根据节点编号的顺序,将各个节点的所有下级节点的编号分段存入第五下级数组;
根据节点编号的顺序,将所述第五下级数组每一段的起始下标存入第六下级数组。
4.根据权利要求1或2所述的方法,其中,所述数据结构是网状结构;
设置至少一个关系数组用于存储数据结构中所有节点的上下级关系信息的步骤包括如下步骤:
设置至少三个一维上级数组表示每个节点的上级关系,所述三个数组包括第七上级数组、第八上级数组和第九上级数组;
计算每个节点的直接上级节点数,按照节点编号的顺序,将所述节点的直接上级节点数依次存入第七上级数组;
根据节点编号的顺序,将各个节点的直接上级节点的编号分段存入第八上级数组;
根据节点编号的顺序,将所述第八上级数组每一段的起始下标存入第九上级数组;
设置至少三个一维下级数组表示每个节点的下级关系,所述三个下级数组包括第十下级数组、第十一下级数组和第十二下级数组;
计算每个节点的直接下级节点数,根据节点编号的顺序,将所述节点的直接下级节点数依次存入第十下级数组;
根据节点编号的顺序,将各个节点的直接下级节点的编号分段存入第十一下级数组;
根据节点编号的顺序,将所述第十一下级数组每一段的起始下标存入第十二下级数组。
5.根据权利要求1或2所述的方法,其中,所述数据结构是树状结构;
按照先序遍历方式对所述数据结构中的节点进行编号;
设置至少一个关系数组用于存储数据结构中所有节点的上下级关系信息的步骤进一步包括如下步骤:
设置一个一维上级数组表示每个节点的上级关系,根据节点编号的顺序,将各个节点的上级节点的编号存入所述一维上级数组;
设置一个一维下级数组表示每个节点的下级关系,根据节点编号的顺序,将各个节点的下级节点的总数存入所述一维下级数组。
6.根据权利要求1-5任一项所述的方法,其中,按照先序遍历的次序对数据结构中的节点进行遍历和编号。
7.根据权利要求1-5任一项所述的方法,其中,在构造数据结构时执行如下步骤:
申请一份固定的静态空间用于存储所述静态数组;
根据使用该数据结构的线程数目申请多份动态空间用于存储所述动态数组的多个副本。
8.根据权利要求1-5任一项所述的方法,其中,在构造数据结构时执行如下步骤:
申请一份固定的静态空间用于存储所述静态数组;
申请多份固定的静态空间用于存储所述动态数组的多个副本。
9.根据权利要求1-5任一项所述的方法,还包括:
构造一个数组,按照所述节点编号的顺序存储各节点的编号。
10.根据权利要求1-3任一项所述的方法,对所述分级数据结构中的每个节点定义一个不随时间变化的值,并用哈希表记录该值与所述节点编号之间的映射关系,当利用节点的字段查找节点时,通过哈希表实现所述节点的查找。
CN201210173119.XA 2012-05-29 2012-05-29 一种数据结构的构造和存储方法 Active CN102750328B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210173119.XA CN102750328B (zh) 2012-05-29 2012-05-29 一种数据结构的构造和存储方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210173119.XA CN102750328B (zh) 2012-05-29 2012-05-29 一种数据结构的构造和存储方法

Publications (2)

Publication Number Publication Date
CN102750328A true CN102750328A (zh) 2012-10-24
CN102750328B CN102750328B (zh) 2018-08-10

Family

ID=47030513

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210173119.XA Active CN102750328B (zh) 2012-05-29 2012-05-29 一种数据结构的构造和存储方法

Country Status (1)

Country Link
CN (1) CN102750328B (zh)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103559323A (zh) * 2013-11-22 2014-02-05 盛杰 数据库实现方法
CN104239528A (zh) * 2014-09-19 2014-12-24 深圳市心讯网络科技有限公司 文件储存系统和文件储存路径记录方法
CN105389370A (zh) * 2015-11-13 2016-03-09 浙江工业大学 一种面向社交活动组织的时间聚合查询方法
CN105528461A (zh) * 2016-01-12 2016-04-27 北京中交兴路车联网科技有限公司 基于隶属关系的数据系统及方法
CN105704184A (zh) * 2014-11-28 2016-06-22 国网河南省电力公司南阳供电公司 一种基于层级框架的电网组织解析系统及解析方法
CN105740407A (zh) * 2016-01-28 2016-07-06 深圳市佳创视讯技术股份有限公司 树形结构生成方法及系统
CN106339450A (zh) * 2016-08-25 2017-01-18 成都索贝数码科技股份有限公司 一种树形数据的索引方法
CN109829474A (zh) * 2018-12-27 2019-05-31 北京邮电大学 一种电路图识别方法
CN111581215A (zh) * 2020-05-07 2020-08-25 钟士平 数组树数据储存方法、快速查找方法及可读储存介质
CN112785284A (zh) * 2020-12-31 2021-05-11 银清科技有限公司 基于结构化文档的报文入库方法及装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101409889A (zh) * 2008-11-03 2009-04-15 武汉虹信通信技术有限责任公司 一种直放站网管监控配置信息的存储方法
US20090234802A1 (en) * 2006-11-28 2009-09-17 S. Grants Co., Ltd. Coupled node tree splitting/conjoining method and program
CN102014282A (zh) * 2010-10-25 2011-04-13 深圳市融创天下科技发展有限公司 一种分布式视频转码调度方法及系统
CN102214086A (zh) * 2011-06-20 2011-10-12 复旦大学 基于多核处理器的通用并行加速算法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090234802A1 (en) * 2006-11-28 2009-09-17 S. Grants Co., Ltd. Coupled node tree splitting/conjoining method and program
CN101409889A (zh) * 2008-11-03 2009-04-15 武汉虹信通信技术有限责任公司 一种直放站网管监控配置信息的存储方法
CN102014282A (zh) * 2010-10-25 2011-04-13 深圳市融创天下科技发展有限公司 一种分布式视频转码调度方法及系统
CN102214086A (zh) * 2011-06-20 2011-10-12 复旦大学 基于多核处理器的通用并行加速算法

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103559323A (zh) * 2013-11-22 2014-02-05 盛杰 数据库实现方法
CN104239528A (zh) * 2014-09-19 2014-12-24 深圳市心讯网络科技有限公司 文件储存系统和文件储存路径记录方法
CN104239528B (zh) * 2014-09-19 2017-03-08 盛杰 文件储存系统和文件储存路径记录方法
CN105704184A (zh) * 2014-11-28 2016-06-22 国网河南省电力公司南阳供电公司 一种基于层级框架的电网组织解析系统及解析方法
CN105389370B (zh) * 2015-11-13 2018-05-22 浙江工业大学 一种面向社交活动组织的时间聚合查询方法
CN105389370A (zh) * 2015-11-13 2016-03-09 浙江工业大学 一种面向社交活动组织的时间聚合查询方法
CN105528461A (zh) * 2016-01-12 2016-04-27 北京中交兴路车联网科技有限公司 基于隶属关系的数据系统及方法
CN105740407A (zh) * 2016-01-28 2016-07-06 深圳市佳创视讯技术股份有限公司 树形结构生成方法及系统
CN106339450A (zh) * 2016-08-25 2017-01-18 成都索贝数码科技股份有限公司 一种树形数据的索引方法
CN106339450B (zh) * 2016-08-25 2019-08-06 成都索贝数码科技股份有限公司 一种树形数据的索引方法
CN109829474A (zh) * 2018-12-27 2019-05-31 北京邮电大学 一种电路图识别方法
CN109829474B (zh) * 2018-12-27 2020-12-22 北京邮电大学 一种电路图识别方法
CN111581215A (zh) * 2020-05-07 2020-08-25 钟士平 数组树数据储存方法、快速查找方法及可读储存介质
CN112785284A (zh) * 2020-12-31 2021-05-11 银清科技有限公司 基于结构化文档的报文入库方法及装置

Also Published As

Publication number Publication date
CN102750328B (zh) 2018-08-10

Similar Documents

Publication Publication Date Title
CN102750328A (zh) 一种数据结构的构造和存储方法
CN102915347B (zh) 一种分布式数据流聚类方法及系统
CN101916261B (zh) 一种分布式并行数据库系统的数据分区方法
Bonnet et al. Reduce, you say: What nosql can do for data aggregation and bi in large repositories
CN104281652B (zh) 度量空间中逐个支撑点数据划分方法
CN102298650B (zh) 一种海量数字信息的分布式推荐方法
CN109255055A (zh) 一种基于分组关联表的图数据存取方法和装置
CN104281701A (zh) 分布式多尺度空间数据查询方法及系统
CN102222100A (zh) 商品信息存取的方法及装置
CN104778237A (zh) 一种基于关键用户的个性化推荐方法和系统
JP2020522814A (ja) オンライン分析処理を行うためのデータ処理方法及び装置
Goasdoué et al. Incremental structural summarization of RDF graphs
Yang et al. An enhanced dynamic hash TRIE algorithm for lexicon search
Eldawy et al. The era of big spatial data: a survey
Kobza et al. Divergence measures on hesitant fuzzy sets
CN104933143A (zh) 获取推荐对象的方法及装置
CN102193988A (zh) 一种图形数据库节点数据的检索方法及系统
Chang et al. Spatio-temporal similarity measure algorithm for moving objects on spatial networks
Pokorný New database architectures: Steps towards big data processing
CN104036052A (zh) 一种基于历史经验的谓词索引匹配方法
CN104123321A (zh) 一种确定推荐图片的方法及装置
CN101609331B (zh) 一种适用于工业过程控制中的数据存储和读取方法
CN104794237B (zh) 网页信息处理方法及装置
WO2014152892A1 (en) In-database connectivity components analysis of data
Fu et al. ICA: an incremental clustering algorithm based on OPTICS

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant