Hash 为整数对集合查找合适的整数表示形式

Hash 为整数对集合查找合适的整数表示形式,hash,Hash,对于我正在进行的项目,我需要一种方法来计算数据结构的唯一整数表示形式,类型为[(int,int)],I。E(非负)整数对的集合。要求是,尽管对中的顺序很重要,但集合本身是顺序不敏感的。经过一些搜索,我相信一个合适的解决方案是使用Cantor配对函数对每一对进行编码,并xor结果 范围将相当小,比如1-700表示该对中的第一个整数,1-10表示第二个整数,列表将包含这些对中的大约5-15个 如果您认为有更好的解决方案,请让我知道,但回答“是的,这会起作用”也会很好:)[这个回答假设您说“唯一”时,

对于我正在进行的项目,我需要一种方法来计算数据结构的唯一整数表示形式,类型为
[(int,int)]
,I。E(非负)整数对的集合。要求是,尽管对中的顺序很重要,但集合本身是顺序不敏感的。经过一些搜索,我相信一个合适的解决方案是使用Cantor配对函数对每一对进行编码,并
xor
结果

范围将相当小,比如1-700表示该对中的第一个整数,1-10表示第二个整数,列表将包含这些对中的大约5-15个

如果您认为有更好的解决方案,请让我知道,但回答“是的,这会起作用”也会很好:)

[这个回答假设您说“唯一”时,您的意思是:碰撞是不可接受的。]

如果目标是以某种方式将任意大小的整数(对)集合唯一地映射到单个(大小合理的)整数,那么答案基本上是“这是不可能的”。这可以很容易地通过吸引客户来证明

如果集合的大小非常有限,并且输入整数的范围非常有限,那么您可能可以做一些事情。但在一般情况下,我建议你寻找一个不同的解决方案,无论你的顶级问题是什么


更新

作为一个例子,让我们考虑你在你的问题中添加的参数。700*10=7000,因此您需要大约13位来唯一地表示每个可能的对。最多15对,总共需要195位

现在,如果顺序不重要,那么理论上可以删除log2(15!)=40位。*因此理论上,您需要一个155位的输出数据类型。那容易处理吗



*如何在实践中实现这一点是另一个问题……;)

唯一的整数。“hashcode”是正确的术语吗?一般来说,不是。哈希函数通常会减少信息量,因此会发生冲突(即多个输入将具有相同的输出)。您可以使用所谓的完美散列来避免这种情况,但这很麻烦,而且需要提前了解整个数据集。嗯,我从来没有机会正确地熟悉术语。我将详细说明这些要求。
要求是,虽然配对中的顺序很重要,但集合本身不区分顺序。
我不理解这一点。这是否意味着(a,b)和(b,a)应该被视为不同的,并且两者都可能存在?@SergeyS:这有关系吗?我知道整数总是非负的,而且相当小,所以Cantor应该工作。我不确定对结果进行异或运算以获得整个列表的表示(我记得在某个地方读到过这样做对无序集有效,但确认会很好)。@JakubLédl:“整个列表的表示”是什么意思?你是说你需要用一个整数对这些对的整个列表进行编码吗?如果是这样的话,你的问题就不清楚了。如果是这样,那么答案基本上是“那是不可能的”。是的。我在这方面没有受过教育,所以请原谅我这有点离谱:)@JakubLédl:好的,我完全重写了我的答案……;)感谢您的更新和解释,这本来应该是一个优化,所以已经实现了一个不同的解决方案。。。