一种散列方法、装置、设备及介质

文档序号:1831346 发布日期:2021-11-12 浏览:7次 >En<

阅读说明:本技术 一种散列方法、装置、设备及介质 (Hashing method, hashing device, hashing equipment and hashing medium ) 是由 黄缚鹏 李雨鑫 曲坛 郭丽 于 2021-10-18 设计创作,主要内容包括:本实施例公开了一种散列方法、装置、设备及介质,散列方法包括:获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置;若所述存储位置存在对应的链表,则将该数据与所述链表中的已有节点进行比较;若所述链表中存在目标节点,所述目标节点与该数据相同,则更新所述目标节点对应的数据量;若所述链表中不存在所述目标节点,则将该数据存储为所述链表的节点;若不存在所述链表,则为所述存储位置构建所述链表,将该数据存储为所述链表的节点。(The embodiment discloses a hashing method, a hashing device, equipment and a medium, wherein the hashing method comprises the following steps: acquiring a data set, and constructing a hash table for storing data in the data set, wherein the hash table comprises a preset number of storage positions; for any data, determining an index value corresponding to the data, and determining a storage position corresponding to the data according to the index value; if the storage position has a corresponding linked list, comparing the data with the existing nodes in the linked list; if a target node exists in the linked list and the target node is the same as the data, updating the data volume corresponding to the target node; if the target node does not exist in the linked list, storing the data as the node of the linked list; and if the linked list does not exist, constructing the linked list for the storage position, and storing the data as the node of the linked list.)

一种散列方法、装置、设备及介质

技术领域

本申请涉及计算机技术领域,尤其涉及一种散列方法、装置、设备及介质。

背景技术

现有技术中,散列表是一种常用的数据结构,广泛应用于数据处理领域。但是在建立散列表的过程中,若有多线程并行向散列表的同一地址写入数据,则其中一个线程向该地址写入数据时,会对该地址加锁,需要向该地址写入数据的其他线程必须排队等待该线程向该地址写入数据完成后,下一个线程才能访问该地址,即多个线程必须串行向该地址写入数据。如此一来,造成线程资源的浪费,使得需要耗费较长的时间和较多的计算资源才能建立散列表。

有鉴于此,需要更高效的散列表建立方案。

发明内容

本说明书实施例提供一种散列方法、装置、设备及介质,用以解决如何更高效地建立散列表的技术问题。

为解决上述技术问题,本说明书实施例提供如下技术方案:

本说明书实施例提供第一种散列方法,包括:

获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置;

若所述存储位置存在对应的链表,则将该数据与所述链表中的已有节点进行比较;若所述链表中存在目标节点,所述目标节点与该数据相同,则更新所述目标节点对应的数据量;

若所述链表中不存在所述目标节点,则将该数据存储为所述链表的节点;

若不存在所述链表,则为所述存储位置构建所述链表,将该数据存储为所述链表的节点。

本说明书实施例提供第二种散列方法,包括:

获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

对任一数据,对该数据进行散列,包括:对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置,将该数据作为节点存储至所述存储位置对应的链表;

对所述数据集合中的所有数据进行散列后,对任一存储位置,若该存储位置对应的链表至少有两个节点,则对该存储位置进行查重,以使:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将保留节点对应的数据量确定为所述多个节点的节点数。

本说明书实施例提供一种散列装置,包括:

建表模块,用于获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

索引模块,用于对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置;

存储模块,用于若所述存储位置存在对应的链表,则将该数据与所述链表中的已有节点进行比较;若所述链表中存在目标节点,所述目标节点与该数据相同,则更新所述目标节点对应的数据量;若所述链表中不存在所述目标节点,则将该数据存储为所述链表的节点;若不存在所述链表,则为所述存储位置构建所述链表,将该数据存储为所述链表的节点。

本说明书实施例提供一种散列装置,包括:

建表模块,用于获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

散列模块,用于对任一数据,对该数据进行散列,包括:对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置,将该数据作为节点存储至所述存储位置对应的链表;

查重模块,用于对所述数据集合中的所有数据进行散列后,对任一存储位置,若该存储位置对应的链表至少有两个节点,则对该存储位置进行查重,以使:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将保留节点对应的数据量确定为所述多个节点的节点数。

本说明书实施例提供一种散列设备,包括:

至少一个处理器;

以及,

与所述至少一个处理器通信连接的存储器;

其中,

所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,使所述至少一个处理器能够执行上述第一种或第二种散列方法。

本说明书实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令被处理器执行时实现上述第一种或第二种散列方法。

本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:对任一数据,可以确定该数据对应的首选存储位置。即使该数据正由对应线程存储为散列表中的链表节点,其他任一线程也可以读取该节点,所述其他任一线程根据读取情况选择是否需要将其对应的数据存储为散列表中的链表节点或是更新相同节点对应的数据量。这样一来,即使有线程正在将数据存储为链表节点,也不会将散列表的存储位置锁住,不影响其他线程读取链表节点,也不影响其他线程根据读取情况选择是否需要将其对应的数据存储为散列表中的链表节点或是更新相同节点对应的数据量,从而实现了多线程对各自对应的数据的并行散列,提高散列效率。

附图说明

为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对本说明书实施例或现有技术描述中所需要使用的附图作简单的介绍。显而易见地,下面介绍的附图仅仅是本说明书中记载的实施例可能涉及的部分附图,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本说明书第一个实施例中的散列方法的执行主体示意图。

图2是本说明书第一个实施例中的散列方法的流程示意图。

图3是本说明书第一个实施例中新建链表和节点示意图。

图4是本说明书第一个实施例中初步散列过程中的数据量更新示意图。

图5是本说明书第一个实施例中在已有链表新建节点示意图。

图6是本说明书第一个实施例中的查重示意图。

图7是本说明书第二个实施例中的散列方法的流程示意图。

图8是本说明书第三个实施例中的散列装置的结构示意图。

图9是本说明书第四个实施例中的散列装置的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例的附图,对本说明书实施例的技术方案清楚、完整地进行描述。显然,本说明书所描述的实施例仅仅是本申请的部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

现有技术中,散列表是一种常用的数据结构,广泛应用于数据处理领域。但是在建立散列表的过程中,若有多线程并行向散列表的同一地址写入数据,则其中一个线程向该地址写入数据时,会对该地址加锁,需要向该地址写入数据的其他线程必须排队等待该线程向该地址写入数据完成后,下一个线程才能访问该地址,即多个线程必须串行向该地址写入数据。如此一来,造成线程资源的浪费,使得需要耗费较长的时间和较多的计算资源才能建立散列表。

本说明书第一个实施例(以下简称“实施例一”)提供了一种散列方法,实施例一的执行主体可以是终端(包括但不限于手机、计算机、pad、电视)或者服务器或者操作系统或者应用程序或者散列平台或者散列系统等,即执行主体可以是多种多样的,可以根据需要设置、使用或者变换执行主体。另外,也可以有第三方应用程序协助所述执行主体执行实施例一。例如图1所示,可以由服务器来执行实施例一中的散列方法,并且可以在(用户所持有的)终端上安装(与所述服务器)相对应的应用程序,终端或应用程序与服务器之间可以进行数据传输,通过终端或应用程序来进行数据的采集或输入或输出或(向用户)进行页面或信息处理,从而辅助服务器执行实施例一中的散列方法。

如图2所示,实施例一提供的散列方法包括:

S101:(执行主体)获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

实施例一的执行主体可以获取数据集合,数据集合中的数据是需要存储至散列表中的数据。实施例一的执行主体可以构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置(存储位置相当于存储地址或数组),每个存储位置都用于存储数据集合中的数据。

实施例一中,数据集合中的数据可以有基本的单位,例如以条或组为单位。具体如何划分数据单位,以及每个单位的数据包含的数据内容,实施例一不作具体限定。例如,数据集合中可以包含如下所示的用于表征三维模型(实施例一所述三维模型包括但不限于工业产品三维模型或人体三维模型,工业产品三维模型例如车辆、飞行工具等交通工具三维模型或工业机械三维模型、机床三维模型或其他通过工业生产得到的产品的三维模型)的点云数据:

0 0 0

0 0 1

0 1 1

0 1 0

1 0 0

1 0 1

1 1 1

1 1 0

3 0 1 2

3 0 1 4

3 0 2 3

3 1 4 5

3 0 3 4

3 2 3 6

3 1 5 2

3 4 5 6

3 3 4 7

3 3 6 7

3 2 5 6

3 4 6 7

上面的点云数据中,前8行中每一行的数据都代表点的坐标,故前8行的数据代表0-7(仅为示例)这8个点的坐标。第9至20每一行都代表由点构成的面,其中,每一行首位的数字3代表由三个点构成的面,即三角面片;每一行的后三位数字代表构成面的三个点的索引。例如“3 0 1 2”代表由点0、1、2构成的面,“3 0 1 4”代表由点0、1、4构成的面,以此类推。每一行数据都可以作为一个单位的数据。

以下将任一个单位的数据简称为任一数据或一个数据。

S103:(执行主体)对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置;

对任一数据,不妨称为数据A,实施例一的执行主体可以确定数据A的索引值。其中,确定数据A对应的索引值可以包括:根据散列函数(哈希函数)确定数据A对应的索引值。例如,对于上述的任一行点云数据,可以将该行数据中的点的坐标作为参数或关键字,通过散列函数得到该行数据对应的唯一的整数,该整数作为该行数据对应的索引值。

根据数据A对应的索引值可以确定数据A对应的存储位置。其中,数据A对应的存储位置可以是“数据A对应的索引值”所对应的存储位置,具体是“以数据A对应的索引值为下标(或指针,下同)的存储位置”,数据A对应的存储位置不妨称为数据A的第一存储位置或首选存储位置。也就是说,数据A、数据A对应的索引值、数据A的第一存储位置是相互对应的。这样一来,通过数据A对应的索引值可以确定散列表中数据A的第一存储位置。

对任一存储位置,假如有数据对应到该存储位置,实施例一的执行主体可以构建该存储位置对应的链表,链表中可以包含一个或多个节点,节点可以是对应到该存储位置的数据。

一般的,数据集合中的数据可以具有顺序,从而可以按序确定数据集合中的各数据的第一存储位置。实际上,可能存在多个数据对应相同的索引值的情况,即可能存在索引值或第一存储位置的“碰撞”。这样一来,对于数据A来说,确定其第一存储位置后,可能其第一存储位置对应的链表上已有一个或多个节点,每个节点都是对应到数据A的第一存储位置的数据。

确定数据A的第一存储位置后,实施例一的执行主体判断数据A的第一存储位置是否对应有链表。

S105:(执行主体)若所述存储位置存在对应的链表,则将该数据与所述链表中的已有节点进行比较;若所述链表中存在目标节点,所述目标节点与该数据相同,则更新所述目标节点对应的数据量;若所述链表中不存在所述目标节点,则将该数据存储为所述链表的节点;若不存在所述链表,则为所述存储位置构建所述链表,将该数据存储为所述链表的节点。

下面分为1.1和1.2进行说明:

1.1、数据A的第一存储位置未对应有链表,说明数据A是首个对应其第一存储位置的数据,则实施例一的执行主体可以构建数据A的第一存储位置对应的链表,将数据A存储为其第一存储位置对应的链表的节点(即新建链表和新建节点,如图3所示),相当于将数据A存储至其第一存储位置。

1.2、数据A的第一存储位置对应有链表,说明数据A不是首个对应其第一存储位置的数据,则实施例一的执行主体可以将数据A的第一存储位置对应的链表中的节点与数据A进行比较,判断数据A的第一存储位置对应的链表中的节点中是否有数据A的目标节点,数据A的目标节点即与数据A相同的节点,数据A的目标节点以下简称“目标节点”。

若数据A的第一存储位置对应的链表中的节点中不存在目标节点,则将数据A存储为其第一存储位置对应的链表的节点。

若数据A的第一存储位置对应的链表中的节点中存在目标节点,则无需再将数据A存储为其第一存储位置对应的链表的节点,而是更新目标节点对应的数据量。其中,对任一节点,该节点对应的数据量即表征与“该节点所在链表对应的存储位置”相对应,且与该节点相同的数据的数据量。具体的,该节点可以具有对应的参数,用于记录该节点对应的数据量。

数据量可以从1开始计数,若数据A的第一存储位置对应的链表中的节点中存在目标节点,则更新目标节点对应的数据量可以包括:将目标节点对应的数据量加1,如图4所示。

对于数据A,若将数据A存储为其第一存储位置对应的链表的节点,可以将数据A存储为其第一存储位置对应的链表的首个节点,也就是说,对任一存储位置,每有一个数据要存储为该存储位置对应的链表的节点,就将新存储的节点置于该存储位置对应的链表首位。这样一来,对于两个相同的数据,前一个数据存储为链表节点后,后一个数据可以更快与前一个数据所形成的链表节点进行比较。例如图5所示,假设某存储位置对应链表已有节点1,若将数据A存储为该链表的节点,则将数据A形成的节点2放在节点1之前。

上述过程即对数据A进行初步散列的过程。实施例一的执行主体可以生成数据A对应的散列线程(即用于执行初步散列操作的线程),执行数据A对应的散列线程,以对数据A进行初步散列。

上述初步散列过程中包含了初步查重过程,即上述的数据A与节点比较是初步查重过程。经过上述初步散列过程,相同的数据大部分会通过同一节点对应的数据量表征。但对任一存储位置,其对应的链表中的不同节点可能为相同数据。下面通过示例说明不同节点可能相同:

例如对于点云数据集,假设第f行和第g行数据都是点1和点2的坐标,第f行数据排序先于第g行数据。第f行数据对应的散列线程将第f行数据存储为第f行数据的第一存储位置(不妨记为存储位置h)的节点过程中,第g行数据对应的散列线程确定第g行数据的第一存储位置是存储位置h。确定第g行数据的存储位置h时,第f行数据对应的散列线程已经将部分数据存储为存储位置h对应链表中的节点(不妨记为节点i),例如已经将点1的坐标存储为存储位置h对应链表中的节点i。由于第f行和第g行数据的存储位置相同,且存储位置h对应有链表,则第g行数据对应的散列线程将第g行数据与存储位置h对应链表的节点相比较。当第g行数据与节点i比较时,由于节点i仅为点1的坐标,与第g行数据(即点1和点2的坐标)不同,并且若存储位置h对应链表的其他节点也与第g行数据不同,则第g行数据对应的散列线程将第g行数据存储为存储位置h对应的链表的节点(不妨记为节点j)。第f行数据对应的散列线程将第f行数据全部存储为节点i后,存储位置h对应链表中就有至少两个不同节点i和j为相同的数据。

以上仅为示例。由上可知,对数据集合中的各个数据进行上述过程后,不仅同一存储位置对应的链表中可能有多个节点为相同数据,这多个节点对应的数据量也可能为1或大于1。

实施例一中,对数据集合中所有数据执行上述初步散列过程后,实施例一的执行主体可以对散列表进行查重(相对于上述初步查重,此查重相当于二次查重)。下面说明如何对散列表进行查重:

对任一存储位置:

若该存储位置不存在对应的链表,说明无数据对应到该存储位置,则无需对该存储位置进行查重。

若该存储位置存在对应的链表,但该存储位置对应的链表仅有一个节点,也无需对该存储位置进行查重。

若该存储位置存在对应的链表,且该存储位置对应的链表至少有两个节点,则对该存储位置进行查重。其中,对该存储位置进行查重可以包括:遍历该存储位置对应链表中的节点,若该存储位置对应链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将被保留节点对应的数据量确定为所述多个节点各自对应的数据量之和,从而使得:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,保留节点对应的数据量为所述多个节点各自对应的数据量之和,例如图6所示。又例如,若数据A的第一存储位置对应链表中有k个节点均为数据A,这k个节点对应的数据量分别是m1至mk,则保留这k个节点中的一个节点,保留节点对应的数据量为m1至mk的加和。

实施例一的执行主体可以为每个需要查重的存储位置生成对应的查重线程(即用于查重的线程,下同)。对任一需要查重的存储位置,执行该存储位置对应的查重线程,以对该存储位置进行查重。或者,实施例一的执行主体可以为每个存储位置生成对应的查重线程,对任一查重线程,若该查重线程对应的存储位置不是上述需要查重的存储位置,则释放该查重线程。执行各个保留的查重线程,以对各个需要查重的存储位置进行查重。

通过上述初步散列过程和查重过程,也就建立了所需散列表,实现了对数据集合内数据的散列。

实施例一中,对任一数据,可以确定该数据对应的首选存储位置。即使该数据正由对应线程存储为散列表中的链表节点,其他任一线程也可以读取该节点,所述其他任一线程根据读取情况选择是否需要将其对应的数据存储为散列表中的链表节点或是更新相同节点对应的数据量。这样一来,即使有线程正在将数据存储为任一存储位置对应的任一链表节点,也不会将该存储位置锁住,不影响其他线程读取该链表节点,也不影响其他线程根据读取情况选择是否需要将其对应的数据存储为散列表中的链表节点或是更新相同节点对应的数据量,从而实现了无锁散列,实现了多个散列线程对各自对应的数据的并行散列,提高散列效率和散列表建立效率,减少散列表建立时间,提高机器性能和线程资源利用率。

实施例一中,查重过程一方面保证了查重后的散列表中同一存储位置对应链表的不同节点为不同数据;另一方面对于查重后的散列表内的任一存储位置对应链表的任一节点,该节点对应的数据量,就表征了数据集合中与该节点相同的数据的数量。若是将数据集合中相同的数据归为一类或一层,则查重后的散列表中的任一存储位置对应链表的任一节点即为一类或一层数据,任一存储位置对应链表的任一节点对应的数据量,即为该节点对应的一类或一层数据包含的数据量。故实施例一同时实现了散列表建立和数据分类或数据分层。通过实施例一进行数据分类或分层后,可以基于数据的分类或分层进行后续操作,例如对分类或分层后的数据进行下采样,例如基于分类或分层后的上述点云数据进行网格编码。

实施例一中,对数据集合的数据进行初步散列后,相同的数据大部分会通过同一节点对应的数据量表征,即已经初步实现了数据分类或分层。散列过程后即使存在链表中的不同节点可能为相同数据的情况,这样的节点也是少量的,从而在查重过程中,并不需要对每一存储位置执行一个查重线程,而是对至少有两个节点的链表对应的存储位置保留查重线程,释放其他查重线程,能够仅依靠少量的查重线程实现整个散列表的查重,能够节约线程资源,提高机器性能和提高查重效率,减少散列表建立时间,提高散列表建立效率。

实施例一中,由于相同的数据可以通过其存储位置对应链表中,与数据相同的节点对应的数据量表征,故散列表的存储位置数量可以大大小于数据集合中的数据量,这也有利于提高散列表建立效率,特别适用于数据大量重复的数据集合的散列(数据越重复,数据对应的存储位置越少)。需要说明的是,虽然实施例一中散列表的存储位置数量较少,但可以通过合适的散列函数,使得每一数据对应的索引值小于散列表的存储位置数量。例如散列表的存储位置数量为x,则通过散列函数得到数据A对应的唯一的整数(即为key)后,可以将该整数与x进行求余,即执行key%hash_size,其中hash_size为x,取余数作为数据A对应的索引值。

由于实施例一的上述特点,实施例一的初步散列过程和查重过程特别适用于在GPU内进行,即实现了在GPU内的多个散列线程对各自对应的数据的并行散列,相比于在CPU进行散列,散列表建立耗时大大缩短,散列表建立效率大大提高。

本说明书第二个实施例(以下简称“实施例二”)提供了一种散列方法,实施例二的执行主体参照实施例一。

如图7所示,实施例二提供的散列方法包括:

S202:(执行主体)获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

参照S101。

S204:(执行主体)对任一数据,对该数据进行散列,包括:对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置,将该数据作为节点存储至所述存储位置对应的链表;

对上述数据集合中的任一数据,实施例二的执行主体可以对该数据进行散列,即对该数据执行散列操作。对任一数据,对该数据进行散列可以包括:对任一数据,生成该数据对应的散列线程(即用于执行散列操作的线程),执行该数据对应的散列线程,以对该数据进行散列。

对任一数据,不妨称为数据A,下面进一步说明如何对数据A进行散列:

S2042:确定数据A对应的索引值,根据所述索引值确定该数据对应的存储位置;

该步骤具体内容参照实施例一。

S2044:将数据A作为节点存储至所述存储位置对应的链表;

与实施例一不同,实施例二中,确定数据A对应的存储位置后,即将数据A作为节点存储至其对应存储位置对应的链表中,而无需执行实施例一中的初步查重过程。

S206:(执行主体)对所述数据集合中的所有数据进行散列后,对任一存储位置,若该存储位置对应的链表至少有两个节点,则对该存储位置进行查重,以使:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将保留节点对应的数据量确定为所述多个节点的节点数。

实施例二中,对所述数据集合中的所有数据进行散列后,再对散列表进行查重。下面说明如何对散列表进行查重:

对任一存储位置:

若该存储位置不存在对应的链表,说明无数据对应到该存储位置,则无需对该存储位置进行查重。

若该存储位置存在对应的链表,但该存储位置对应的链表仅有一个节点,也无需对该存储位置进行查重。

若该存储位置存在对应的链表,且该存储位置对应的链表至少有两个节点,则对该存储位置进行查重。其中,对该存储位置进行查重可以包括:遍历该存储位置对应链表中的节点,若该存储位置对应链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将保留节点对应的数据量(数据量意义参照实施例一)确定为所述多个节点的节点数,从而使得:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,保留节点对应的数据量为所述多个节点的节点数。例如,若数据A的存储位置对应链表中有n个节点均为数据A,由于没有初步查重,这n个节点对应的数据量自然都是1,则保留这n个节点中的一个节点,保留节点对应的数据量为n。

实施例二的执行主体可以为每个需要查重的存储位置生成对应的查重线程(即用于查重的线程,下同)。对任一需要查重的存储位置,执行该存储位置对应的查重线程,以对该存储位置进行查重。或者,实施例二的执行主体可以为每个存储位置生成对应的查重线程,对任一查重线程,若该查重线程对应的存储位置不是上述需要查重的存储位置,则释放该查重线程。执行各个保留的查重线程,以对各个需要查重的存储位置进行查重。

通过上述散列过程和查重过程,也就建立了所需散列表,实现了对数据集合内数据的散列。

实施例一中,当有多个散列线程需要将其对应数据存储为散列表中同一存储位置对应的链表节点时,这多个散列线程相互之间并不影响,即任一线程将其对应数据存储为散列表中某一存储位置对应的链表节点时,并不会将该存储位置锁住,从而不影响其他任一线程将其对应数据存储为散列表中该存储位置对应的链表节点。这样一来,实施例一实现了无锁散列,实现了多个散列线程对各自对应的数据的并行散列,能够提高散列效率和散列表建立效率,减少散列表建立时间,提高机器性能和线程资源利用率。

实施例一中,经过散列和查重过程,一方面保证了查重后的散列表中同一存储位置对应链表的不同节点为不同数据;另一方面对于查重后的散列表内的任一存储位置对应链表的任一节点,该节点对应的数据量,就表征了数据集合中与该节点相同的数据的数量。若是将数据集合中相同的数据归为一类或一层,则查重后的散列表中的任一存储位置对应链表的任一节点即为一类或一层数据,任一存储位置对应链表的任一节点对应的数据量,即为该节点对应的一类或一层数据包含的数据量。故实施例一同时实现了散列表建立和数据分类或数据分层。通过实施例一进行数据分类或分层后,可以基于数据的分类或分层进行后续操作,例如对分类或分层后的数据进行下采样,例如基于分类或分层后的上述点云数据进行网格编码。

实施例一中,在查重过程中,并不需要对每一存储位置执行一个查重线程,而是对至少有两个节点的链表对应的存储位置保留查重线程,释放其他查重线程,能够仅依靠少量的查重线程实现整个散列表的查重,能够节约线程资源,提高机器性能和提高查重效率,减少散列表建立时间,提高散列表建立效率。

实施例一中,由于相同的数据可以通过其存储位置对应链表中,与数据相同的节点对应的数据量表征,故散列表的存储位置数量可以大大小于数据集合中的数据量,这也有利于提高散列表建立效率,特别适用于数据大量重复的数据集合的散列(数据越重复,数据对应的存储位置越少)。需要说明的是,虽然实施例一中散列表的存储位置数量较少,但可以通过合适的散列函数,使得每一数据对应的索引值小于散列表的存储位置数量。例如散列表的存储位置数量为x,则通过散列函数得到数据A对应的唯一的整数(即为key)后,可以将该整数与x进行求余,即执行key%hash_size,其中hash_size为x,取余数作为数据A对应的索引值。

由于实施例一的上述特点,实施例一的散列过程和查重过程特别适用于在GPU内进行,即实现了在GPU内的多个散列线程对各自对应的数据的并行散列,相比于在CPU进行散列,散列表建立耗时大大缩短,散列表建立效率大大提高。

如图8所示,本说明书第三个实施例提供一种与实施例一所述方法对应的散列装置,包括:

建表模块301,用于获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

索引模块303,用于对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置;

存储模块305,用于若所述存储位置存在对应的链表,则将该数据与所述链表中的已有节点进行比较;若所述链表中存在目标节点,所述目标节点与该数据相同,则更新所述目标节点对应的数据量;若所述链表中不存在所述目标节点,则将该数据存储为所述链表的节点;若不存在所述链表,则为所述存储位置构建所述链表,将该数据存储为所述链表的节点。

可选的,所述装置还包括:

查重模块,用于对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置;若所述存储位置存在对应的链表,则将该数据与所述链表中的已有节点进行比较;若所述链表中存在目标节点,所述目标节点与该数据相同,则更新所述目标节点对应的数据量;若所述链表中不存在所述目标节点,则将该数据存储为所述链表的节点;若不存在所述链表,则为所述存储位置构建所述链表,将该数据存储为所述链表的节点后,对任一存储位置,若该存储位置对应的链表至少有两个节点,则对该存储位置进行查重,以使:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将保留节点对应的数据量确定为所述多个节点各自对应的数据量之和。

可选的,所述查重模块,用于对任一存储位置,若该存储位置对应的链表至少有两个节点,则生成该存储位置对应的查重线程;

执行所述查重线程,以对该存储位置进行查重。

可选的,将该数据存储为所述链表的节点包括:

将该数据存储为所述链表的首个节点。

可选的,确定该数据对应的索引值包括:

根据散列函数确定该数据对应的索引值。

如图9所示,本说明书第四个实施例提供一种与实施例二所述方法对应的散列装置,包括:

建表模块402,用于获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;

散列模块404,用于对任一数据,对该数据进行散列,包括:对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的存储位置,将该数据作为节点存储至所述存储位置对应的链表;

查重模块406,用于对所述数据集合中的所有数据进行散列后,对任一存储位置,若该存储位置对应的链表至少有两个节点,则对该存储位置进行查重,以使:若该存储位置对应的链表中有多个节点为相同数据,则保留所述多个节点中的一个节点,并将保留节点对应的数据量确定为所述多个节点的节点数。

可选的,所述散列模块404,用于对任一数据,生成该数据对应的散列线程,执行所述散列线程,以对该数据进行散列;

和/或,

所述查重模块406,用于对任一存储位置,若该存储位置对应的链表至少有两个节点,则生成该存储位置对应的查重线程;执行所述查重线程,以对该存储位置进行查重。

本说明书第五个实施例提供一种散列设备,包括:

至少一个处理器;

以及,

与所述至少一个处理器通信连接的存储器;

其中,

所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,使所述至少一个处理器能够执行实施例一或实施例二所述方法。

本说明书第六个实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令被处理器执行时实现施例一或实施例二所述方法。

上述各实施例可以结合使用,不同实施例之间或同一实施例内的名称相同的模块可以是相同或不同的模块。

上述对本说明书特定实施例进行了描述,其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,附图中描绘的过程不一定必须按照示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书实施例提供的装置、设备、非易失性计算机可读存储介质与方法是对应的,因此,装置、设备、非易失性计算机存储介质也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、设备、非易失性计算机存储介质的有益技术效果。

在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device, PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。

控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20 以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带式磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上所述仅为本说明书实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

23页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:数据处理方法、装置、电子设备及可读存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!