如何对 32 位数字进行排序以查找唯一条目?

Posted

技术标签:

【中文标题】如何对 32 位数字进行排序以查找唯一条目?【英文标题】:How to sort 32bit numbers to find unique entries? 【发布时间】:2009-04-01 20:25:28 【问题描述】:

有一个“文件”数据集 - 文件名,后面跟着 32 位数字 - 类似于文件的哈希值。

"file1" 6a9bd9a6 1df3b24b 7ab054dc
"file2" 6a9bd54e 1df3b24b 8cd054dc
"file3" 6a9bd9a6 7ab054dc

我将如何获得唯一文件,因此 s2 不是任何其他 s2 的前缀 - 这意味着该数字是唯一的。如果有两个相同的 s2,如果它们不是任何其他 s2 的前缀,则它们都是唯一的。

我正在寻找一个快速的解决方案。我可以想出解决方案来比较每个字符串,但这太耗时且无效。另一种选择是以某种方式将 mysql 引擎用于表,但我不确定如何。你能帮我吗?

【问题讨论】:

我不知道你所说的“s2”是什么意思。你能澄清一下吗?为什么你的数据集后面有多个数字,而不仅仅是1? 我想这不可能帮助你,我们需要一个更清晰的描述。 您可以将更多的数字理解为不是文件的HASH,而是文件的一部分,或者文件本身。因此,s1 将是“File1”,s2 将是它后面的数字。 【参考方案1】:

您可以使用trie 来确保没有任何字符串是任何其他字符串的前缀。

当你插入你的 trie 时,你会检查这两种情况:

1) 我是否传递了一个旧的叶节点?如果是这样,这意味着另一个字符串是我的字符串的前缀。 2)我想将已经存在的非叶子标记为叶子吗?如果是这样,我是另一个字符串的前缀。

这将是一个 O(N) 解决方案,其中 N 是字符串的数量(测量插入 trie 的数量)。每个插入运行其字符串的长度。

所以如果你想从这里创建哈希。您可以轻松地遍历特里树,然后在到达所需的叶子后使用有关是否有前缀节点的信息。每个叶子节点代表一个完整的路径,它知道它是否是另一个字符串的前缀。如果是前缀,那么它至少有 1 个子节点。

【讨论】:

哦,所以我把所有数据都插入到trie中,trie有返回每个数据条目信息的算法,它是否有一些“父”并且是不同条目的前缀? 你可以递归迭代树的每个节点。当你到达每一片叶子时,你会计算哈希值。在每个叶节点上,您还可以知道它是否是前缀,访问时间为 O(1)。

以上是关于如何对 32 位数字进行排序以查找唯一条目?的主要内容,如果未能解决你的问题,请参考以下文章

对 32 位数字使用基数排序

如何对数字进行编码,以便微小的变化导致非常不同的编码?

查找中位数而不排序数组

在verilog设计中,如何将特定位数的数值转换成32位signed型?

Excel:如何像数据透视表一样对一系列带有前导零的数字进行排序?

剑指offer-把数组排成最小的数