著录项信息
专利名称 | 数据库和数据库处理方法 |
申请号 | CN200810149667.2 | 申请日期 | 2008-09-16 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2009-03-18 | 公开/公告号 | CN101388030 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/30 | IPC分类号 | G;0;6;F;1;7;/;3;0查看分类表>
|
申请人 | 数据连接有限公司 | 申请人地址 | 英国米德尔塞克斯郡
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 迈塔斯威士网络有限公司 | 当前权利人 | 迈塔斯威士网络有限公司 |
发明人 | 乔纳森·理查德·伯杰;高文·博斯沃思;戴维·爱德华·麦沃尔特 |
代理机构 | 北京康信知识产权代理有限责任公司 | 代理人 | 余刚;尚志峰 |
摘要
本发明提出了一种使用搜索关键字搜索数据库的方法、将数据存储到数据库中的方法、在数据通信网络中路由数据包的方法、以及适于执行本发明第一、第二以及第三方面的方法的设备和计算机软件。使用搜索关键字搜索数据库的方法包括:将关于第一节点的第一关联数据以及关于第二节点的第二关联数据存储在该数据库中,该第一关联数据包括第一节点关键字,以及该第二关联数据包括第二节点关键字,其中,第一节点关键字是第二节点关键字的前缀;以及使用搜索关键字搜索该树结构,其中,使用该搜索关键字的搜索涉及正被遍历的第二节点,以及如果第一节点关键字具有匹配该搜索关键字的前缀,则在遍历第二节点之后识别该第一节点。
1.一种使用搜索关键字搜索数据库的方法,所述数据库包含按照树结构来存储的数据,所述树结构包括多个节点,所述节点具有相关联的数据,所述相关联的数据包括:
一个或多个节点指针,所述节点指针包括识别在搜索所述树结构时可以被遍历的节点的数据;
节点关键字;以及
搜索关键字部分标识符,识别搜索关键字部分,所述搜索关键字部分将被用于确定在遍历节点时将被使用的节点指针,
其中,所述方法包括:
将关于第一节点的第一相关联数据和关于第二节点的第二相关联数据存储在所述数据库中,所述第一相关联数据包括第一节点关键字以及与所述树中的所述第一节点之上的节点的搜索关键字部分标识符相同的给定搜索关键字部分标识符,并且所述第二相关联数据包括第二节点关键字,其中,所述第一节点关键字与所述第二节点关键字的初始部分相匹配;
将第三数据存储在所述数据库中,所述第三数据指示所述第一节点关键字与所述第二节点关键字的初始部分相匹配,所述第三数据包括从所述第二节点指向所述第一节点的第一节点指针;以及
使用搜索关键字搜索所述树结构,
其中,使用所述搜索关键字的搜索包括遍历所述第二节点,并且如果所述第一节点关键字具有匹配所述搜索关键字的初始部分,则在遍历所述第二节点之后通过跟随从所述第二节点指向所述第一节点的所述第一节点指针来识别所述第一节点。
2.根据权利要求1所述的方法,包括:在遍历所述第二节点期间,将所述第二节点关键字与所述搜索关键字进行比较。
3.根据权利要求1所述的方法,其中,所述识别所述第一节点包括:在所述遍历所述第二节点之后但在随后的所述遍历所述第一节点之前,遍历所述树结构中所述第一节点之上的一个或多个节点。
4.根据权利要求1所述的方法,其中,特定节点的搜索关键字部分标识符涉及搜索关键字位,所述搜索关键字位将被用于确定在遍历所述特定节点时将被使用的节点指针。
5.根据权利要求4所述的方法,其中,所述特定节点的搜索关键字部分标识符涉及将被使用的搜索关键字位与先前被使用的搜索关键字位相比的相对位置。
6.根据权利要求4所述的方法,其中,所述特定节点的搜索关键字部分标识符涉及将被使用的搜索关键字位的绝对位置。
7.根据权利要求1所述的方法,包括:存储与所述多个节点中的一个或多个节点相关联的数据参数。
8.根据权利要求7所述的方法,其中,所述树结构的搜索结果包括输出所存储的数据参数。
9.根据权利要求1所述的方法,其中,所述搜索包括:使用基本上类似于Patricia算法的算法进行搜索。
10.一种将数据存储到数据库中的方法,所述数据库包含按照树结构来存储的数据,所述树结构包括多个节点,所述节点具有相关联的数据,所述相关联的数据包括:
一个或多个节点指针,所述节点指针包括识别在搜索所述树结构时可以被遍历的节点的数据;
节点关键字;
搜索关键字部分标识符,识别搜索关键字部分,所述搜索关键字部分将被用于确定在遍历节点时将被使用的节点指针,
其中,所述方法包括将新节点插入到所述树结构中,所述新节点具有相关联的节点关键字,所述插入包括:
使用插入搜索关键字来搜索所述数据库,所述插入搜索关键字包括所述新节点关键字,使用所述插入搜索关键字的所述搜索识别所述树结构中的给定节点,所述给定节点的节点关键字与所述插入搜索关键字具有给定的初始部分匹配关系;
以与识别的所述给定节点最近的关系将所述新节点插入到所述树结构中;以及向所述新节点分配:
一个或多个节点指针,所述一个或多个节点指针包括从所述新节点指向所述树中的所述新节点之上的节点的指针,所述新节点之上的节点的节点关键字与所述新节点的节点关键字的初始部分相匹配,
等于所述插入搜索关键字的节点关键字,以及
等于所述树中的所述新节点之上的节点的搜索关键字部分标识符的搜索关键字部分标识符。
11.根据权利要求10所述的方法,其中,所述给定的初始部分匹配关系包括:所述插入搜索关键字与识别的所述给定节点的节点关键字的初始部分相匹配。
12.根据权利要求10或11所述的方法,其中,所述最近的关系包括将所述新节点插入到所述树中的识别的所述给定节点之上。
13.根据权利要求10所述的方法,包括:将先前指向识别的所述给定节点的节点指针调整为指向所述新节点。
14.根据权利要求10所述的方法,包括:创建从所述新节点至识别的所述给定节点的节点指针。
15.根据权利要求10所述的方法,其中,所述给定的初始部分匹配关系包括:识别的所述给定节点关键字的节点关键字与所述插入搜索关键字的初始部分相匹配。
16.根据权利要求10所述的方法,其中,所述最近的关系包括将所述新节点插入到所述树中的识别的所述给定节点之下。
17.根据权利要求10所述的方法,包括:将先前从识别的所述给定节点指出来的节点指针调整为指向所述新节点。
18.根据权利要求10所述的方法,包括:在所述树中创建从所述新节点至所述新节点之下的节点的节点指针。
19.根据权利要求10所述的方法,包括:在所述树中创建从所述新节点至所述新节点之上的节点的节点指针,所述新节点之上的节点的节点关键字与所述新节点的节点关键字的初始部分相匹配。
20.根据权利要求19所述的方法,其中,所创建的指向所述树中的所述新节点之上的节点的所述指针指向这样的节点,该节点的节点关键字具有与所述树中的所述新节点之上的节点中的所述新节点的节点关键字相匹配的最长匹配初始部分。
21.根据权利要求10所述的方法,包括:将从所述新节点指出来的指针调整为指向根节点,所述根节点具有空节点关键字。
22.根据权利要求10所述的方法,包括:通过反转将所述新节点插入到所述树结构中所涉及的一个或多个步骤来从所述树结构中去除所述新节点。
23.一种在数据通信网络中路由数据包的方法,所述方法包括:
接收与所述数据通信网络中的路由相关联的路由数据;
使用与接收到的所述路由数据相关联的搜索关键字来搜索数据包路由数据库,根据权利要求1来搜索所述数据包路由数据库;
基于所述搜索所述数据包路由数据库,将与所述路由相关联的数据存储到所述数据包路由数据库中。
24.根据权利要求23所述的方法,其中,所述路由是所述网络中的新路由,以及所述数据存储包括对应于所述新路由来将新节点插入到所述数据包路由数据库中。
25.根据权利要求23所述的方法,其中,所述路由是所述网络中的现有路由,以及所述数据存储包括修改所述数据包路由数据库中与所述现有路由相关联的数据。
26.根据权利要求23所述的方法,包括:将与所述路由相关联的路由数据和/或转发信息输出到数据包转发表。
27.根据权利要求26所述的方法,其中,所述路由数据和/或所述转发信息包括网际协议(IP)地址数据。
28.一种适于执行权利要求1所述的方法的设备。
29.一种适于执行权利要求10所述的方法的设备。
30.一种适于执行权利要求23所述的方法的设备。
数据库和数据库处理方法\n技术领域\n[0001] 本发明涉及数据库和用于在数据库树结构中存储和搜索数据的方法。特别地,但不排他地,本发明涉及对存储在数据库树结构中的数据的处理,供数据包路由应用程序之用。\n背景技术\n[0002] 网际协议(IP)网络包括许多互连路由器实体,其负责作出关于数据包可以从源流到目的地的那些路径的决定。路由协议被用于获取关于网络的信息,并确定特定网络目的地或不同区域或该网络的子网络之间的路由。在每个路由器处,可以将这些路由存储在被称为路由表的数据库中。创建和维护路由表内容的过程通常被称作为IP路由。\n[0003] 路由器还可以存储执行转发数据库中的数据包所必须的信息,其通常被称作为转发表。使用存储在转发表中的信息接收数据包并将该数据包发送到其目的地上的处理通常被称作为IP转发。\n[0004] 通常不直接将路由表用在包转发处理中。而是,包路由处理根据路由信息和一个或多个路由协议(诸如路由选择信息协议(RIP)或边界网关协议(BGP))将关于所选路由的数据输出到转发表。然后,可以(例如)使用有效的硬件实现方式在包转发过程期间访问转发表的内容。\n[0005] 被传输到IP网络中的数据包将包括IP目的地址。IPv4地址是32位长,其给出了超过40亿的IP地址的范围,而IPv6地址更长。在每个路由器处为这个数目的IP地址交换和更新转发信息通常是不切实际的。\n[0006] 代替地,路由器将通常地维护包含许多IP地址前缀条目和对应于这些前缀条目的每一个的转发信息的转发表。当关于网络目的地址的信息到达路由器时,可以由该路由器检查网络目的地的IP地址,然后,该路由器可以搜索其路由表,查找对网络目的地的IP目的地址的最长的匹配。该最长的匹配按照匹配目的IP地址的最长前缀的形式出现,即,具有匹配IP网络地址的最大数目的初始位的路由。这被称作为‘最长前缀匹配’。\n[0007] 然后,路由器可以将该信息输出到转发表,从而当该目的地址的数据包到达该路由器时,可以使用包含在转发表中的转发信息通过该路由器中的包转发功能或模块转发这些数据包。可以按照所需的频率来重复包转发处理,可以将数据包从一个路由器转发到另一个路由器,直到其到达期望的IP目的地址。\n[0008] 通常地,将IPv4地址表示为通过小数点所分隔的一连串的四个十进制数。每个十进制数代表32位IPv4地址的八个位,从而每个十进制数处于从零至255的范围。\n[0009] 前缀指的是IP地址或其初始部分。使用IPv4,例如“192.168/16”是\n“192.168.1.4”、“192.168.200.200”、以及“192.168.26.8”等的16位前缀。事实上,“192.168/16”是所有地址为“192.168.x.y”的16位前缀,其中,0≤x≤255,以及\n0≤y≤255。这样,路由器处包含前缀“192.168/16”的路由信息的路由表能够对范围在“192.168.x.y”内的所有IP目的地址的数据包进行路由。然而,路由器还可以包含诸如“192.168.4.5”的32位IP目的地的更具体的路由信息。这样,网络IP地址可以与路由器的路由表中的所有前缀进行比较,以提供最长匹配前缀形式的合适的(诸如更具体地)路由信息,然后可以将该信息输出到转发表。\n[0010] 这样,IP网络中的路由过程涉及通过大量路由器的路由表的大量搜索。此外,当添加新路由并且其他路由变为废弃时,会频繁地改变路由表。因此,就较高搜索速度同时所需数据存储资源保持较低而言,期望实现这些系统的算法和数据结构是高效的。\n[0011] 树是广泛使用的一种具有树形状的数据结构,该树形状具有一组基于根节点的链接节点。每个节点可以包含值或条件,并具有零个或多个子节点,其紧接着位于树中的每个节点之下。具有孩子的节点被称为孩子的双亲。节点具有至多一个双亲。叶节点是具有零个子节点的树数据结构的节点,其常常离根节点最远。\n[0012] 节点的祖先是该节点的双亲,或该节点的双亲的双亲等。根是树中所有其他节点的祖先。给定节点的一组祖先是从根到该节点通过该树的(最短)路径。节点的后裔是该节点的孩子,或该节点的孩子的孩子等。当且仅当节点B是节点A的后裔时,节点A是节点B的祖先。\n[0013] 二叉查找树是二叉树数据结构,其中每个节点具有相应的关键字(key)。二叉查找树中的节点的左子树仅包含小于该节点值的值,而二叉查找树中节点的右子树仅包含大于或等于该节点值的值。二叉树的排序和搜索算法相对来说易于高效。\n[0014] 数字树是用于存储字符串的树,在其中通过两个或多个字符串共有的子字符串来组织节点。数字树的搜索只涉及搜索关键字的使用,即,当遍历该树时在每个节点处不读取与每个节点相关联的值。代替地,在树的搜索期间,仅当发现合适的节点关键字时才读取节点值。\n[0015] 有时被称为前缀树的特里结构(trie)是有序的树数据结构,其被用于存储关键字是字符串的关联阵列。不像二叉查找树,树中没有节点存储与该节点相关联的关键字。代替地,树中节点的位置确定节点与什么关键字相关联。任何一个节点的所有后裔都具有与该节点相关联的字符串的公共前缀。根节点通常与空字符串相关联。\n[0016] 特里结构的优点包括快速的关键字查找时间和其对于最长前缀匹配的适用性。最长前缀匹配涉及识别其节点关键字与给出的搜索关键字共享最长前缀的节点。特里结构还允许搜索关键字与具有公共前缀的整组节点关键字的关联。特里结构具有以下缺点:当节点关键的集合较稀疏时(即,当实际节点关键字形成潜在关键字的集合的小子集时)特里结构内的许多内部节点(非叶节点)具有一个后裔,引起该特里结构的高空间占有率。\n[0017] Patricia算法,‘检索以字母数字混合所编码的信息的实际算法’,(Donald R.Morrison,Journal ofthe ACM,15栏,第4期,1968年10月,pp514-534)1是提供在大文件中存储、索引、以及检索信息的灵活手段的算法,其节省了索引空间和再索引的时间。当添加新资料时,其不需要文本或索引的重排。Patricia算法能够用于创建和处理Patricia树结构。\n[0018] Patricia树(有时被称为radix树)是二叉数字特里结构(binarydigital trie)的实例,在该二叉数字特里结构中,仅是作为孩子的任何节点与其双亲合并。传统特里结构的遍历使用关键字的每个部分来确定哪个子树至分枝,然而通过存储搜索关键字部分的标识符,Patricia树指定接下来应当使用搜索关键字的哪个要素来确定分枝,并且因此接下来应当遍历哪个节点。这去除了对于树中的任何节点仅具有一个后裔的需求,从而仅将真实的分枝包括在索引中。这意味着索引的大小独立于所存储的短语的长度。\n[0019] Patricia算法允许以下的快速确定:对于需要‘约与log n相似’的计算(O(log n))的n个节点,搜索关键字是否对应于树中的节点关键字;树中任何节点的关键字是否是搜索关键字的前缀,以及如果是的话,在O(log n)的计算中哪个这种前缀是最长的;以及在O(log n)的计算中搜索关键字是否是树中的任何节点关键字的前缀,以及如果是的话,在O(m)计算中走查(walk through)带有该前缀的m个节点关键字。这些特性使Patricia算法成为IP转发应用程序的合适选择,这些IP转发应用程序依赖IP目的地址与前缀的快速匹配,即,搜索关键字与节点关键字的匹配。\n[0020] 根据Patricia算法所构造的数据结构具有限制,这是由于存储在数据结构中的节点关键字不能是彼此前缀。\n[0021] 已经进行多种尝试来解决这个限制,例如,美国专利US6,396,842B1描述了一种搜索方法,其利用具有可变长度关键字的基于最长匹配的radix搜索特里结构并且具有处理作为其他关键字前缀的关键字的能力。该方法基于Patricia算法。在由该算法处理之前修改代表树的关键字的地址前缀。将单个字节加到每个地址前缀的开始,其被设置为等于地址前缀的长度。后面是地址前缀的组合地址长度字节被Patricia算法所使用。当一个地址是另一个地址的前缀时,所添加的字节将使地址唯一并且互不相同。因为已经使节点关键字唯一,所以Patricia算法能够被用于搜索特里结构。在解决Patricia的关键字前缀限制中,因为该方法需要增加的存储容量并且还需要对于不同前缀长度的额外的搜索,所以降低了性能。\n[0022] 解决树数据结构的关键字前缀限制的其他尝试(诸如根据Patricia算法所构造的那些数据结构)破坏树数据结构的合乎要求的性质,例如,当遍历树时需要频繁的检查节点关键字。\n[0023] 因此,需要提供一种改进的方案来克服用于处理树数据结构中的数据的算法(类似于Patricia算法)的节点关键字前缀限制。\n发明内容\n[0024] 根据本发明的第一方面,提出了一种使用搜索关键字搜索数据库的方法,该数据库包含按照树结构来存储的数据,该树结构包括多个节点,节点具有相关联的数据,该相关联的数据包括:\n[0025] 一个或多个节点指针,该节点指针包括识别在搜索该树结构时可以被遍历的节点的数据;\n[0026] 节点关键字;以及\n[0027] 搜索关键字部分标识符,识别搜索关键字部分,该搜索关键字部分将被用于确定在遍历节点时将要被使用的节点指针,\n[0028] 其中,该方法包括:\n[0029] 将关于第一节点的第一关联数据以及关于第二节点的第二关联数据存储在该数据库中,该第一关联数据包括第一节点关键字,以及该第二关联数据包括第二节点关键字,其中,第一节点关键字是第二节点关键字的前缀(第二节点关键字以第一节点关键字作为前缀);以及\n[0030] 使用搜索关键字搜索该树结构,\n[0031] 其中,使用该搜索关键字的搜索涉及正被遍历的第二节点,以及如果第一节点关键字具有匹配该搜索关键字的前缀,则在遍历第二节点之后识别该第一节点。\n[0032] 因此,本发明允许搜索数据库中的数据,在该数据库中,存储在数据库中的一个或多个节点具有相关联的节点关键字,其作为与存储在该数据库中的其他节点相关联的节点关键字的前缀。因此本发明允许将较宽范围的节点关键字表示在该数据库中。\n[0033] 如果数据库的搜索涉及遍历第一节点,其中,第一节点的节点关键字是第二节点的节点关键字的前缀,则本发明允许在遍历第二节点之后识别第一节点。这可以涉及将所识别的节点的节点关键字与搜索关键字进行比较,以确定在所识别的节点关键字与搜索关键字之间是否存在严格匹配、前缀匹配、或不匹配。\n[0034] 本发明通常地需要两个节点指针和数据的存储,其中,该数据识别在遍历节点时将被使用的搜索关键字的一部分,即,搜索关键字部分标识符。在搜索数据库期间需要对节点关键字的有限的访问,并且搜索速度有利地独立于搜索关键字长度。不需要将节点关键字存储在树结构自身中。代替地,可以将节点关键字存储在别处,以及(例如)通过指针将节点关键字与其节点相关联。可替代地,这可以通过将该节点和其节点关键字嵌入到公共数据结构中来实现,使得通过其在存储器中相对固定位置来确定它们的关联。接下来,这种实现方式将不需要节点和其节点关键字之间的指针。\n[0035] 优选地,存储第三数据,该第三数据指示第一节点关键字是第二节点关键字的前缀(第二节点关键字以第一节点关键字作为前缀)。因此,如果第二节点关键字与搜索关键字的比较导致不匹配,则可以识别其节点关键字是搜索关键字的前缀的第一节点。\n[0036] 在一个实施例中,这可以通过存储与从第二节点指向第一节点的节点指针相关联的数据并跟随该节点指针以从第二节点至第一节点来遍历树结构来实现。因此,可以使用这些节点指针来识别和遍历其节点关键字是彼此前缀的节点。\n[0037] 可替代地,这可以通过在遍历第二节点之后但在随后的遍历第一节点之前,遍历树结构中第一节点之上的一个或多个节点来实现。因此,可以对树结构的所有或部分搜索额外时间,但额外搜索可以在遍历第一节点期间而不是继续遍历第二节点期间完成。\n[0038] 此外,可替代地,这可以通过在遍历树期间对其搜索关键字部分标识符匹配其双亲的搜索关键字部分标识符的一个或多个节点进行记录(即,通过留意具有匹配节点关键字的潜在前缀的那些节点)来实现。\n[0039] 优选地,特定节点的搜索关键字部分标识符涉及搜索关键字位,搜索关键字位将被用于确定在遍历特定节点时将被使用的节点指针。因此,代替在遍历节点时必须检测每个单个节点的节点关键字,仅需要检查其搜索关键字部分标识符,以确定接下来遍历哪个节点。就与搜索数据树结构相关联的计算复杂度而言,这给出了提高的效率。\n[0040] 在一个实施例中,特定节点的搜索关键字部分标识符涉及将被使用的搜索关键字位与先前被使用的搜索关键字位相比的相对位置。因此,节点的搜索关键字部分标识符可以涉及一个或多个先前被遍历的节点。\n[0041] 可替代地,特定节点的搜索关键字部分标识符可以涉及将被使用的搜索关键字位的绝对位置。这可以有助于降低在遍历节点期间所需的处理的量,例如,降低需要被比较的搜索关键字和节点关键字位的数目。优选地,搜索关键字部分标识符的检查允许通过检查由指针所引用的节点是否具有较低的搜索关键字部分标识符来确定节点指针的类型,即,来自特定节点的指针是否是祖先指针或孩子指针。这能够帮助避免对于指示节点指针类型的标记等的需求。\n[0042] 优选地,存储与多个节点中的一个或多个节点相关联的数据参数。因此,能够将信息以所存储的数据参数的形式与每个数据节点相关联。这种所存储的数据参数能够被看作与树结构相关联的有效载荷。树结构的最终结果的搜索结果可以包括访问以及随后输出所存储的数据参数。在IP路由实现中,这种所存储的数据参数可以包括路由或转发与路由、网络实体、网络地址或部分网络等相关联的信息。\n[0043] 优选地,对数据库的搜索包括使用基本上类似于Patricia算法的算法(其提供高效的搜索能力)搜索。\n[0044] 根据本发明的第二方面,提供了一种将数据存储到数据库中的方法,该数据库包含按照树结构来存储的数据,该树结构包括多个节点,节点相关联的数据,该相关联的数据包括:\n[0045] 一个或多个节点指针,该节点指针包括识别在搜索该树结构时可以被遍历的节点的数据;\n[0046] 节点关键字;\n[0047] 搜索关键字部分标识符,识别搜索关键字部分,该搜索关键字部分将被用于确定在遍历节点时将要使用的节点指针,\n[0048] 其中,该方法包括将新节点插入到该树结构中,该新节点具有相关联的节点关键字,该插入包括:\n[0049] 使用插入搜索关键字来搜索该数据库,该插入搜索关键字包括该新节点关键字,使用该插入搜索关键字的该搜索识别该树结构中的给定节点,该给定节点的节点关键字与该插入搜索关键字具有给定前缀关系;\n[0050] 以对于识别出的该给出节点最近的关系将该第一新节点插入到该树结构中;以及[0051] 向该第一新节点分配:\n[0052] 一个或多个节点指针,\n[0053] 等于该插入的搜索关键字的节点关键字,\n[0054] 等于该树中该第一新节点之上的节点的搜索关键字部分标识符的搜索关键字部分标识符。\n[0055] 因此,本发明允许将数据存储到数据库中,在该数据库中,存储在该数据库中的某些节点具有作为与存储在该数据库中的其他节点相关联的节点关键字的前缀的关联节点关键字。因此,本发明允许在数据库中表示更宽范围的节点关键字。\n[0056] 可以为添加至数据库中的新节点分配等于在树结构中的紧接着新节点之上的节点的搜索关键字部分标识符的搜索关键字部分标识符。这意味着在随后的搜索树结构期间可以跳过新节点,有助于进一步加速这个随后的搜索。\n[0057] 优选地,给定前缀关系包括该插入搜索关键字是识别出的该给定节点的节点关键字的前缀。例如,如果树结构包含具有关联节点关键字000的节点并且使用对应于将被添加到该树结构的节点的节点关键字的搜索关键字00来搜索数据库,则将发生该情形。\n[0058] 优选地,最近的关系包括将该新节点插入到该树中的识别出的该给定节点之上。\n因此,可以将其节点关键字是现有节点的节点关键字的前缀的新节点添加到树中的现有节点之上。可以将新节点插入到树结构中的紧接着识别出的给定节点之上,或树结构中的给出识别节点的更远之上。\n[0059] 优选地,将先前指向识别的该给定节点的节点指针调整为指向该新节点。\n[0060] 优选地,创建从该新节点指向识别出的该给定节点的节点指针。\n[0061] 优选地,给定前缀关系包括识别的该给定节点关键字的节点关键字是该插入搜索关键字的前缀。例如,如果树结构包含具有关联节点关键字00的节点并且使用对应于将被添加至树结构的节点的节点关键字的搜索关键字000来搜索数据库,则可能发生这种情形。\n[0062] 优选地,最近的关系包括将该新节点插入到该树中的该给出识别节点之下。因此,可将新节点添加到树中的现有节点之下,其中,与现有节点相关联的节点关键字是该新节点的关联节点关键字的前缀。\n[0063] 优选地,将先前从识别的该给定节点指出来的节点指针调整为指向该新节点。\n[0064] 优选地,在该树中创建从该新节点指向该新节点之下的节点的节点指针。\n[0065] 优选地,在该树中创建从该新节点指向该新节点之上的节点(其节点关键字是该新节点的节点关键字的前缀)的节点指针。因此,本发明允许其关联节点关键字是彼此前缀的多个节点之间的遍历。\n[0066] 优选地,所创建的指向该树中的该新节点之上的节点的指针指向这样的节点,该节点的节点关键字具有与该树中的该新节点之上的多个节点中的该新节点的节点关键字相匹配的最长匹配前缀。因此,能够识别具有搜索关键字的下一个最长匹配前缀的节点。例如,当在IP路由应用程序中存在与最长匹配前缀相关联的错误或故障时(例如,被破坏的或超载的通信链路),这是有用的。\n[0067] 优选地,将从该新节点指出来的指针调整为指向根节点,该根节点具有空节点关键字。树结构可以包含位于树顶部处的根节点。根节点可以具有关联空节点关键字,其是树中的所有节点关键字的前缀。因此,从新节点处插入到树结构中的至少一个指针可以向上指向根节点。\n[0068] 优选地,通过反转将该新节点插入到该树结构中所涉及一个或多个步骤来从该树结构中去除该新节点。因此,如果不再存在对于存储与节点相关联的数据的需求,则可以将节点从树中去除,并相应地去除和调整相关的节点指针。\n[0069] 如果在添加了新节点之后,没有将更多的节点添加到树结构中,则去除过程是可逆的,使得可以相反地采取被用于插入新节点的正好相同的步骤。然而,在已经添加了新节点之后将更多的节点添加到树结构中,则去除新节点可以涉及不同于那些先前被用于添加节点的步骤。\n[0070] 在IP路由场景中,这可以对应于由树结构中的节点所表示的网络节点可以不再是经由特定IP地址可联系的情形。在这种情况下,可以完全从该树结构中去除树中的节点。可替代地,可以修改树中的与节点相关联的数据以反映对于节点的新联系细节。\n[0071] 根据本发明的第三方面,提供了一种在数据通信网络中路由数据包的方法,该方法包括:\n[0072] 接收与该数据通信网络中的路由相关联的路由数据;\n[0073] 使用与该接收的路由数据相关联的搜索关键字来搜索数据包路由数据库,根据本发明第一方面搜索该数据包路由数据库;以及\n[0074] 基于搜索该数据包路由数据库,将与该路由相关联的数据存储到该数据包路由数据库中。\n[0075] 本发明的这个方面将本发明的第一方面的方法应用于数据通信网络中的数据包路由中。该网络可以是根据网际协议来工作的互联网。这里数据库可以包含用于数据通信网络中大量路由的数据包路由信息,并且关联节点关键字可以与网络地址相关联。\n[0076] 在本发明的实施例中,网络实体可以是该网络中的路由,并且该数据的存储包括将新节点插入到对应于该路由的该数据包路由数据库中。\n[0077] 例如,响应于新路由、网络实体、或变为可联系的子网络(与已经在转发数据库中的节点相关联的节点关键字是其网络地址的前缀,或者其网络地址是与已经在转发数据库中的节点相关联的节点关键字的前缀),可以发生新节点至数据库的添加。\n[0078] 在本发明的其他实施例中,路由可以是该网络中现有的路由,并且该数据的存储包括修改与该现有路由相关联的该数据包路由数据库中的数据。该修改后的数据可以包括与被表示在数据库中的一个或多个路由、节点或实体相关联的一个或多个搜索关键字部分标识符或节点关键字。\n[0079] 可替代地,用于现有路由的联系细节可以改变,使得与已经在路由数据库中的节点相关联的节点关键字是其新网络地址的前缀,或者其新网络地址是与已经在路由数据库中的节点相关联的节点关键字的前缀。可以从树结构中完全删除与节点相关联的数据,或修改与节点相关联的数据以反映新地址。\n[0080] 因此,可以在诸如IP路由器的网络实体处接收对应于网络中新的或现有的路由的网络地址数据。路由器可以包括以树结构所实现的包含作为彼此前缀的节点关键字的路由表。考虑到新的或现有的路由,为了更新路由数据库,可以搜索树结构来查找对应于路由的网络地址的节点关键字或与路由相关联的其他这种联系信息。如果找到了具有严格匹配或前缀匹配节点关键字的树节点,则可以检查和更新与节点相关联的数据以反映对于路由或插入的新节点的不同路由信息,以表示路由的新路由信息。\n[0081] 因此,在没有确切的网络地址匹配存在于路由数据库的情况下,本发明考虑具有与网络地址前缀匹配的路由。即使当网络地址与对应于其他路由的一个或多个节点关键字具有前缀关系,本发明允许路由。诸如边界网关协议(BGP)的数据包路由协议依赖于网络地址前缀的选择和公告,所以可以将本发明适当地应用于诸如实现了前缀匹配的互联网的网络。\n[0082] 优选地,将与该路由相关联的路由数据和/或转发信息输出到数据包转发表。因此,可以将用于路由的新的或更新的路由信息用于填充数据包转发表。\n[0083] 优选地,在该转发表中所识别的该数据包括网络地址数据。\n[0084] 优选地,网络地址数据和/或目的地址数据包括网际协议(IP)地址数据。因此,可以使用本发明来执行具有包含IP地址数据的网络地址的网络实体的路由。同样地,可以使用本发明将包含IP地址数据的数据包转发至其目的地。\n[0085] 根据本发明的第四方面,提供了一种适于执行本发明第一、第二以及第三方面的方法的设备。\n[0086] 根据本发明的第五方面,提供了一种适于执行本发明的第一、第二、以及第三方面的方法的计算机软件。\n[0087] 从通过参考附图所作出的(仅以实例的方式给出的)本发明的优选实施例的以下描述中,本发明的更多特征和优点将变得显而易见。\n附图说明\n[0088] 图1示出根据本发明实施例的数据通信网络的系统示意图。\n[0089] 图2示出根据本发明实施例的IP路由器的架构。\n[0090] 图3示出根据本发明实施例的路由器的示例性转发表。\n[0091] 图4示出根据本发明实施例的树结构的实例。\n[0092] 图5是示出根据本发明实施例的搜索树结构的流程图。\n[0093] 图6是示出根据本发明实施例的将新数据插入到树结构的流程图。\n[0094] 图7是示出将节点插入到根据本发明实施例的树结构的流程图。\n[0095] 图8是示出将节点插入到根据本发明实施例的树结构的流程图。\n[0096] 图9是示出将节点插入到根据本发明实施例的树结构的流程图。\n[0097] 图10是示出根据本发明实施例的树结构的示意图。\n[0098] 图11是示出根据本发明实施例来扩展图10的树结构的示意图。\n[0099] 图12是示出根据本发明实施例来扩展图11的树结构的示意图。\n[0100] 图13是示出根据本发明实施例来扩展图12的树结构的示意图。\n[0101] 图14是示出根据本发明实施例来扩展图13的树结构的示意图。\n[0102] 图15是示出根据本发明实施例来扩展图14的树结构的示意图。\n[0103] 图16是示出根据本发明实施例来扩展图15的树结构的示意图。\n具体实施方式\n[0104] 图1示出根据本发明实施例的数据通信网络的系统示意图。该网络包括路由网络\n118,其包括多个互连的核心路由器100a、100b、100c、以及边缘路由器102、104、106、108。\n核心路由器100a、100b、100c形成路由网络118的主连接链路(主干网),并且专门作通过网络的大数据量的传输。边缘路由器102、104、106、108在各个局域网110、112、114、116与由核心路由器100a、100b、100c形成的骨干网之间路由数据包。\n[0105] 图2示出根据本发明实施例的IP路由器200的架构。例如,如图1中所示,将路由器200连接至多个邻节点212、214。路由器200包括负责根据位于网络内的多个实体或网络的各个部分之间的路由学习网络的拓扑的路由处理器202。路由处理器202与邻节点\n212、214交互以构建并维护路由表220。路由表220可以是树结构数据库形式。路由处理器202将关于各个路由和路由协议的路由信息存储到路由表220中。路由处理器202还负责通过将转发信息和/或网络地址数据输出到转发表206来提供路由计算和更新204。\n[0106] 路由器200还包括负责接收输入数据包216以及发送输出数据包218的包转发器\n210。当路由器200接收数据包时,从数据包中读取目的IP地址数据,并将其用在转发表\n206的搜索中。该搜索208涉及搜索转发表206来查找数据包的IP目的地址数据,以确定对应的转发信息。转发信息可以包含路由器200的输出端口,将数据包和下一跳(即,其邻节点)指向该输出端口,以将该包传输到该输出端口上。\n[0107] 图3示出根据本发明实施例的路由器200、300的示例性转发表312。图3描绘了互连到路由器303、304、306、308、以及310的路由器300。实际上,可以将路由器300连接至更多其他路由器326以及其他这种网络装置。\n[0108] 路由器300包括路由处理器302,其包含(例如)树结构数据库324形式的路由表。路由器300还包括连接至路由处理器302的转发表数据库312。路由处理器302使用存储在树结构数据库中的树结构表示并明了路由器300周围的网络拓扑。路由处理器302处理树结构并将新路由和路由更新输出到转发表数据库312。注意到,没必要每次向树结构数据库324添加新路由或者在树结构数据库中更改路由时路由处理器302都输出数据到转发表数据库312。树结构和转发表数据库可以作为分离的实体或(可替换地)组合数据库实体而存在。同样地,路由处理器和包转发器可以是分离的实体或被组合成一个实体。\n[0109] 树结构数据库324包括关于树结构的数据,在该树结构中存储了路由表数据库数据。这可以包括与多个节点相关联的数据,每个节点具有一个或多个节点指针、关联节点关键字、以及搜索关键字部分标识符。\n[0110] 节点指针可以包括与在正搜索树结构时可以被遍历的节点(例如,位于树结构中的该节点之上或之下的节点)相关联的数据。\n[0111] 搜索关键字部分标识符可以包括识别可以被用于确定在遍历节点时将被使用的节点指针的搜索关键字部分的数据。以下详细讨论搜索关键字部分标识符。\n[0112] 转发表数据库312可以被用于存储通过路由处理器302所输出的关于多个前缀和用于每个前缀的关联转发信息的数据。转发表312的第一列包括如项314、316、322、324所分别示出的前缀“1010”、“1110”、“1010001”、以及“101000111000”。默认前缀320用作除““1010”、“1110”、“1010001”、以及“101000111000”之外的所有前缀的‘垃圾箱(catch all)’。项318表示,实际上,可以将更多的前缀和关联转发信息包含在转发表312中。\n[0113] 注意到,为了解释性的目的,按照纯二进制位符号给出了这些前缀。在IPv4中,地址由32位组成,其可以由通过小数点所分隔的四个十进制数所表示,其中,每个十进制数代表如之前上述的32位IP地址的8个位。在IPv6中,地址由128位组成,其可以被表示为通过冒号所分隔的8个十六进制数。以下的二进制实例是抽象的,并且能符合任何IP寻址方案。\n[0114] 转发表312的第二列包括用于在转发表中所列的前缀的转发信息,即,根据对于数据包的IP目的地址的最长前缀匹配应当将数据包转发到的地方。现在给出一些转发实例:\n[0115] 其IP目的地址具有等于“101011101010”的前12位的数据包具有最长前缀匹配“1010”,所以应当使用转发信息A被转发至路由器302;\n[0116] 其IP目的地址具有等于“111000100110”的前12位的数据包具有最长前缀匹配“1110”,所以应当使用转发信息B被转发至路由器304;\n[0117] 其IP目的地址具有等于“101000100110”的前12位的数据包具有最长前缀匹配“1010001”,所以应当使用转发信息C被转发至路由器306;\n[0118] 其IP目的地址具有等于“101000111000”的前12位的数据包具有最长前缀匹配“101000111000”,所以应当使用转发信息D被转发至路由器308;\n[0119] 其IP目的地址具有等于“11110011100”的前12位的数据包在转发表中没有匹配前缀,所以将使用默认转发信息Z被转发至路由器310。\n[0120] 被用于搜索路由表的IP目的地数据可以被称作搜索关键字,并且每个节点处的前缀可以被称作节点关键字。\n[0121] 如上所述,诸如Patricia算法的算法允许快速确定搜索关键字是否存储在树结构中。因此,具有对应于树结构的这种算法尤其适于IP路由应用程序。然而,现有技术系统具有这样的缺点:存储在数据结构中的前缀不可以是彼此前缀;以及减轻该问题的先前尝试可能破坏算法的高效查找特性(例如,树遍历期间在某些节点处需要关键字的检查)。\n[0122] 因此,现有技术系统不适于使用这种算法和关联树结构来将所有前缀存储在图3中示出的示例性转发表312中。这是由以下事实所引起的:虽然“1010”和“1110”不是彼此的前缀,“1010”是“1010001”以及“101000111000”的前缀,并且还因为“1010001”是“101000111000”的前缀。因此,如果现有技术系统将利用诸如Patricia的算法的高效搜索特性,则现有技术系统将被限于仅将前缀“1010”、“1010001”、以及“101000111000”中的一个存储到路由器的转发表中。\n[0123] 本发明在不折衷其高效搜索特性和不必须增加所需数据存储的情况下克服了关联树结构和诸如Patricia算法的算法的前缀限制。\n[0124] 为了阐明这点,连同本发明如何能适应添加其作为彼此前缀的节点关键字的描述一起,现在下面将更详细地描述Patricia算法和关联树结构。\n[0125] 通过仅检查搜索关键字,而不是通过在节点处与关键字直接比较来遍历数字树。\n在根据本发明实施例的树结构中,每个节点可以包含搜索关键字部分标识符、以及一个或多个节点指针。\n[0126] 节点指针可以是指向左节点(通常地与二进制零相关联)或右节点(通常地与二进制一相关联)的指针以在遍历节点时查找下一个。\n[0127] 搜索关键字部分标识符可以识别搜索关键字部分,其可以被用于确定在遍历节点时将被使用的节点指针。该搜索关键字部分标识符可以包括在遍历节点时可以被跳过的搜索关键字中的一个或多位或搜索关键字中的许多位的相对或绝对位置。\n[0128] 相对数目的位可以是(例如)相对于被用于遍历相关节点或先前已遍历的节点之上的节点的位。\n[0129] 因此,搜索关键字部分标识符指示可以跳过多少位,即,应当检查搜索关键字的哪些位,以确定在使用特定搜索关键字遍历树时根据该节点的指针。\n[0130] 搜索关键字部分标识符的使用意味着在搜索期间可以跳过(即,忽略)某些搜索关键字位,所以在将一个节点识别为搜索的结果时,需要与该节点关键字进行一次性比较以检查匹配。因此,基于节点关键字与搜索关键字的比较结果搜索可以成功或失败。\n[0131] 在相同的搜索过程期间,能够访问同一节点两次。这由以下的组合所产生:\n[0132] (i)不与经过的节点比较搜索关键字,以及\n[0133] (ii)跳过不对树中多个节点加以区分的搜索关键字位。\n[0134] 如果发生树中向上的步骤,或者到达同一节点的步骤发生,其通常是搜索过程中的最后一个步骤。向上的步骤可以(例如)涉及跟随从当前正被遍历的节点指向树中该节点之上的节点的节点指针(通常被称为祖先指针)。到达同一节点的步骤可以(例如)涉及跟随从当前正被遍历的节点指向树中同一节点的指针(通常被称为自指针)。\n[0135] 在图4中示出了根据本发明实施例的树结构的实例描述。该树包含三个节点,通过项400、402、以及404示出。在IP路由应用程序中,每个节点关键字可以对应于目的地址前缀(例如,如在图3中的转发数据库312的第一列中所示出的),以及每个节点可以具有关于用于该目的地址前缀的转发信息的关联存储的数据参数(例如,如在图3中的转发数据库312的第二列中所示出的)。可以将图4中示出的树的结构存储在树结构数据库中(例如,如通过图3中的项324所示出的)。\n[0136] 图4中示出了分别具有二进制符号为0000、0001、以及00100的其节点关键字的三个节点。每个节点具有关联搜索关键字部分标识符,在图4中被表示为每个节点处的小括号中的值。具有0000的节点关键字的节点具有2的搜索关键字部分标识符,具有0001的节点关键字的节点具有3的搜索关键字部分标识符,以及具有00100的节点关键字的节点具有3的搜索关键字部分标识符。这里的节点的搜索关键字部分标识符表示应当被跳过的搜索关键字的绝对位数,以确定在遍历节点时将跟随哪个节点指针。\n[0137] 应当注意,节点关键字不需要并且通常地不存储在节点自身处。另一种观察搜索关键字部分标识符的方式是其还能够被用于区分正被遍历的节点之下的树中的节点,即,搜索关键字部分标识符表示应当检查正被遍历的节点之下的节点的节点关键字中的哪个位,以区别那些节点关键字。所以,例如,图4中具有节点关键字0000的节点400具有搜索关键字部分标识符2。这意味着位2(其是在位0和位1之后从左边数的第三位)区别具有搜索关键字部分标识符0001的节点402的节点关键字和具有搜索关键字部分标识符00100的节点404的节点关键字。在这种情况下,节点402的节点关键字的位2是二进制零,以及节点404的节点关键字的位2是二进制一。\n[0138] 该树起始于具有节点关键字0000和搜索关键字部分标识符2的节点400。通过项\n406所示出的对应于二进制零的节点400中的左指针是子指针,这是由于其从节点400指向其左子节点402。通过项410所示出的节点402中的左指针是祖先指针,这是因为其从节点\n402指回到祖先节点400。通过项412所示出的节点402中的右指针是自指针,这是由于其从节点402指向同一节点402。通过项408所示出的节点400中的右指针是子指针,这是由于其从节点400指向其右子节点404。通过项414所示出的节点404中的左指针是自指针,这是由于其从节点404指向同一节点404。通过项416所示出的节点404中的右指针是自指针,这是由于其从节点404指向同一节点404。\n[0139] 能够使用搜索关键字来搜索该树以检查该树中是否包含对应于该搜索关键字的节点关键字。现在描述大量不同搜索关键字的从根节点开始的搜索处理。搜索关键字中的零对应于左分枝,即,跟随左指针,以及搜索关键字中的一对应于右分枝,即,跟随右指针。\n当跟随树中向上指向节点的指针或自指针、或被遍历的节点的搜索关键字部分标识符指示超过正被讨论的搜索关键字的结尾的位时,搜索结束。\n[0140] 实例搜索关键字:k=00100\n[0141] 搜索关键字的位0在搜索关键字的左手边(零),跟随有位1(零)、位2(一)、位\n3(零)、以及位4(零),具有总共五个位。\n[0142] 搜索处理通过遍历节点400开始。该节点的搜索关键字部分标识符是2,所以首先应当检查搜索关键字的位2。查找关键字的位2是1,所以搜索从那里沿着图4中的右指针\n408向右分枝来遍历节点404。节点404的搜索关键字部分标识符是3,所以应当检查搜索关键字的位3。搜索关键字的位3是零,所以搜索从那里沿着左指针414向左分枝。搜索处理仍在遍历节点404,指示已经跟随自指针,所以搜索在这里结束。现在能将搜索关键字与该节点处的节点关键字进行比较,其能够看出是相同的(均为00100)。这指示匹配,即,成功搜索,意味着搜索关键字00100包含于该树中。\n[0143] 应当注意,可以将实际存储的与节点相关联的数据参数存储在别处,并且在遍历处理期间并不需要。可以在搜索结束处检查存储的数据参数。\n[0144] 实例查找关键字:k=0101:\n[0145] 搜索处理起始于具有2的搜索关键字部分标识符的节点400。搜索关键字的位2是零,所以处理从那里沿着左指针406向左分枝来遍历节点402。节点402的搜索关键字部分标识符是3,所以应当检查搜索关键字的位3。搜索关键字的位3是1,所以处理从那里沿着右指针412向右分枝。搜索处理仍在遍历节点402,指示已经跟随自指针,所以搜索在这里结束。当节点402的节点关键字是0001时,将搜索关键字与节点关键字进行比较导致失败,其不同于作为0101的搜索关键字。因此,搜索提供了这样的信息:树中任何节点关键字都不是该搜索关键字的前缀,或该搜索关键字不是树中任何节点关键字的前缀。\n[0146] 实例搜索关键字:k=0000:\n[0147] 搜索处理起始于具有2的搜索关键字部分标识符的节点400。搜索关键字的位2是0,所以搜索从那里沿着左指针406向左分枝来遍历节点402。节点402的搜索关键字部分标识符是3,所以应当检查搜索关键字的位3。搜索关键字的位3是0,所以处理从那里沿着左指针410向左分枝来遍历节点400。现在搜索处理位于节点400处,指示已经跟随向上至祖先节点的指针,所以搜索处理在这里结束。将搜索关键字与该节点处的节点关键字进行比较给出匹配,即,意味着搜索关键字0000包含于该树中的成功搜索。\n[0148] 实例搜索关键字:k=000101010:\n[0149] 搜索处理起始于具有2的搜索关键字部分标识符的节点400。搜索关键字的位2是零,所以处理从那里沿着左指针406向左分枝来遍历节点402。节点402的搜索关键字部分标识符是3,所以应当检查搜索关键字的位3。搜索关键字的位3是1,所以处理从那里沿着右指针412向右分枝来遍历节点402。搜索处理任在节点402处,指示已经跟随自指针,所以搜索处理在这里结束。将搜索关键字与该节点处的节点关键字进行比较给出直至节点长度的匹配,即,搜索关键字的前四位匹配通过搜索所识别的节点处的节点关键字的四位。\n搜索关键字中存在剩下的几个位,即,01010,所以对于该搜索关键字来说,这个节点关键字是包含在该树中的最长前缀节点关键字。\n[0150] 实例搜索关键字:k=00:\n[0151] 搜索处理起始于具有2的搜索关键字部分标识符的节点400。位2超过搜索关键字的末尾,所以搜索在这里结束。将搜索关键字与在搜索的末尾所识别的节点处的节点关键字进行比较给出直至搜索关键字长度的匹配,即,搜索关键字的前两位匹配节点关键字的前两位。这意味着搜索关键字是该节点关键字的前缀。\n[0152] 实例搜索关键字:k=000:\n[0153] 搜索处理起始于具有2的搜索关键字部分标识符的节点400。搜索关键字的位2是零,所以处理从那里沿着左指针406向左分枝来遍历节点402。节点402的搜索关键字部分标识符是3,所以应当检查搜索关键字的位3。位3超过搜索关键字的结尾,所以搜索在这里结束。将搜索关键字与在搜索的末尾所识别的节点处的节点值进行比较给出直至搜索关键字长度的匹配,即,搜索关键字的前三位匹配节点关键字的前三位。这意味着搜索关键字是该节点关键字的前缀。\n[0154] 在最后的两个搜索实例(关于搜索关键字00以及000)中,该搜索找到以搜索关键字为前缀的最短节点关键字。能够通过遍历子树(即,节点自身和那个节点的所有后裔、匹配节点的所有后裔)来确定树中以搜索关键字为其前缀的一列节点关键字,包括返回至其祖先的指针(而不是那些祖先的后裔)。\n[0155] 对于搜索关键字00,能够看出,当节点402和404在节点400的子树中时,该搜索关键字是整棵树的前缀。对于搜索关键字000,能够看出,由于节点402具有指向节点400的祖先指针,所以该搜索关键字是节点400和402的前缀,但由于节点404不在节点402的子树中,所以该搜索关键字不是该树的剩余部分的前缀。\n[0156] 搜索关键字k=0000的实例证明为何祖先指针在这种树结构中是重要的。节点\n400具有2的搜索关键字部分标识符而不具有自指针。所以,使用0000的搜索关键字的搜索(或0000是任何搜索关键字的前缀)将导致遍历经过该节点,同时搜索不在该节点处结束。使用该搜索关键字的搜索使用在节点402处的祖先指针410返回来找到节点400。\n[0157] 通常,不具有自指针的任何节点是其子树中某处的节点的祖先。节点可以具有两个自指针、自己和孩子、自己和祖先、两个孩子、或孩子和祖先。在后两种情况下,节点必须是其子树内的后裔的祖先。\n[0158] 在根据本发明实施例所构造的树结构中,树中的每个节点需要指向其的至少一个祖先或自指针。在n个节点的树中,正好存在可用于满足该角色的n+1个指针,然而,树结构被排列。事实上,通常正好存在一个在成功搜索期间其将不被跟随的自指针,并且除此之外,通过剩余的n个祖先或自指针中的一个来指向每个节点。\n[0159] 在图4的实例树结构中,节点404的右边孩子是在成功搜索期间将不会被跟随的指针。\n[0160] 要注意到,诸如这个的相对简单的Patricia树结构的固有限制,即在于它们无法区分完全相同的关键字。以某种方式将完全相同的关键字插入到这种树结构中的尝试将失败,失败的确切性质取决于该树结构和关联搜索算法的特定实现方式。\n[0161] 诸如根据Patricia算法所构造的那些数结构的树结构具有固有限制,树中不能有节点关键字是树中任何其他节点关键字的前缀。\n[0162] 现有系统使用了大量方法来解决该限制,例如:\n[0163] 1)控制向树结构的输入,使得作为前缀的节点关键字不出现。\n[0164] 2)在其节点关键字作为另一节点关键字的前缀的每个节点之下添加单向链接列表,并将该作为前缀的节点关键字放到单向链接列表中而不是树中。\n[0165] 3)将具体字符或字符串添加到所插入的每个前缀节点关键字的末尾。\n[0166] 这些方法中的每一种或者损坏搜索性能和/或损坏前缀能力,或需要不必的额外存储器存储能力。\n[0167] 本发明扩展了如下所述的Patricia树结构的传统树结构。该扩展并不经历上述的缺点,同时允许将具有互为前缀的节点关键字的节点存储在树中,以及还允许将具有以其他节点的节点关键字为前缀的节点关键字的节点插入到该树中。此外,本发明不损坏当使用诸如Patricia算法的算法时的关键字前缀性质以及搜索性能。\n[0168] 如果一个节点关键字是另一个节点关键字的前缀,则具有较长节点关键字的节点是具有较短节点关键字的节点的后继节点。具有较短节点关键字的节点将被分配相同搜索关键字部分标识符作为其双亲。\n[0169] 具有较短节点关键字的节点是新型节点,在本文中被称作为跳过前缀节点(skipped-prefix node)。跳过前缀节点的搜索关键字部分标识符匹配其双亲的搜索关键字部分标识符,因此,在搜索该树期间,其节点指针之一是不能用的。那个节点指针可以被称为‘远离(off)’向下的树。不管正在查找什么搜索关键字,树的搜索将遍历穿过跳过前缀节点至其孩子,即,在向下遍历期间,总是跳过跳过前缀节点。如果多个添加前缀的节点关键字存在(例如,如果需要将0、00、000、以及0000表示在树中),则可以将多个这种跳过前缀节点插入到树中。\n[0170] 如果初始搜索失败,则在搜索期间已经被遍历穿过了的跳过前缀节点可以被反过来检查,以找到最长搜索关键字匹配。为了便于此,本发明引入跳回(skip-back)节点指针,其被用于指示以下两者中的任一个:\n[0171] a)在这个之上的下一个跳过前缀节点\n[0172] b)如果在这个之上不存在较短前缀的自节点(这种情况仅可以发生在根节点处)[0173] 不包含关键字(还被称为空关键字)的节点可以被保留在树中的根节点处,从而如果在树中存在任何其他节点则根将是跳过前缀节点,并且根节点将具有零的搜索关键字部分标识符。这能有助于使操作根节点的具体情况处理最小化。\n[0174] 当且仅当节点具有子节点以及以下两者中的任一个,则能够将该节点识别为跳过前缀节点:\n[0175] (i)相应节点关键字为空(这仅可以发生在根处)\n[0176] (ii)其检查相同搜索关键字部分标识符作为其双亲。\n[0177] 图5是示出根据本发明实施例的搜索树结构的流程图。\n[0178] 搜索处理从步骤500处开始,其中,如上所述使用搜索关键字来遍历该树中的节点。这将通常地从位于树顶部处的根节点开始。当跟随自指针、跟随指向树中向上节点的指针、或被遍历的节点的搜索关键字部分标识符指示超过正在讨论的搜索关键字的末尾的位时,搜索将识别树中的节点。\n[0179] 在遍历期间,保存其搜索关键字部分标识符匹配其双亲节点的搜索关键字部分标识符的最近被遍历的节点的记录。记录该信息,因为其搜索关键字部分标识符匹配其双亲节点的搜索关键字部分标识符的最近被遍历的节点是潜在的前缀匹配节点。应当注意,在遍历该树期间,不解决任何这种潜在前缀匹配,即,在遍历树期间,不将这种节点的节点关键字与搜索关键字进行比较。该信息的注释法可能涉及使用其允许最近被遍历的潜在前缀匹配节点能被识别的指针、标记、或任何这种特征。\n[0180] 接下来,在步骤502中,将搜索关键字与在搜索中所识别节点的节点关键字进行比较。\n[0181] 看步骤504,如果搜索关键字确实匹配在搜索中所识别节点的节点关键字,则在步骤512中搜索处理在这个节点处结束。所识别节点的节点关键字是树结构中对搜索关键字的匹配。\n[0182] 看步骤504,如果搜索关键字不匹配在搜索中所识别节点的节点关键字,则搜索处理继续到步骤506。\n[0183] 看步骤506,如果最后一个潜在前缀匹配节点是根节点,则在步骤514处搜索处理结束。根节点的节点关键字可以是存在的对于搜索关键字的最长前缀。在简化假设(根节点关键字是空关键字)的情况下,这总是该情况。\n[0184] 看步骤506,如果最后一个潜在前缀匹配节点不是根节点,则搜索处理继续到步骤\n508。\n[0185] 在步骤508中,将搜索关键字与被遍历的最后一个潜在前缀节点的节点关键字进行比较。\n[0186] 看步骤510,如果搜索关键字不匹配被遍历的最后一个潜在前缀节点的节点关键字,则搜索在步骤516处结束。被遍历的最后一个潜在前缀节点的节点关键字是树结构中对搜索关键字的匹配。\n[0187] 看步骤510,如果搜索关键字不匹配被遍历的最后一个潜在前缀节点的节点关键字,则当需要时搜索处理继续重复步骤506、508、以及510,直到达到根节点或找到对于潜在前缀匹配节点的节点关键字的匹配。以这种方式,将检查具有连续较短节点关键字的节点,直到达到具有匹配前缀节点关键字的节点。如果没有找到具有匹配前缀节点关键字的这种节点,则可以到达根节点,因为其空关键字被添加为所有节点关键字的前缀。\n[0188] 图6是示出根据本发明实施例的将新数据插入到树结构中的流程图。\n[0189] 在步骤600中,当接收到将被添加至该树的新数据时,该处理开始。在步骤602中,使用对应于被添加的新数据的搜索关键字来搜索该树。如步骤604中所示,如果搜索导致被识别的具有严格匹配搜索关键字的节点关键字的节点,则在步骤614中在该树中已经表示了该数据并且拒绝该数据的插入。\n[0190] 如步骤606中所示,如果搜索导致被识别的具有以该搜索关键字为其前缀的节点关键字的节点,则如图7中所描述的,根据过程A通过插入新的跳过前缀节点来将该新数据添加到该树。图7中的步骤700示出将对应于新数据的新的跳过前缀节点插入在搜索中被识别的节点之上。在步骤702中,将先前指向在搜索中被识别的节点的子节点指针调整为指向新的跳过前缀节点。在步骤704中,创建从该新的跳过前缀节点指向在搜索中被识别的节点的子节点指针。\n[0191] 在步骤706中,创建从新的跳过前缀节点指向遍历的最后一个跳过前缀祖先节点的跳回节点指针。在步骤707中,指示被遍历的最后一个跳过前缀节点的所插入节点的任何后裔的指针被更新以代替地来指示被插入的节点。\n[0192] 在步骤708中,将等于搜索关键字的节点关键字(即,将被插入的关键字)分配给新的跳过前缀节点。在步骤710中,为新的跳过前缀节点分配了搜索关键字部分标识符,该搜索关键字部分标识符等于在该树中该新的跳过前缀节点之上的节点的搜索关键字部分标识符。对于搜索识别了具有以搜索关键字为其前缀的节点关键字的节点的情况,这完成了节点插入过程A。\n[0193] 如步骤608中所示,如果搜索导致被识别的具有其作为搜索关键字的前缀的节点关键字的节点,则根据如图8中所描述的过程B,通过插入新的非被跳过前缀节点(non-skipped-prefix node)并将搜索中被识别的节点更新为跳过前缀节点来将该新数据添加到该树。图8中的步骤800示出将对应于新数据的新节点插入到在搜索中被识别的节点之下。在步骤802中,将先前从在搜索中所识别的节点指出来的子节点指针调整为指向新节点。在步骤804中,创建从该新节点指向该新节点之下的节点的子节点指针。\n[0194] 当新被插入节点之上的节点的节点关键字是新插入节点的节点关键字的前缀时,该之上的节点被更新为跳过前缀节点。在步骤806中,创建从新更新的跳过前缀节点指向在插入期间被遍历的最后一个跳过前缀祖先节点的跳回节点指针。在步骤807中,指示那个祖先的被插入节点的任何后裔被改变为代替地指示新更新后的跳过前缀节点。\n[0195] 在步骤808中,将等于搜索关键字的节点关键字(即,将被插入的关键字)分配给新插入的节点。在步骤810中,为新插入的节点分配搜索关键字部分标识符,该搜索关键字部分标识符等于在该树中新插入节点之上的节点的搜索关键字部分标识符,即,新更新后的跳过前缀节点的以前的搜索关键字部分标识符。然后,在步骤812中,为新更新的跳过前缀节点分配搜索关键字部分标识符,该标识符等于该树中该新更新的跳过前缀节点之上的节点的搜索关键字部分标识符。对于搜索识别具有其作为搜索关键字的前缀的节点关键字的节点的情况,这完成了节点插入过程B。\n[0196] 如果搜索导致其节点关键字不完全匹配或前缀匹配搜索关键字的正被识别的节点,则被识别节点的节点关键字和搜索关键字在特定位上不同。在这种情况下,如步骤612中所示,该树可能被搜索附加时间,但该时间在具有不同位的节点处停止搜索。在步骤620中,根据如图9中所描绘的过程C通过插入新节点来将新数据添加到该树中。注意到,在这种情况下,该新节点不是跳过前缀节点。\n[0197] 图9中的步骤900示出了将对应于该新数据的新节点插入到节点之下,该节点具有对于搜索关键字的不同位的节点关键字。\n[0198] 如果新节点具有子树(即,新节点的插入将取代子树),则在步骤912中,创建至/来自所插入节点的自指针。步骤912还包括创建从所插入节点指向新节点的子树中在该新节点之下的第一节点的子节点指针。\n[0199] 如果节点的插入不会取代现有的子树,则在步骤904中,创建至/来自所插入节点的两个自指针。\n[0200] 在步骤906中,将具有对于搜索关键字的不同位的节点关键字的节点的节点指针(可以是祖先指针或自指针)调整为子节点指针,该子节点指针从具有不同节点关键字位的节点指向所插入节点。\n[0201] 在步骤908中,将等于搜索关键字的节点关键字分配给该新节点。在步骤910中,为该新节点分配搜索关键字部分标识符,该搜索关键字部分标识符等于不同位的位数目。\n对于搜索识别具有其不严格匹配或前缀匹配搜索关键字的节点关键字的节点的情况,这完成了节点插入过程C。\n[0202] 在可替换的实施例中,可以通过在初始搜索处理期间存储识别了其节点关键字在特定位处不同于搜索关键字的节点的数据来取代步骤612的数据。然后,该数据可被用于遍历具有不同位的节点,而不必须对树进行额外搜索。\n[0203] 现在参考图10至16描述使用本发明的扩展来创建示例性树结构。\n[0204] 图10示出根据本发明实施例的树结构。\n[0205] 树结构由具有空节点关键字和零的搜索关键字部分标识符(在小括号中示出)的根节点1000组成。再一次,应当注意,为了解释的目的,已经将与每个节点相关联的节点关键字包括在示意图中的每个节点处。通常地,将节点关键字自身存储在别处。\n[0206] 来自根节点1000的左节点指针1014指向节点1002(其具有00的节点关键字和1的搜索关键字部分标识符)。来自节点1002的左节点指针1018是自指针。来自节点1002的右节点指针1090是自指针。\n[0207] 来自根节点1000的右指针1016指向节点1006(其具有111的节点关键字和2的搜索关键字部分标识符)。来自节点1006的左节点指针1058指向节点1008,以及来自节点\n1006的右节点指针1032是自指针。节点1008具有1101100的节点关键字和5的搜索关键字部分标识符。来自节点1008的左节点指针1060指向节点1010。节点1010具有1101101的节点关键字和6的搜索关键字部分标识符。来自节点1010的左节点指针1024是至节点\n1008的祖先指针,以及来自节点1010的右指针1026是自指针。来自节点1008的右节点指针1062指向节点1012。节点1012具有11011101的节点关键字和5的搜索关键字部分标识符。来自节点1012的左节点指针1028是自指针,以及来自节点1012的右节点指针1030也是自指针。\n[0208] 图11示出根据本发明实施例的通过插入新节点来扩展图10的树结构。除与图11中的“1100”的项号相比的图10中的“1000”的项号之外,向相关的节点赋予相关的项目标号。\n[0209] 该结构具有空根节点1100,该空根节点具有零的搜索关键字部分标识符(在小括号中示出)。来自根节点1100的左指针1114指向节点1102(其具有00的节点关键字和1的搜索关键字部分标识符)。来自节点1102的左节点指针1118是自指针。来自节点1102的右节点指针1156指向节点1104。节点1104具有01的节点关键字和1的搜索关键字部分标识符。来自节点1104的左节点指针1120是自指针,以及来自节点1104的右节点指针\n1122也是自指针。\n[0210] 来自根节点1100的右指针1116指向节点1106(其具有111的节点关键字和2的搜索关键字部分标识符)。来自节点1106的左节点指针1158指向节点1108,以及来自节点\n1106的右节点指针1132是自指针。节点1108具有1101100的节点关键字和5的搜索关键字部分标识符。来自节点1108的左节点指针1160指向节点1110。节点1110具有1101101的节点关键字和6的搜索关键字部分标识符。来自节点1110的左节点指针1124是至节点\n1108的祖先指针,以及来自节点1110的右节点指针1126是自指针。来自节点1108的右节点指针1162指向节点1112。节点1112具有11011101的节点关键字和5的搜索关键字部分标识符。来自节点1112的左节点指针1128是自指针,以及来自节点1112的右指针1130也是自指针。\n[0211] 形成图11的结构涉及将具有01的节点关键字和1的搜索关键字部分标识符的额外的节点1104插入到图10的结构中。当对应于将被插入节点的节点关键字的搜索关键字\n01既不严格匹配已经在树中的节点的节点关键字中的任一个也不以该节点关键字中的任一个为其前缀、或不是该节点关键字中的任一个的前缀时,将根据图9中示出的过程C来执行该插入。\n[0212] 新节点的插入涉及使用01的搜索关键字搜索图10的树。该搜索将导致节点\n1002(此处跟随有自指针1090)的遍历。在这种情况下,具有在特定位位置处不同于搜索关键字的节点关键字的节点是具有节点关键字00的节点1002。因此,如图11中所示,将该新节点插入到节点1002之下作为新节点1104。该节点不具有子树,所以创建至/来自节点1104的两个自指针,以及将来自节点1002的右指针1090调整为从节点1102至新节点\n1104的子指针1156。\n[0213] 图12示出根据本发明实施例的通过插入新节点来扩展图11的树结构。\n[0214] 形成图12的结构涉及将具有000的节点关键字和1的搜索关键字部分标识符的新节点1234插入到该结构中。在这种情况下,该新节点本身不是跳过前缀节点。然而,现有节点1202的节点关键字00是将被插入的关键字000的前缀。这意味着节点1202将被更新为跳过前缀节点。\n[0215] 额外节点的插入涉及使用000的搜索关键字搜索图11的树。使用关键字000的搜索将识别节点1102。根据图8中所示出的过程B,将为关键字000所添加的新节点添加到节点1102之下,在此处结束搜索。这在图12中被示出,其中,新插入的节点1234位于树中的节点1202之下。\n[0216] 为新插入的节点1234分配搜索关键字部分标识符,该搜索关键字部分标识符等于树中的新插入的节点之上的节点的搜索关键字部分标识符(步骤810),其在这种情况下是节点1102的搜索关键字部分标识符,即,等于1的搜索关键字部分标识符。\n[0217] 新节点1234之上的节点1202的节点关键字00是该新节点的节点关键字000的前缀,所以节点1202被更新为跳过前缀节点。\n[0218] 现在节点1202是跳过前缀节点的事实由其周围的点线菱形所表示。将来自根节点1100的左节点指针1114调整为指向1266树中的根节点之下的跳过前缀节点1202。将来自跳过前缀节点1202的左节点指针1118调整为指向节点1234。将来自跳过前缀节点1202的右节点指针1156调整为至树中该跳过前缀节点之上的根节点1200的跳回指针1236。\n[0219] 因为根节点的空节点关键字是树中所以其他节点的节点关键字,所以根节点也具有在其周围的点线菱形以表示其是跳过前缀节点。\n[0220] 指针1236是跳回节点指针的事实被图12中的虚线箭头符号表示。跳回节点指针\n1236指回节点1202之上的具有下一个被跳回前缀的节点的节点,其在这种情况下是具有空关键字的根节点1200。\n[0221] 如上所述,节点1202现在是跳过前缀节点,所以其搜索关键字部分标识符被更新为与其双亲的搜索关键字部分标识符相同,双亲在这种情况下是具有零的搜索关键字部分标识符的根节点1200(步骤812)。\n[0222] 在随后的搜索图12的结构期间,具有节点关键字00的跳过前缀节点1202将总被跳过,并且搜索处理将总直接继续前进以遍历具有节点关键字000的节点1234。\n[0223] 图13示出根据本发明实施例的通过插入又一跳过前缀节点来扩展图12的树结构。\n[0224] 形成图13的结构涉及将具有0的节点关键字的又一跳过前缀节点1338插入到该结构中。插入又一跳过前缀节点涉及使用0的搜索关键字搜索图12的树。搜索关键字0是节点1202的节点关键字00的前缀,所以使用搜索关键字0搜索将识别节点1202。根据如图7中所示的过程A将为关键字0所添加的新跳过前缀节点添加到节点1202之上,在此处搜索结束。这在图13中被示出,其中,新跳过前缀节点1338位于树中的节点1302之上。\n[0225] 该又一节点1338是跳过前缀节点,通过其周围的点线菱形所表示。将来自根节点\n1200的左节点指针1266调整为指向1370又一跳过前缀节点1338。创建来自又一跳过前缀节点1338的左节点指针1368以指向树中该又一跳过前缀节点之下的节点1302。创建来自又一跳过前缀节点1338的右指针1342作为至树中又一跳过前缀节点之上的根节点1300的跳回指针。\n[0226] 如通过跳回指针1340所示出的,将来自跳过前缀节点1202的跳回指针1236调整为指回其之上的下一个被跳回前缀的节点,其在这种情况下是节点1338。跳回指针1342指回节点1338之上的下一个被跳回前缀节点,其在这种情况下是具有空关键字的根节点\n1300。可以跟随该树向上的这个被跳过前缀指针的反向路径,以找到对于搜索关键字的潜在前缀匹配的序列。\n[0227] 如以前,又一跳过前缀节点1338继承与其双亲相同的搜索关键字部分标识符,双亲在这种情况下是具有零的搜索关键字部分标识符的根节点1300。在随后的搜索图13的结构期间,将跳过分别具有节点关键字0和00的跳过前缀节点1338和1302,并且搜索将直接继续前进以遍历具有节点关键字000的节点1334。\n[0228] 图14示出根据本发明实施例的通过插入又一跳过前缀节点来扩展图13的树结构。\n[0229] 形成图14的结构涉及将具有110的节点关键字的又一跳过前缀节点1442插入到该结构中。插入该新节点涉及使用110的搜索关键字搜索图13的树。搜索关键字110是节点1308的节点关键字1101100的前缀,所以使用搜索关键字110搜索该树将识别节点\n1308。\n[0230] 根据如图7中所示的过程A将被添加有节点关键字110的新跳过前缀节点添加到节点1308之上,在此处搜索结束。这在图14中被示出,其中,该新跳过前缀节点1442在树中位于节点1408之上。\n[0231] 将来自节点1306的左节点指针1374调整为指向1474新跳过前缀节点1442。创建从新跳过前缀节点1442指向树中该新跳过前缀节点之下的节点1408的左节点指针1472。\n创建来自新跳过前缀节点1442的右节点指针1444作为至根节点1400的跳过前缀指针。跳过前缀指针1444指回作为节点1442之上的下一个跳过前缀祖先的节点,其在这种情况下是具有空关键字的根节点1400。\n[0232] 如以前,新跳过前缀节点1442继承与其双亲相同的搜索关键字部分标识符,该双亲在这种情况下是具有2的搜索关键字部分标识符的节点1406。\n[0233] 图15示出根据本发明实施例的通过插入又一跳过前缀节点来扩展图14的树结构。\n[0234] 形成图15的结构涉及将具有11011的节点关键字的新的又一跳过前缀节点1546插入到该结构中。插入该新跳过前缀节点涉及使用搜索关键字11011搜索图14的树。搜索关键字11011是节点1408的节点关键字1101100的前缀,所以使用该搜索关键字搜索树识别了节点1408,其搜索关键字部分标识符指示超过五个位搜索关键字末尾的位。这里,将被插入的节点的节点关键字是在搜索中被找到的节点处的节点关键字,所以为搜索关键字\n11011将节点添加到节点1408之上,在此处搜索结束。\n[0235] 根据如图7中所示的过程A将添加有节点关键字11011的新跳过前缀节点添加到节点1408之上,在此处搜索结束。这在图15中被示出,其中,新跳过前缀节点1546位于树中的节点1508之上。\n[0236] 新跳过前缀节点1546是跳过前缀节点,通过在其周围的点线菱形所表示。将来自跳过前缀节点1442的左节点指针1472调整为指向1578树中该跳过前缀节点之下的新跳过前缀节点1546。创建来自新跳过前缀节点1546的左节点指针1576以指向树中该新跳过前缀节点之下的节点1508。创建来自新跳过前缀节点1546的右节点指针1580作为至树中该新跳过前缀节点之上的跳过前缀节点1542的跳过前缀指针。跳过前缀指针1580指回节点1546之上的下一个跳过前缀节点,其在这种情况下是节点1542。\n[0237] 如以前,新跳过前缀节点1546继承与其双亲相同的搜索关键字部分标识符,该双亲在这种情况下是具有二的搜索关键字部分标识符的跳过前缀节点1542。在随后的搜索图\n15的结构期间,将跳过分别具有节点关键字110和11011的跳过前缀节点1542和1546,并且搜索处理将继续前进以遍历具有节点关键字1101100的节点1508。\n[0238] 图16示出根据本发明实施例的通过插入另一跳过前缀节点来扩展图15的树结构。\n[0239] 形成图16的结构涉及将具有1的节点关键字的新跳过前缀节点1682插入到该结构中。插入该新节点涉及使用1的搜索关键字搜索图15的树。搜索关键字1是节点1606的节点关键字111的前缀,所以使用该搜索关键字搜索树识别了节点1506。\n[0240] 将来自根节点1500的右节点指针1588调整为指向1688新跳过前缀节点1682。\n创建来自新跳过前缀节点1682的右节点指针1684,指向树中该新跳过前缀节点之下的节点1606。创建来自新跳过前缀节点1682的左节点指针1686作为至根节点1600的跳过前缀指针。\n[0241] 根据图7中所示的过程A,将要为节点关键字1所添加的该新跳过前缀节点添加在搜索中所识别的节点1606之上。这在图16中被示出,其中,新跳过前缀节点1682位于树中的节点1606之上。\n[0242] 将来自节点1542的跳过前缀指针1544调整为指回1644节点1642之上的下一个跳过前缀节点,其在这种情况下是具有1的节点关键字的节点1682。注意到,在这种情况下的跳过前缀指针1644不指向树中节点1642的直接之上的节点1606,而是指向节点1644之上的节点1682。这是因为具有节点关键字111的节点1606自身不是跳过前缀节点,然而具有节点关键字1的节点1682是跳过前缀节点。\n[0243] 如以前,新跳过前缀节点1682继承与其双亲相同的搜索关键字部分标识符,该双亲在这种情况下是具有零的搜索关键字部分标识符的根节点1600。\n[0244] 可以看出图16中示出的扩展的树结构具有总共六个跳过前缀节点(包括根节点)。\n[0245] 能够通过使用搜索关键字执行搜索处理来搜索图16的扩展的树,以检查树是否包含对应于搜索关键字的节点关键字。现在描述对于多个不同搜索关键字的在根节点1600开始的搜索处理。搜索关键字中的零对应于左分枝,以及搜索关键字中的一对应于右分枝。\n当跟随至树中向上的节点的指针或跟随自指针、或被遍历的节点的搜索关键字部分标识符指示其超过正在讨论中的搜索关键字的末尾的位时,搜索结束。\n[0246] 实例搜索关键字:k=0100:\n[0247] 如图16中通过项1600所示出的,搜索处理起始于具有空关键字和0的搜索关键字部分标识符的根节点1600。搜索关键字的位0是零,所以搜索处理从那里沿着来自根节点1600的左节点指针向左分枝来遍历具有零的搜索关键字部分标识符的跳过前缀节点\n1638。搜索关键字的位零是零,所以搜索处理沿着来自跳过前缀节点1638的左节点指针向左分枝来遍历具有零的搜索关键字部分标识符的跳过前缀节点1634。搜索关键字的位零是零,所以搜索处理沿着来自跳过前缀节点1634的左节点指针向左分枝来遍历节点1606。\n现在搜索处理在具有1的搜索处理部分标识符的节点1606处。搜索关键字的位1是1,所以搜索处理沿着来自节点1606的右节点指针向右分枝来遍历节点1604。现在搜索处理在具有1的搜索关键字部分标识符的节点1604处。搜索关键字的位1是1,所以搜索处理沿着来自节点1604的右节点指针(其是至同一节点1604的自指针)向右分枝,所以搜索在这里结束。\n[0248] 将搜索关键字与该节点处的节点关键字进行比较导致直至节点关键字长度的匹配,即,搜索关键字的前两位匹配该节点处的节点关键字的两位。这意味着搜索关键字的前两位(即,01)是对于该搜索关键字的树中的最长前缀。\n[0249] 实例搜索关键字:k=0011:\n[0250] 通过图16中的项1600所示出,搜索处理起始于具有空关键字和0的搜索关键字部分标识符的根节点1600。搜索关键字的位0是零,所以搜索处理从那里沿着来自根节点\n1600的左节点指针向左分枝来遍历跳过前缀节点1638。现在搜索处理在具有零的搜索关键字部分标识符的跳过前缀节点1638处。搜索关键字的位零是零,所以搜索处理沿着来自跳过前缀节点1638的左节点指针向左分枝来遍历跳过前缀节点1634。现在搜索处理在具有零的搜索关键字部分标识符的跳过前缀节点1634处。搜索关键字的位零是零,所以搜索处理沿着从跳过前缀节点1634到节点1606的左节点指针向左分枝。现在搜索处理在具有\n1的搜索关键字部分标识符的节点1606处。搜索关键字的位1是0,所以搜索处理沿着来自节点1606的左节点指针(其是至同一节点1606的自指针)向左分枝,所以搜索在这里结束。\n[0251] 将搜索关键字与该节点处的节点关键字的比较不导致匹配。在搜索处理期间所遇到的最后一个跳过前缀节点是具有节点关键字00的节点1634。接下来,将搜索关键字与该节点处的节点关键字的进行比较,其中,可以看出搜索关键字的前两位匹配节点1634的节点关键字。这意味着搜索关键字的前两位(即,00)形成对于该搜索关键字的树中的最长的前缀。\n[0252] 实例搜索关键字:k=110111111:\n[0253] 通过图16中的项1600所示,搜索处理起始于具有空关键字和0的搜索关键字部分标识符的根节点1600。搜索关键字的位0是1,所以搜索处理在那里沿着来自根节点1600的右节点指针1688向右分枝来遍历跳过前缀节点1682。现在遍历处理在具有零的搜索关键字部分标识符的跳过前缀节点1682处。搜索关键字的位零是1,所以搜索处理沿着来自跳过前缀节点1682的右节点指针1684向右分枝来遍历节点1606。现在搜索处理在具有\n2的搜索关键字部分标识符的节点1606处。搜索关键字的位2是零,所以搜索处理沿着来自节点1606的左节点指针向左分枝来遍历节点1642。现在搜索处理在具有2所搜索关键字部分标识符的跳过前缀节点1642处。搜索关键字的位2是0,所以搜索处理沿着来自跳过前缀节点1642的左节点指针向左分枝来遍历跳过前缀节点1646。现在搜索处理在具有\n2的搜索关键字部分标识符的跳过前缀节点1646处。搜索关键字的位2是0,所以搜索处理沿着来自被跳过前缀1646的左节点指针向左分枝来遍历节点1608。现在搜索处理在具有5的搜索关键字部分标识符的节点1608处。搜索关键字的位5是1,所以搜索处理沿着来自节点1608的右节点指针向右分枝来遍历节点1612。现在搜索处理在具有5的搜索关键字部分标识符的节点1612处。搜索关键字的位5是1,所以搜索处理沿着来自节点1612的右节点指针(其是至节点1612的自指针)向右分枝,所以搜索在这里结束。\n[0254] 搜索关键字与该节点处的节点关键字的比较不导致匹配。在搜索期间所遇到的最后一个跳过前缀节点是具有节点关键字11011的节点1646。接下来,将搜索关键字与该节点处的节点关键字进行比较,其中,可以看出存在直至5位的节点关键字长度的匹配。这意味着搜索关键字的前5位(即,11011)形成对于该搜索关键字的树中的最长前缀。\n[0255] 实例搜索关键字:k=110101111:\n[0256] 按照先前的搜索实例继续进行对于该搜索关键字的搜索处理。在这里,然而不存在所遇到的最后一个跳过前缀节点(即,节点关键字11011的节点1646)处的节点关键字与搜索关键字的前五个数字(即,11010)之间的匹配。然后,跟随跳回节点指针1680到达搜索期间所遇到的先前跳过前缀节点,即,具有节点关键字110的节点1642。搜索关键字与节点1642处的节点关键字的比较导致直至节点关键字长度的匹配。这意味着搜索关键字的前三个数字(即,110)形成对于该搜索关键字的树中的最长前缀。\n[0257] 根据计算复杂度,本发明的结构和算法高效地执行。当树结构不包含具有不作为树中的任何其他节点关键字的前缀的节点关键字的节点时,为了搜索、还为了插入和删除节点,该树需要O(logn)的计算(大约与log n相同的计算)。\n[0258] 当树包含一个或多个跳过前缀节点时,搜索工作类似于传统搜索选择一列前缀来检查,后面是从最佳匹配至最坏匹配的这些前缀的线性扫描(scan)。因此,如果搜索经过p个‘被跳过前缀’的节点,则查找需要O(p+log n)的计算。\n[0259] 当所有其他节点关键字是树中的最长节点关键字的前缀时发生最坏情况的搜索情况。在这种情况下,树执行类似于单向链接的列表并且搜索需要O(n)=O(p)的计算。\n[0260] 插入和删除节点是通常的O(log n)。最坏情况的插入是O(n),因为需要子树的完全走遍以更新祖先指针。最坏情况的删除是O(nlog n)因为删除潜在地扰乱O(log n)个跳过前缀节点并且每次扰乱需要子树的类似走遍。然而,实际上,这些最坏的情况并不通常被遇到,并且在现实的压力下,已经发现插入和删除工作与对于O(log n)的计算的需求一致。\n[0261] 上述实施例将被理解为本发明的示例性实例。可以设想本发明的更多实施例。\n[0262] 例如,可以将本发明应用于需要快速数据库访问和更新的(例如,当网络正‘集中’或‘再集中’时,在对网络更新之后重新计算许多路由时)限制最短路径优先(CSPF)IP路由数据库中的节点地址的存储和检索。某些目的地被提供为前缀而不是完全明确的IP地址,并且因此将需要使用现有技术的Patricia算法和树结构由系统进行的具体处理,这意味这些系统以较慢的速率集中。\n[0263] 还可以将本发明应用于IP路由信息库(RIB)中的IP地址的存储和检索。这些数据库被IP路由协议(例如,开放最短路径优先(OSPF)、中间系统-中间系统(IS-IS)、路由选择信息协议(RIP)、边界网关协议(BGP)等)所填充,并代表通过那些路由协议所分发的所有IP地址前缀和可及的IP地址。\n[0264] 本发明还发现在其中可以包括IP地址前缀和全长IP地址的混合的IP路由转发信息库(FIB)中的IP地址的存储和检索中的应用。这是路由器已知的所有RIB的复合,并且能够被用于填充硬件中的IP转发表。\n[0265] 本发明的范围不应当被限于IP路由应用。还可以将本发明应用于期望搜索所存储的数据而实际上不访问那些数据的任何应用中。例如,数据值可以被存储到难以访问的位置(诸如老的或慢的硬件、或其可能具有限制的网络带宽、或其可以是按访问支付(pay-per-access)、或法律限制存在(诸如版权)等)中。需要存储算法来在这些数据值中搜索而实际上并不存储数据值自身的复本或不必要地对它们进行访问。本发明使这个能仅需要对搜索结果的单独访问。\n[0266] 可以应用本发明,用于诸如分类法领域中的层次表示法中的前缀匹配。通过利用本发明可以高效地表示和搜索一大类生物学数据。能够表示(例如)现代Linnaean分类法中所有种类,以及关于特定物种/亚种的搜索将产生正好的匹配或关于目前被存储的大部分具体目/科/属/种的匹配。\n[0267] 本发明可以被应用在来自电话号簿的条目的存储和检索。在前缀可以是表示电话拨号码或局部区域的前几个数字的情况下,能够高效地列出特定区域中的所有条目。本发明甚至准许关于具有上亿条目的大数据库(诸如当前全球分配的所有电话号码)的快速检索。这里,在确定关于查找次数的界限的过程中,仅仅正被搜索的关键字的长度是重要的。\n数据库中其他非前缀的关键字的数目对查找次数没有影响。\n[0268] 能够将本发明应用在需要非常长的关键字的快速操作和期待不依赖于关键字长度的操作的应用中。例如,本发明能够被用于仅使用每本书的少量数据结构存储来索引版权图书馆中的所有书籍。给出任意书籍的第一页或全部文本,本发明的前缀匹配特性能够被用于快速确定是否存储了匹配的书籍。本发明能够被用于快速确定实例文本是否存在于大量同样长度的文本中所存储的的几乎同样的版本中。这能够发现在当代扫描和文本阅读技术中、或手工复制(hand-copied)远古文本等的比较分析中的特定应用。\n[0269] 可以将本发明应用在需要高效搜索和更新关键字的大量数据库的任何地方。这能(例如)包括当前在特定状态内对于每个个体的大量生物统计数据。接下来,通过本发明所构造的搜索树能够起隔离中心数据库的作用。例如,本发明能够被用于索引并搜索关于移动装置的大量中心数据库而不保持或访问关于任何移动装置的数据库的任何实际内容。\n[0270] 上面的描述主要涉及以二进制符号表示诸如节点关键字、搜索关键字的多种数据的情形。使用其他数据符号(例如,字母数字符号)同样可应用本发明。\n[0271] 在本文中,路由和转发被描述为两个截然不同的处理。然而,在某些实现中可以组合路由和转发,并且本发明能够同样地应用到这种组合的实现。\n[0272] 上面的描述描述了关于IPv4或IPv6数据的本发明的使用,但本发明可以与任何网际协议或其他合适数据格式或协议一起被使用。\n[0273] 应当理解,关于任何一个实施例所描述的任何特征可以被单独地或与所描述的其他特征组合地使用,并且还可以与任何其他实施例的一个或多个特征组合、或与任何其他实施例的任何组合被使用。此外,在不背离由所附权利要求中所定义的本发明的范围的情况下,还可以使用上面未描述的等同和修改。
法律信息
- 2014-06-11
- 2012-05-02
著录事项变更
申请人由数据连接有限公司变更为迈塔斯威士网络有限公司
地址由英国恩菲尔德变更为英国米德尔塞克斯郡
- 2010-09-22
实质审查的生效
IPC(主分类): G06F 17/30
专利申请号: 200810149667.2
申请日: 2008.09.16
- 2009-03-18
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2006-06-07
|
2004-03-26
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |