技术领域
[0001] 本
发明涉及
数据处理领域,尤其是涉及一种新型链式哈希表构建方法及装置。
背景技术
[0002] 哈希表,又名散列表,是根据key而直接
访问在内存存储
位置的数据结构。如图1所示,
现有技术的构建方案基本能满足
节点插入、删除、查询等操作的o(1)的时间复杂度,但是在特殊操作需求的场景下并不是最优解。比如:
[0003] (1)获取哈希表的第一个节点;
[0004] (2)遍历哈希表的所有节点;
[0005] 在实现场景(1)获取链表的第一个节点的需求时,往往需要遍历哈希桶,从索引0开始,判断桶索引对应的节点开链是否存在,返回存在的第一个节点。因此,这个操作的时间复杂度在最坏的情况下为o(k),其中k为哈希桶的桶长度。
[0006] 同理,在实现场景(2)的遍历链表所有节点的需求时,同样需要从桶索引0开始遍历,判断每个桶索引对应的节点是否存在链表。因此场景2的操作的时间复杂度为0(k+m),k为哈希桶的桶长度,m为整个哈希表内的节点数。
[0007] 现有技术在实现上述操作的时间复杂度较高,计算机计算工作量大,工作效率较低。
发明内容
[0008] 本发明的目的在于克服现有技术的缺点与不足,提供一种能快速获取首节点、以及遍历所有节点的新型链式哈希表构建方法及装置。
[0009] 一种新型链式哈希表构建方法,包括以下步骤:
[0010] 在哈希表中设置若干个哈希桶,使每个哈希桶分别对应一个哈希地址;将数据存储至相应的哈希桶并在哈希桶中形成链表,所述哈希桶中设有指向链表的索引
指针;
[0011] 在所述哈希表引入一个新的头节点,所述头节点始终指向哈希表逻辑意义上的第一个节点;
[0012] 将上述每一个哈希桶中链表的最后一个节点指向逻辑顺序上的下一个哈希桶中链表的第一个节点。
[0013] 相对于现有技术,本发明通过引入一个新的头节点,将该头节点与哈希表中的数据节点构成一条单向链表,从而在遍历哈希表所有节点时根据该单向链表即可完成,无需遍历哈希桶和判断各个哈希桶中是否开链来遍历节点,降低了遍历哈希表所有节点操作的时间复杂度,提高了计算机工作效率。
[0014] 进一步地,在将每一个哈希桶中链表的最后一个节点指向逻辑顺序上的下一个哈希桶中链表的第一个节点的步骤之前,将每个哈希桶的索引指针指向逻辑顺序上的上一个哈希桶中链表的最后一个节点,实现在不改变原有哈希表的对桶索引的数据的插入、查询、删除等操作的情况下进行快速遍历哈希表节点。
[0015] 进一步地,将数据存储至相应的哈希桶并在哈希桶中形成链表的步骤包括:
[0016] 将待存储数据中存储在若干个节点中;
[0017] 获取该数据的键值,将上述键值经哈希运算得到相应的哈希地址,将所述哈希地址作为哈希桶的索引;在哈希表中设置尾指针,所述尾指针指向链表的最后一个逻辑节点;判断该哈希桶是否存在开链,若该哈希桶不存在开链,将桶索引指向尾指针指向的节点,同时
修改尾指针指向新插入的节点;若该哈希桶存在开链,采用链地址法将新节点插入到桶索引指针指向的节点和该节点指向的下一个节点之间,通过上述方式,方便在本发明中快速获取哈希桶中的第一个节点。
[0018] 本发明还提供了一种新型链式哈希表构建装置,所述新型链式哈希表构建装置包括:
[0019] 数据存储模
块,用于在哈希表中设置若干个哈希桶,使每个哈希桶分别对应一个哈希地址;将数据存储存储至相应的哈希桶并在哈希桶中形成链表,所述哈希桶中设有指向链表的索引指针;
[0020] 头节点设置模块,用于在所述哈希表引入一个新的头节点,所述头节点始终指向哈希表逻辑意义上的第一个节点;
[0021] 节点指向模块,用于将上述每一个哈希桶中链表的最后一个节点指向逻辑顺序上的下一个哈希桶中链表的第一个节点。
[0022] 相对于现有技术,本发明通过设置数据存储模块、头节点设置模块和节点指向模块引入了一个新的头节点,并将该头节点与哈希表中的数据节点构成一条单向链表,从而在遍历哈希表所有节点时根据该单向链表即可完成,无需遍历哈希桶和判断各个哈希桶中是否开链来遍历节点,降低了计算机遍历哈希表所有节点操作的时间复杂度,提高了计算机工作效率。
[0023] 进一步地,所述新型链式哈希表构建装置还包括索引指针指向模块,所述哈希桶索引模块用于将每个哈希桶的索引指针指向逻辑顺序上的上一个哈希桶中链表的最后一个节点,实现在不改变原有哈希表的对桶索引的数据的插入、查询、删除等操作的情况下进行快速遍历哈希表节点。
[0024] 进一步地,所述数据存储模块具体包括:节点存储单元,用于将待存储数据中存储在若干个节点中;
[0025] 节点插入单元,用于获取该数据的键值,将上述键值经哈希运算得到相应的哈希地址,将所述哈希地址作为哈希桶的索引;在哈希表中设置尾指针,所述尾指针指向链表的最后一个逻辑节点;判断该哈希桶是否存在开链,若该哈希桶不存在开链,将桶索引指向尾指针指向的节点,同时修改尾指针指向新插入的节点;若该哈希桶存在开链,采用链地址法将新节点插入到桶索引指针指向的节点和该节点指向的下一个节点之间,通过上述方式,方便在本发明中快速获取哈希桶中的第一个节点。
[0026] 为了更好地理解和实施,下面结合
附图详细说明本发明。
附图说明
[0027] 图1是现有的哈希表中哈希桶与链表存储结构示意图;
[0028] 图2是本发明
实施例1中一种新型链式哈希表构建方法中哈希表存储结构示意图;
[0029] 图3是本发明实施例1中S12步骤中哈希桶不存在开链情况下插入新节点的结构示意图;
[0030] 图4是本发明实施例1中S12步骤中哈希桶存在开链情况下插入新节点的结构示意图;
[0031] 图5是本发明实施例1中一种新型链式哈希表构建方法的
流程图;
[0032] 图6是本发明实施例2中一种新型链式哈希表构建装置的结构
框图。
具体实施方式
[0033] 实施例1
[0034] 请参阅图1-5,其是本发明实施例中的一种新型链式哈希表构建方法的结构示意图。
[0035] 一种新型链式哈希表构建方法,包括以下步骤:
[0036] S1:在哈希表中设置若干个哈希桶,使每个哈希桶分别对应一个哈希地址;将数据存储存储至相应的哈希桶并在哈希桶中形成链表,所述哈希桶中设有指向链表的索引指针;
[0037] S2:在所述哈希表引入一个新的头节点,所述头节点始终指向哈希表逻辑意义上的第一个节点,即第一个插入哈希表的节点;
[0038] S3:将上述每一个哈希桶中链表的最后一个节点指向逻辑顺序上的下一个哈希桶中链表的第一个节点。其中,所述链表的节点包括两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址。在本实施例中,所述哈希表的最后一个节点指向一个空节点。
[0039] 在计算机科学中,
算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。时间复杂度越低,则执行算法所需要的计算工作量越低,算法的性能更优。
[0040] 在一个实施例中,在将每一个哈希桶中链表的最后一个节点指向逻辑顺序上的下一个哈希桶中链表的第一个节点的步骤之前,将每个哈希桶的索引指针指向逻辑顺序上的上一个哈希桶中链表的最后一个节点,此时上一个哈希桶链表中的最后一个节点又指向逻辑顺序上下一个哈希桶链表中的第一个节点,即保证了每一个哈希桶至少链接有一节点,使得计算机在对哈希表进行插入、查询和删除操作时,无需对判断哈希桶下是否为空桶,降低了操作的时间复杂度,优化计算机的计算性能。本案中可通过程序bucket[idx]->next->next,其中bucket[idx]为各个哈希桶的索引指针,即可快速查找到每个哈希桶对应的节点,实现在不影响原有哈希表的对桶索引的数据的插入、查询、删除等操作的时间复杂度的情况下快速遍历哈希表节点。在另一个实施例中,所述索引指针也可指向哈希桶下的链表的第一个节点。
[0041] 在本实施例中,将数据存储存储至相应的哈希桶并在哈希桶中形成链表的步骤具体包括:
[0042] S11:将待存储数据中存储在若干个节点中;
[0043] S12:获取该数据的键值,将上述键值经哈希运算得到相应的哈希地址,所述哈希地址为桶索引下标;在哈希表中设置尾指针,所述尾指针指向链表的最后一个逻辑节点;判断该哈希桶是否存在开链;若该哈希桶不存在开链,将桶索引指向尾指针指向的节点,同时修改尾指针指向新插入的节点;若该哈希桶存在开链,采用链地址法将新节点插入到桶索引指针指向的节点和该节点指向的下一个节点之间。
[0044] 如图3所示,其为在不存在开链的索引7哈希桶处插入新节点过程的结构示意图,通过先将桶索引指针指向尾指针tail指向的节点,再将尾指针tail指向的节点的指针指向新插入节点;最终将尾指针tail指向新插入节点的方式完成新节点的插入。
[0045] 如图4所示,其为在存在开链的索引7哈希桶处插入新节点的过程的结构示意图;通过链地址法将新节点插入到桶索引指针指向的节点和该节点指向的下一个节点之间。上述方式保证了在本发明中始终可通过该程序bucket[idx]->next->next以快速获取哈希桶中的第一个节点。在本步骤中,获取关键值的方式可以采用现有技术中获取键值的方式进行键值的获取。具体的哈希计算过程也不做具体限定。
[0046] 本发明所述的一种新型链式哈希表构建方法,对于获取哈希表的第一个节点和遍历哈希表所有节点时,无需判断各个哈希桶中的节点是否开链,降低了遍历哈希表所有节点操作的时间复杂度,计算机在执行以下操作时具有更优的性能:
[0047] (1)返回哈希表的第一个节点:本案中直接返回头节点指向的节点即为哈希表的第一个节点,此操作的时间复杂度为O(1)。
[0048] (2)遍历哈希表所有节点:由于在新的设计方案中,所有的哈希表节点和头节点构成了一条单向链表,因此该操作的时间复杂度变成了O(m),其中m为哈希表的节点数。
[0049] 相对于现有技术,本发明通过引入一个新的头节点,将该头节点与哈希表中的数据节点构成一条单向链表,从而在遍历哈希表所有节点时根据该单向链表即可完成,无需遍历哈希桶并判断各个哈希桶中是否开链来遍历节点,降低了遍历哈希表所有节点操作的时间复杂度,提高了计算机工作效率。
[0050] 实施例2
[0051] 如图6所示,一种新型链式哈希表构建装置,包括:
[0052] 数据存储模块1,用于在哈希表中设置若干个哈希桶,每个哈希桶分别对应一个哈希地址;将数据存储存储至相应的哈希桶并在哈希桶中形成链表,所述哈希桶中设有指向链表的索引指针;
[0053] 头节点设置模块2,用于在所述哈希表引入一个新的头节点,所述头节点始终指向哈希表逻辑意义上的第一个节点;
[0054] 节点指向模块3,用于将上述每一个哈希桶中链表的最后一个节点指向逻辑顺序上的下一个哈希桶中链表的第一个节点,使哈希表中所有节点形成一条单向链表。
[0055] 在一个实施例中,所述新型链式哈希表构建装置还包括索引指针指向模块4,所述哈希桶索引模块4用于将每个哈希桶的索引指针指向逻辑顺序上的上一个哈希桶中链表的最后一个节点,使得计算机在对哈希表进行插入、查询和删除操作时,无需对判断哈希桶下是否为空桶,降低了操作的时间复杂度,优化计算机的计算性能。例如,本案中可通过程序bucket[idx]->next->next,其中bucket[idx]为各个哈希桶的索引指针,即可快速查找到每个哈希桶对应的节点,实现在不影响原有哈希表的对桶索引的数据的插入、查询、删除等操作的时间复杂度的情况下快速遍历哈希表节点。在另一个实施例中,所述指针指向模块3也可将索引指针指向哈希桶下的链表的第一个节点。
[0056] 在本实施例中,所述数据存储模块1具体包括:节点存储单元11,用于将待存储数据中存储在若干个节点中;
[0057] 节点插入单元12,用于获取该数据的键值,将上述键值经哈希运算得到相应的哈希地址,将所述哈希地址作为哈希桶的索引;在哈希表中设置尾指针,所述尾指针指向链表的最后一个逻辑节点;判断该哈希桶是否存在开链,若为空,将桶索引指向尾指针指向的节点,同时修改尾指针指向新插入的节点;若不为空,采用链地址法将新节点插入到桶索引指针指向的节点和该节点指向的下一个节点之间,避免出现哈希地址冲突。
[0058] 相对于现有技术,本发明通过设置数据存储模块、头节点设置模块和节点指向模块引入了一个新的头节点,并将该头节点与哈希表中的数据节点构成一条单向链表,从而在遍历哈希表所有节点时根据该单向链表即可完成,无需遍历哈希桶和判断各个哈希桶中是否开链来遍历节点,降低了计算机遍历哈希表所有节点操作的时间复杂度,提高了计算机工作效率。
[0059] 本发明并不局限于上述实施方式,如果对本发明的各种改动或
变形不脱离本发明的精神和范围,倘若这些改动和变形属于本发明的
权利要求和等同技术范围之内,则本发明也意图包含这些改动和变形。