Mapping 将唯一数映射到索引

Mapping 将唯一数映射到索引,mapping,indices,unique-index,Mapping,Indices,Unique Index,假设我有一个唯一数字的列表(例如105、342、432、34等),我想将它们映射到索引(0、1、2、3等)。有没有一个通用的方法来做到这一点?如果没有,假设您事先知道列表中的所有数字,并且可以硬编码它们的值。如果这没有帮助,另一个限制因素可能是数字“几乎是连续的”。这意味着它们在大多数情况下是连续的,但可能存在差距(这是您提前知道的)。您要做的基本上是实现哈希映射(或字典)。有许多用于实现这种结构的语言的库。 以一种非常简单的方式,在引擎盖下发生的是一个数组和一个散列函数,它将您的数字映射到数组

假设我有一个唯一数字的列表(例如105、342、432、34等),我想将它们映射到索引(0、1、2、3等)。有没有一个通用的方法来做到这一点?如果没有,假设您事先知道列表中的所有数字,并且可以硬编码它们的值。如果这没有帮助,另一个限制因素可能是数字“几乎是连续的”。这意味着它们在大多数情况下是连续的,但可能存在差距(这是您提前知道的)。

您要做的基本上是实现哈希映射(或字典)。有许多用于实现这种结构的语言的库。
以一种非常简单的方式,在引擎盖下发生的是一个数组和一个散列函数,它将您的数字映射到数组的一个索引,从而实现基于元素键的O(1)分期访问。
第二个重要方面是如何处理碰撞。例如,假设数字的哈希函数是
f(x)=x mod 10
。13和33都将散列为3。这是一场冲突,必须加以处理。例如,您可以创建元素的有序列表,并将其分配给阵列的插槽。搜索元素时,您将散列其键,并在指定数组位置的列表中搜索精确的键匹配。
这只是这一切的开始,您可以在中找到有关这一切的更多信息 并在维基百科上发布。
值得一提的是,在您的情况下,您只希望存储密钥本身。通常我们需要存储更复杂的对象,并通过它们的键进行搜索,这些键通常是数字或字符串,但也可以是任何类型的更复杂的对象

编辑
我刚刚意识到,您的问题更多的是为您的特定场景找到最佳的哈希函数,而不是为类似于您的问题找到更通用的解决方案。
如果我没听错的话,你是说你事先知道这些数字?如果确实是这样,您可以使用非常硬的编码形式(如您自己所建议的),将数字分配给数组中的每一个索引,例如:

if (num == 105)
    idx = 0;
else if (num == 342)
    idx = 1;
...
如果您不知道您的数字,但您知道(比如)其中的最小值和最大值,您可以使用以下方法将它们散列到索引中:

f(x) = (x - smallest_num) mod (greatest_num - smallest_num + 1)  
在这种情况下,
f(x)
是一个完美的散列函数,这意味着不会有任何冲突。由于您的数字并不总是连续的,因此您的阵列仍将有一些插槽为空

注意:我仍然不确定你打算用这个做什么,因此我不确定我是否正确回答了你的问题。特别是你可能事先知道你的数字,或者你可能知道很多,这让我很困惑。也许如果你的目的明确了,我们可以给你不同的方法来实现你的目标