CN109885840A - 通过16位Trie树实现空间优化的词典排序方法 - Google Patents
通过16位Trie树实现空间优化的词典排序方法 Download PDFInfo
- Publication number
- CN109885840A CN109885840A CN201910165993.0A CN201910165993A CN109885840A CN 109885840 A CN109885840 A CN 109885840A CN 201910165993 A CN201910165993 A CN 201910165993A CN 109885840 A CN109885840 A CN 109885840A
- Authority
- CN
- China
- Prior art keywords
- node
- chain
- dictionary
- pointer
- class
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 29
- 238000005457 optimization Methods 0.000 title claims abstract description 11
- 238000003780 insertion Methods 0.000 claims abstract description 20
- 230000037431 insertion Effects 0.000 claims abstract description 20
- 229920003266 Leaf® Polymers 0.000 claims description 21
- 239000011800 void material Substances 0.000 claims 2
- 238000010276 construction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种通过16位Trie树实现空间优化的词典排序方法,该方法包括以下步骤:创建空的Trie树和空的排序链表;关键字依次***;既生成Trie树又完成了字典排序。本字典算法呈树形,并且每个节点使用16位(bit)表示子节点的情况,因此命名为16位字典树算法。生成16位Trie树的词典时,每***一个关键字key就创建一个链节点,同时根据其关键字key对链表进行有序***。另外,与快速排序算法相比,16位Trie树字典排序算法可随时进行动态排序,而且在构建的同时就能够完成字典的排序,让无序的数据组合变成有序的数据组合,大大节约了额外的排序时间。
Description
技术领域
本发明属于数据结构和信息检索领域,尤其涉及一种通过16位Trie树实现空间优化的词典排序方法。
背景技术
排序是对数据处理的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。近年来,随着互联网的快速发展和智能移动设备的大量普及,尤其是大数据时代的到来,由于网络信息量过于庞大,检索结果信息过多,有用信息不全,检索结果缺乏个性化,在信息检索领域,如何更好地检索到与用户检索请求相匹配的信息是一个值得研究的问题。通常,检索***往往会采用一定的排序算法对与用户检索请求相关的信息进行排序。16位Trie树词典排序算法是在16位Trie树结构上进行的一种排序算法,其特点是在进行16位Trie树构建的同时完成词典排序。
快速排序算法是冒泡排序的改进版,是目前最快的排序方法。快速排序与16位Trie树词典排序算法相比,首先时间上略慢,而且不能处理频繁的更新,每一次更新排序都需要重新分配内存空间进行排序,造成了时间上的浪费,第二,16位Trie树词典排序算法不需要数据移动,***即是有序,基本上不存在数据移动的问题,与***排序算法相比,16位Trie树词典排序算法不需要查找大量数据确定***位置,而是借助Trie树的临近有效节点即可读取排序***的位置,因此,该算法在时间上更胜一筹。
与快速排序算法相比,16位Trie树字典排序算法可随时进行动态排序,而且在构建的同时就能够完成字典的排序,让无序的数据组合变成有序的数据组合,大大节约了额外的排序时间。
发明内容
为了解决上述技术问题,本发明提供一种通过16位Trie树实现空间优化的词典排序方法,该方法包括以下步骤:创建空的Trie树和空的排序链表;关键字依次***;既生成Tire树又完成了字典排序。本字典算法呈树形,并且每个节点使用16位(bit)表示子节点的情况,因此命名为16位字典树算法。生成16位Trie树的词典时,每***一个关键字key就创建一个链节点,同时根据其关键字key对链表进行有序***。另外,与快速排序算法对比,16位Trie树字典排序算法可随时进行动态排序,而且在构建的同时就能够完成字典的排序,让无序的数据组合变成有序的数据组合,大大节约了额外的排序时间。
为此,本发明实施例公开了一种通过16位Trie树实现空间优化的词典排序方法。该方法包括以下步骤:创建空的Trie树和空的排序链表;关键字key依次***;既生成Tire树又完成了字典排序。
优选地,所述的16位Trie树的词典数据中以类bitNode作为节点类,以类LinkList作为链节点类,以类bitIndex作为管理类。
优选地,所述类bitIndex中用root来表示根节点,仅有一个根节点。
优选地,所述16位Trie树中的节点用leafs数组表示当前存储的子节点指针以及链节点指针,其中子节点指针指向当前节点所对应的子节点,链节点指针指向当前节点所对应的链节点,当子节点不存在并且链节点指针也不存在时,leafs元素个数为0,当子节点存在时,leafs元素个数为子节点数量+1(其中链节点指针占用一个元素)。
优选地,所述节点是否为有效节点用hasData表示,0表示为非有效节点,1表示为有效节点。
优选地,所述索引包括以下步骤:
a.创建空的Trie树和空的排序链表;
b.获取到关键字key的第一个字节的值,并获得该字节的高4位值high_4bits,通过当前节点查询表示高4位节点值的子节点是否存在,若对应的子节点存在,获得该高4位节点,并继续以同样方法查询该字节低4位节点,否则***新节点pBitNode,直到关键字key所有字节***为止;
c.在进行新节点pBitNode***时,同时用变量ParentNode标记满足以下两个条件的节点记做父节点:该节点是支链上的有效节点(hasData = 1),或者在该支链上有两个以上子节点(包含两个)的父节点;
d.当关键字key完成最后一个节点***时,该节点记作pNewNode,通过标记的父节点ParentNode和当前节点pNewNode获得距离当前节点最近的有效节点,若该最近有效节点存在,则取得该有效节点leafs数组上的链节点指针,记作pListNode链节点,新建一个链节点,在pListNode链节点之前或之后***新建的链节点,同时在当前节点pNewNode的leafs数组上存储新建的链节点指针(方便定位有效节点的链节点位置);
e.若该最近有效节点不存在,则新建一个链节点,在排序链表头节点pHead之后***新建的链节点,同时在当前节点pNewNode的leafs数组上存储新建的链节点指针;
优选地,所述排序为:生成的链为其所有关键字key从小到大对应的排序结果。
本发明提供一种通过16位Trie树实现空间优化的词典排序方法,该方法包括以下步骤:创建空的Trie树和空的排序链表;关键字依次***;既生成Tire树又完成了字典排序。本字典算法呈树形,并且每个节点使用16位(bit)表示子节点的情况,因此命名为16位字典树算法。生成16位Trie树的词典时,每***一个关键字key就创建一个链节点,同时根据其关键字key对链表进行有序***。另外,与快速排序算法对比,16位Trie树字典排序算法可随时进行动态排序,而且在构建的同时就能够完成字典的排序,让无序的数据组合变成有序的数据组合,大大节约了额外的排序时间。
应当理解,以上总体说明和以下详细说明都是说明性和实例性的,旨在提供对所要求的本发明的进一步说明。
附图说明
图1是本发明实施例根据关键字key的当前状态实现排序的模块图。
图2是本发明实施例中词典数据Trie树的构造图。
图3是本发明实施例中词典数据Trie树的排序链表图。
图4是本发明实施例通过16位Trie树实现空间优化的词典排序方法的流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所述描述的具体实施例仅仅用于解释本发明,并不用于限定本发明。
本发明实施例提供的通过16位Trie树实现空间优化的词典排序方法。
如图1所示,是本发明实施例通过16位Trie树实现空间优化的词典排序方法的模块图。
步骤S110:创建空的Trie树(根节点root),创建空的排序链表(pHead-pRear)。
***关键字key,例如:要***如下的关键字:de,fg,ab,yf,a,dec,dea,ta,fc,fy。
步骤S120:关键字依次***。
如图2所示,为16位Trie树的最终构建结果。根据上例中的关键字数据,这些词之间存在着一些共同的前缀(即相同的父节点),按照这些前缀可以组成一个字典树,树的结点做如下说明:
虚线圆代表非有效节点(即该节点hasData = 0);
实线圆代表树的有效节点(即该节点hasData = 1);
从树的根部root节点到当前有效节点构成的词是词典中的一条完整词条;
节点中用hasData表示当前节点是否为有效节点,0表示为非有效节点,1表示是有效节点。
步骤S121:以上16位Trie树的构建包括以下步骤。
步骤S122:以根节点root构建关键字为“de,fg,ab,yf,a,dec,dea,ta,fc,fy”的16位Trie树链表。
步骤S123:获取第一个关键字“de”的第一个字节‘d’,并取得‘d’的高4位值6,通过根节点查询表示节点值为6的子节点是否存在,若存在,则获得‘d’的高4位节点;若不存在,则***‘d’的高4位节点,若根节点是有效节点或者有两个以上子节点(包含两个)的父节点,则用变量ParentNode进行标记,再将‘d’的高4位节点作为根节点,同理查询‘d’的低4位节点,直到关键字“de”所有字节***为止。
步骤123伪代码如下:
while (uKeyLen--)
{
pPNode = pNewNode; //高四位
pNewNode = pNewNode->AddChildNode((*pchKey) >> 4);
//标记父节点
if (pPNode->LeafsCount() > 1 || pPNode->mbHasData)
{ //标记父节点下的有效节点值
pParentNode = pPNode;
pVaildNodeValue = ((*pchKey) >> 4);
}
pPNode = pNewNode; //低四位
pNewNode = pNewNode->AddChildNode((*pchKey) & 0x0F);
//标记父节点
if (pPNode->LeafsCount() > 1 || pPNode->mbHasData)
{
pParentNode = pPNode;
pVaildNodeValue = ((*pchKey) & 0x0F);
}
pNewNode->mbIsEndNode = true;
pchKey++;
}。
步骤S125:当关键字“de”完成‘e’的低四位节点***时,该‘e’的低四位节点记作pNewNode1,根据pNewNode1和父节点判断距离pNewNode1最近的有效节点不存在,则新建一个链节点ListNode(de),在头节点pHead后面进行***,同时在pNewNode1节点的leafs数组上存储新建的链节点指针(方便定位链节点位置);
当前的排序链表为:pHead-ListNode(de)-pRear。
步骤S126:继续***上例中第二个关键字“fg”,当“fg”完成‘g’的低四位节点***时,该‘g’的低四位节点记作pNewNode2,根据pNewNode2和父节点判断距离pNewNode2最近的有效节点为pNewNode1,判断pNewNode1比pNewNode2节点值小,则取pNewNode1节点的leafs数组上的ListNode(de)链节点指针,新建一个链节点ListNode(fg),在ListNode(de)链节点之后***新建的链节点,同时在pNewNode2的leafs 数组上存储新建的链节点指针;
当前的排序链表为:pHead-ListNode(de)-ListNode(fg)-pRear。
步骤125伪代码如下:
if(存在最近有效节点)
{
if (最近有效节点在当前节点之后)
{
读最近有效节点的leafs数组上的链节点指针,
记pMaxListNode节点;
在pMaxListNode节点之前进行***新建的链节点;
在当前节点的leafs数组上保存新建链节点指针;
}
else //最近有效节点在当前节点之前
{
读最近有效节点的leafs数组上的链节点指针,
记pMinListNode节点;
在pMinListNode节点之后进行***新建的链节点;
在当前节点的leafs数组上保存新建的链节点指针;
}
}
else //最近有效节点不存在
{
头节点之后直接***新建的链节点;
当前节点的leafs数组上保存新建的链节点指针;
}。
继续***上例中的第三个关键字“ab”,重复上述步骤直到上例中全部关键字***为止;
最终的的链表排序结果为:pHead-ListNode(a)-ListNode(ab)-ListNode(de)-ListNode(dea)-ListNode(dec)-ListNode(fc)-ListNode(fg)-ListNode(fy)-ListNode(ta)-ListNode(yf)-pRear。
步骤S130:既生成Tire树又完成了词典排序;
生成的排序链表如图3所示,是所有关键字key从小到大对应的排序结果。
根据上述对本发明的实施例的具体描述,可以清楚地理解根据本发明提供一种通过16位Trie树实现空间优化的词典排序方法,该方法包括以下步骤:创建空的Trie树和空的排序链表;关键字依次***;既生成Tire树又完成了字典排序。本字典算法呈树形,并且每个节点使用16位(bit)表示子节点的情况,因此命名为16位字典树算法。生成16位Trie树的词典时,每***一个关键字key就创建一个链节点,同时根据其关键字key对链表进行有序***,另外,与快速排序算法对比,16位Trie树字典排序算法可随时进行动态排序,而且在构建的同时就能够完成字典的排序,让无序的数据组合变成有序的数据组合,大大节约了额外的排序时间。
Claims (10)
1.通过16位Trie树实现空间优化的词典排序方法,其特征是按照如下步骤进行:
创建空的Trie树和空的排序链表;
关键字key依次***;
既生成Tire树又完成了字典排序。
2.根据权利要求1所述的方法,其特征在于,所述的16位Trie树的词典数据中以类bitNode作为节点类,以类LinkList作为链节点类,以类bitIndex作为管理类。
3.根据权利要求1或权利要求2所述的方法,其特征在于,类bitNode中公有数据成员包含节点的所有信息,其中主要数据信息有:
leafsInfo:子节点列表信息;
nodeValue:当前节点所代表的值;
hasData :当前节点是否为有效节点;
endkey:当前节点是否为终端节点;
leafs:保存子节点指针以及链节点指针。
4.根据权利要求1或权利要求2所述的方法,其特征在于,类LinkList中私有数据成员包含链节点的信息,其中主要数据信息有:
Node* pHead; //头节点
Node* pRear; //尾节点。
5.根据权利要求4所述的方法,其特征在于,类LinkList中的Node节点类型是自定义的结构体,结构体的成员数据信息有:
typedef struct Node
{
void* mpData; //存储关键字key对应的数据;
void* mpKey; //存储关键字key;
int mCount; //记录当前链节点数量
Node* pNext; //查找链节点后继;
Node* pPrive; //查找链节点前驱;
}。
6.根据权利要求1或权利要求2的方法,其特征在于,类bitIndex中用root来表示根节点,有且仅有一个根节点。
7.根据权利要求1或权利要求3所述的方法,其特征在于,所述16位Trie树中的节点用leafs数组表示当前存储的子节点指针以及链节点指针,其中子节点指针指向当前节点所对应的子节点,链节点指针指向当前节点所对应的链节点,当子节点不存在并且链节点指针也不存在时,leafs元素个数为0,当链节点存在时,leafs元素个数为子节点数量+1(其中链节点指针占用一个元素)。
8.根据权利要求1或权利要求3所述的方法,其特征在于,所述节点是否为有效节点用hasData表示,0表示为非有效节点,1表示为有效节点。
9.根据权利要求1的方法,其特征在于,所述排序包括以下步骤:
a.创建空的Trie树和空的排序链表;
b.获取到关键字key的第一个字节的值,并获得该字节的高4位值high_4bits,通过当前节点查询表示高4位节点值的子节点是否存在,若对应的子节点存在,获得该高4位节点,并继续以同样方法查询该字节低4位节点,否则***新节点pBitNode,直到关键字key所有字节***为止;
c.在进行新节点pBitNode***时,同时用变量ParentNode标记满足以下两个条件的节点记做父节点:该节点是支链上的有效节点(hasData = 1),或者在该支链上有两个以上子节点(包含两个)的父节点;
d.当关键字key完成最后一个节点***时,该节点记作pNewNode,通过标记的父节点ParentNode和当前节点pNewNode获得距离当前节点最近的有效节点,若该最近有效节点存在,则取得该有效节点leafs数组上的链节点指针,记作pListNode链节点,新建一个链节点,在pListNode链节点之前或之后***新建的链节点,同时在当前节点pNewNode的leafs数组上存储新建的链节点指针(方便定位有效节点的链节点位置);
e.若该最近有效节点不存在,则新建一个链节点,在排序链表头节点pHead之后***新建的链节点,同时在当前节点pNewNode的leafs数组上存储新建的链节点指针。
10.根据权利要求1或权利要求11所述的方法,其特征在于,所述排序为:生成的链为其所有关键字key从小到大对应的排序结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910165993.0A CN109885840A (zh) | 2019-03-06 | 2019-03-06 | 通过16位Trie树实现空间优化的词典排序方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910165993.0A CN109885840A (zh) | 2019-03-06 | 2019-03-06 | 通过16位Trie树实现空间优化的词典排序方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109885840A true CN109885840A (zh) | 2019-06-14 |
Family
ID=66930799
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910165993.0A Pending CN109885840A (zh) | 2019-03-06 | 2019-03-06 | 通过16位Trie树实现空间优化的词典排序方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109885840A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110569399A (zh) * | 2019-11-07 | 2019-12-13 | 四川新网银行股份有限公司 | 基于pinpoint日志的链路构建方法 |
-
2019
- 2019-03-06 CN CN201910165993.0A patent/CN109885840A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110569399A (zh) * | 2019-11-07 | 2019-12-13 | 四川新网银行股份有限公司 | 基于pinpoint日志的链路构建方法 |
CN110569399B (zh) * | 2019-11-07 | 2020-03-06 | 四川新网银行股份有限公司 | 基于pinpoint日志的链路构建方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5930805A (en) | Storage and retrieval of ordered sets of keys in a compact 0-complete tree | |
CN111190904B (zh) | 一种图-关系数据库混合存储的方法和装置 | |
US8849876B2 (en) | Methods and apparatuses to optimize updates in a file system based on birth time | |
CA2434081C (en) | Data structures utilizing objects and pointers in the form of a tree structure | |
CN109471905B (zh) | 一种支持时间范围和属性范围复合查询的区块链索引方法 | |
US7526497B2 (en) | Database retrieval apparatus, retrieval method, storage medium, and program | |
US20060026138A1 (en) | Real-time indexes | |
JP2002501256A (ja) | データベース装置 | |
CN108197313B (zh) | 通过16位Trie树实现空间优化的词典索引方法 | |
AU2002249161A1 (en) | Data structure for information systems | |
US9065469B2 (en) | Compression match enumeration | |
CN111581215B (zh) | 数组树数据储存方法、快速查找方法及可读储存介质 | |
CN103051543A (zh) | 一种路由前缀的处理、查找、增加及删除方法 | |
CN100511229C (zh) | 一种域名类信息的存储及查询方法以及*** | |
CN109597829B (zh) | 一种实现可搜索加密关系型数据库缓存的中间件方法 | |
US20110029478A1 (en) | Stream Star Schema and Nested Binary Tree for Data Stream Analysis | |
KR101255639B1 (ko) | 컬럼 기반 데이터베이스 시스템 및 데이터베이스 시스템의 조인 인덱스를 이용한 조인 처리 방법 | |
CN114064984A (zh) | 一种基于稀疏数组链表的世界状态增量更新方法及装置 | |
CN108153907B (zh) | 通过16位Trie树实现空间优化的词典存储管理方法 | |
CN109885840A (zh) | 通过16位Trie树实现空间优化的词典排序方法 | |
CN108984626A (zh) | 一种数据处理方法、装置及服务器 | |
CN110995876B (zh) | 一种ip存储与查找的方法及装置 | |
US20030084031A1 (en) | System and method for searching a signature set for a target signature | |
Lin et al. | A multi-index hybrid trie for lookup and updates | |
CN109241098B (zh) | 一种分布式数据库的查询优化方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190614 |