发明名称 一种面向社交活动组织的时间聚合查询方法
摘要 .一种面向社交活动组织的时间聚合查询方法,包括下列步骤:步骤1.建立索引结构SB*-Tree;步骤2、SB*-Tree的具体操作;步骤3.查询,具体包括获取参与时间区间、获得候选方案、最优方案选择。本发明为了能够更有效地解决“确定聚会时间难”的问题,基于现有的SB-Tree,对它的结构进行拓展,提出了一种新的索引结构和查询技术,能够有效地解决上述提出的三个问题。本发明最终实现的功能是能够根据参与人员自己提交的意向时间,为聚会活动提供最优的举办时间,能够保证最多的人员参加活动。而人数的计算采用count聚合函数。
申请公布号 CN105389370A 申请公布日期 2016.03.09
申请号 CN201510779130.4 申请日期 2015.11.13
申请人 浙江工业大学 发明人 曹斌;侯晨煜;范菁
分类号 G06F17/30(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 杭州天正专利事务所有限公司 33201 代理人 王兵;黄美娟
主权项 一种面向社交活动组织的时间聚合查询方法,包括下列步骤:步骤1.建立索引结构SB*‑Tree针对SB‑Tree进行拓展,建立SB*‑Tree树形数据结构;SB*‑Tree与SB‑Tree不同的是:SB*‑Tree中每个时间区间N.I<sub>i</sub>增加了其对应的参与人员ID的集合N.s<sub>i</sub>;SB*‑Tree树包含一个最大分支因子b和最大叶子容量l;SB*‑Tree的中间节点最大能够包括b个时间区间,叶子节点最多能够包括l个时间区间,它们共同决定了SB*‑Tree的布局;关于SB*‑Tree的结构的详细描述如下:首先,表1列举了结构中使用的符号,如下所示:<img file="FDA0000846268570000011.GIF" wi="1750" he="717" />表1符号列表1.1中间节点:每个中间节点有三层结构,分别为N.t<sub>i</sub>、N.v<sub>i</sub>、N.s<sub>i</sub>,另外还有一个指向子树的指针N.c<sub>i</sub>;每个中间节点最多能够表示b个连续的时间区间,并且要保证该节点至少是半满的,即至少表示<img file="FDA0000846268570000013.GIF" wi="47" he="125" />个时间区间;假设一个中间节点N表示了j个时间区间,分别为N.I<sub>1</sub>,N.I<sub>2</sub>,N.I<sub>3</sub>,……,N.I<sub>j</sub>;节点中存储了j‑1个不同的时间点,分别为N.t<sub>1</sub>,N.t<sub>2</sub>,N.t<sub>3</sub>,……,N.t<sub>j‑1</sub>;其中N.t<sub>i</sub>表示第i个区间的结束时间,也是i+1个区间的开始时间;同时每个时间区间N.I<sub>i</sub>都有对应的参与人数N.v<sub>i</sub>,参与人员的ID的集合N.s<sub>i</sub>和指向下一个子节点的指针N.c<sub>i</sub>;1.2叶子节点叶子节点最多能够表示l个连续的时间区间,并且必须至少表示<img file="FDA0000846268570000012.GIF" wi="52" he="126" />个时间区间;其结构与中间节点类似,也有三层结构,分别为N.t<sub>i</sub>、N.v<sub>i</sub>、N.s<sub>i</sub>,只是没有指向下一个子节点的指针;1.3根节点根节点的结构与中间节点相同,同时最多能够表示b个连续的时间区间,但是最少只要表示2个时间区间即可;1.4节点性质对于每个非叶子节点N,所有在以N.c<sub>i</sub>为根的节点中的瞬时时间点都要严格小于N.t<sub>i</sub>,同时以N.c<sub>i+1</sub>为根的节点中的所有瞬时时间点都要严格大于N.t<sub>i</sub>;步骤2、SB*‑Tree的具体操作2.1区间定义:考虑第i个时间区间N.I<sub>i</sub>,N.I<sub>i</sub>的开始时间记为start(N.I<sub>i</sub>),结束时间记为end(N.I<sub>i</sub>);2.1.1 start(N.I<sub>i</sub>)的取值如下:如果i&gt;1,start(N.I<sub>i</sub>)=N.t<sub>i‑1</sub>;如果i=1且N为根节点,start(N.I<sub>i</sub>)=‑∞;如果i=1且N有父节点N′,而且N′的第k个指针指向N,即N′.c<sub>k</sub>=N,则start(N.I<sub>i</sub>)=start(N′.I<sub>k</sub>)2.1.2 end(N.I<sub>i</sub>)的取值如下:如果i&lt;j,end(N.I<sub>i</sub>)=N.t<sub>i</sub>;如果i=j且N为根节点,end(N.I<sub>i</sub>)=+∞;如果i=j且N有父节点N′,而且N′的第k个指针指向N,即N′.c<sub>k</sub>=N,则end(N.I<sub>i</sub>)=end(N′.I<sub>k</sub>);2.1.3区间的定义如下:如果start(N.I<sub>i</sub>)≠‑∞,则区间表示为[start(N.I<sub>i</sub>),end(N.I<sub>i</sub>))如果start(N.I<sub>i</sub>)=‑∞,则区间表示为(‑∞,end(N.I<sub>i</sub>))2.2插入:假设插入一条记录&lt;I,name&gt;,name表示用户的唯一标识,I表示用户的空闲时间;我们调用过程Insert(N,&lt;I,name&gt;)来完成插入操作,Insert(N,&lt;I,name&gt;)表示向以N为根的子树中插入&lt;I,name&gt;;Insert(N,&lt;I,name&gt;)的具体操作为:对于所有满足<img file="FDA0000846268570000021.GIF" wi="268" he="71" />的i,(1)如果<img file="FDA0000846268570000022.GIF" wi="192" he="71" />那么其区间对应的参与人数加1,参与人员集合添加该name(2)如果<img file="FDA0000846268570000023.GIF" wi="181" he="67" />且N是叶子节点,则将要插入的记录添加到该节点,修改相应值;(3)如果<img file="FDA0000846268570000024.GIF" wi="172" he="70" />且N不是叶子节点,调用过程Insert(N.c<sub>i</sub>,&lt;I,name&gt;);2.3删除:假设删除一条记录&lt;I,name&gt;,name表示用户的唯一标识,I表示用户的空闲时间;删除操作与插入操作类似,我们记为delete(N,&lt;I,name&gt;)具体操作如下:对于所有满足<img file="FDA0000846268570000031.GIF" wi="270" he="70" />的i,(1)如果<img file="FDA0000846268570000032.GIF" wi="181" he="70" />那么该区间对应的参与人数减1,参与人员集合删除该name;(2)如果<img file="FDA0000846268570000033.GIF" wi="182" he="63" />且N是叶子节点,则在该节点删除相应信息;(3)如果<img file="FDA0000846268570000034.GIF" wi="184" he="63" />且N不是叶子节点,调用过程delete(N.c<sub>i</sub>,&lt;I,name&gt;);2.4节点分裂:之前提到每个节点都有最大的容量,所以当该节点表示的时间区间过多时,就会导致溢出,此时需要进行节点分裂操作;因为插入的时间区间都是添加到叶子节点的,所以首先是叶子节点会发生溢出;当叶子节点执行完分裂操作后,可能会导致其父节点溢出,则进行父节点的分裂操作;假设当节点N发生溢出时包含了n个时间区间,则当N为叶子节点时,n=l+1或n=l+2;当N为非叶子节点时,n=b+1;将节点N的分裂过程记为split(N),具体操作如下:241)将节点N分裂成N<sub>1</sub>和N<sub>2</sub>242)N<sub>1</sub>包含前一半的区间,即N<sub>1</sub>包含N.t<sub>1</sub>,……,<img file="FDA0000846268570000035.GIF" wi="119" he="111" />以及对应的参与人数N.v<sub>1</sub>,……,<img file="FDA0000846268570000036.GIF" wi="112" he="110" />和参与人员集合N.s<sub>1</sub>,……,<img file="FDA0000846268570000037.GIF" wi="150" he="111" />如果N不是叶子节点,N<sub>1</sub>还要包含N.c<sub>1</sub>……,<img file="FDA0000846268570000038.GIF" wi="110" he="110" />243)N<sub>2</sub>包含剩余的区间,即N<sub>2</sub>包含<img file="FDA0000846268570000039.GIF" wi="164" he="110" />……,N.t<sub>n‑1</sub>以及对应的参与人数<img file="FDA00008462685700000310.GIF" wi="172" he="110" />……,N.v<sub>n</sub>和参与人员集合<img file="FDA00008462685700000311.GIF" wi="173" he="110" />……,N.s<sub>n</sub>如果N不是叶子节点,N<sub>2</sub>还要包含<img file="FDA00008462685700000312.GIF" wi="172" he="107" />……,N.c<sub>n</sub>244)如果N是根节点,那么创建一个新的根节点N<sub>root</sub>,其中<img file="FDA00008462685700000313.GIF" wi="316" he="109" />并且指向N<sub>1</sub>和N<sub>2</sub>245)如果N不是根节点,假设N有父节点N',并且N′.c<sub>j</sub>=N,则前j‑1个区间保持不变,从第j+1个区间到最后的区间往右移一位;再令<img file="FDA00008462685700000314.GIF" wi="277" he="111" />N′.c<sub>j</sub>=N<sub>1</sub>,N′.c<sub>j+1</sub>=N<sub>2</sub>如果N′溢出,则调用split(N′)2.5区间合并和节点合并当发生插入或者删除操作后,可能会出现两个相邻区间的参与人数是相同的并且参与人员都相同的情况,这时就需要将两个相邻区间进行合并;区间合并分为两种情况:(251)两个相邻的区间在同一个叶子节点中,假设它们分别为N.I<sub>j</sub>和N.I<sub>j+1</sub>,那么有N.v<sub>j</sub>=N.v<sub>j+1</sub>,N.s<sub>j</sub>=N.s<sub>j+1</sub>,后进行如下操作:2511)删除N.t<sub>j</sub>,N.v<sub>j+1</sub>和N.s<sub>j+1</sub>2512)从第j+2个区间到最后的区间往前移一位2513)如果节点N经过合并后包含的区间少于<img file="FDA0000846268570000041.GIF" wi="126" he="142" />调用nmerge(N)(252)两个相邻的区间在两个相邻的叶子节点中,因为这种情况比较复杂,且不容易出现,暂不作考虑;区间合并后,可能会使叶子节点达不到半满状态,此时需要进行节点合并来防止这种情况发生;节点合并的策略是:如果非根节点没有达到半满状态,首先从包含时间数量超过容量一般的相邻节点中移动一个时间区间到该节点;如果不存在这样的有“多余”时间区间的节点,那么就将该节点与其相邻的节点进行合并;记节点合并的过程为nmerge(N),具体操作如下:2521)如果N是根节点并且N有且仅有1个子节点,那么将N.c<sub>1</sub>作为新的根,删除原来的根节点N2522)如果N不是根节点,假设N最多能够包含n个时间区间(如果N是叶子节点,n=l;如果N是非叶子节点,n=b);现在N包含了<img file="FDA0000846268570000042.GIF" wi="150" he="143" />个时间区间,接下来判断N的兄弟节点的情况;2523)如果N的右边兄弟节点N<sub>right</sub>包含了至少<img file="FDA0000846268570000043.GIF" wi="160" he="139" />个时间区间,那么就把N<sub>right</sub>的第一个区间添加到N中去;2524)如果N的左边兄弟节点N<sub>left</sub>包含了至少<img file="FDA0000846268570000044.GIF" wi="151" he="142" />个时间区间,那么就将N<sub>left</sub>的最后一个区间添加到N开头中去;2525)进行两个节点的合并;假设这两个节点分别为N<sub>1</sub>和N<sub>2</sub>,N<sub>1</sub>为左节点,N<sub>2</sub>为右节点;假设N<sub>1</sub>包含j<sub>1</sub>个时间区间,N<sub>2</sub>包含j<sub>2</sub>个时间区间;j<sub>1</sub>和j<sub>2</sub>中其中一个为<img file="FDA0000846268570000045.GIF" wi="299" he="141" />假设N<sub>p</sub>是N<sub>1</sub>和N<sub>2</sub>共同的父节点,并且N<sub>p</sub>.c<sub>k</sub>=N<sub>1</sub>,N<sub>p</sub>.c<sub>k+1</sub>=N<sub>2</sub>,将N<sub>1</sub>和N<sub>2</sub>合并为一个新的区间N<sub>new</sub>,N<sub>new</sub>包含了j<sub>1</sub>+j<sub>2</sub>个时间区间,并删除N<sub>1</sub>和N<sub>2</sub>;在N<sub>p</sub>中,将N<sub>p</sub>.I<sub>k</sub>和N<sub>p</sub>.I<sub>k+1</sub>合并成一个区间,并指向N<sub>new</sub>;如果节点N<sub>p</sub>包含的区间少于<img file="FDA0000846268570000046.GIF" wi="117" he="149" />调用nmerge(N<sub>p</sub>)步骤3.查询为了获得活动组织的最优时间结果,需要进行三个步骤的操作:3.1获取参与时间区间这一步中,通过遍历SB*‑Tree,可以得到所有时间区间以及对应的参与人数和参与人员(统称为区间信息);遍历的方法为:从树的根节点出发,沿路径遍历到每一个叶子节点;当沿一条路径遍历到一个叶子节点N<sub>leaf</sub>时,沿从根节点到叶子节点的路径,将路径上每个节点上节点N对应某一特定的N.v<sub>t</sub>和N.s<sub>t</sub>都加到叶子节点N<sub>leaf</sub>的所有N<sub>leaf</sub>.v<sub>i</sub>和N<sub>leaf</sub>.s<sub>i</sub>上,其中t由路径确定。然后输出所有区间N<sub>leaf</sub>.I<sub>i</sub>,N<sub>leaf</sub>.v<sub>i</sub>,N<sub>leaf</sub>.s<sub>i</sub>3.2获得候选方案根据第一步得到的时间区间可能不满足最小持续时间duration;所以为了得到满足活动最小持续时间duration的候选方案,需要对遍历SB*‑Tree树得到的时间区间信息进行判断和调整,将区间大小小于duration的区间与相邻区间进行合并,使新的区间能够满足duration;具体操作如下:假设遍历SB*‑Tree后得到了m个时间区间,分别为I<sub>1</sub>,I<sub>2</sub>,…,I<sub>m</sub>,它们按从小到大的顺序排列;每个区间I<sub>i</sub>对应着它的区间信息:参与人数I<sub>i</sub>.V和参与人员I<sub>i</sub>.S;i=1开始:如果I<sub>i</sub>的大小≥duration,直接输出I<sub>i</sub>,I<sub>i</sub>.V和I<sub>i</sub>.S;如果I<sub>i</sub>的大小&lt;duration,则与后面的区间进行合并,直到合并的新区间的大小满足duration;3.3最优方案选择通过第二步得到所有候选方案后,根据快速排序将所有方案按照人数从多到小进行排序,返回最优的时间方案;同时根据用户需要,也可以返回TopK的方案。
地址 310014 浙江省杭州市下城区潮王路18号