是否有一种生成单个键的方法,可以记住我们遇到的所有字符串

时间:2010-11-10 05:19:05

标签: algorithm hash key set

我正在处理数十万个文件,

我必须逐个处理这些文件, 在这样做时,我需要记住已经处理过的文件。

我所能想到的就是强大的lo ---- ong数组中每个文件的文件路径,然后每次都检查它是否重复。

但是,我认为应该有更好的方法,

我是否可以生成一个KEY(这是一个数字)或者什么,只记得已经处理过的所有文件?

5 个答案:

答案 0 :(得分:3)

您可以使用某种哈希函数(MD5,SHA1)。

伪代码:

for each F in filelist
    hash = md5(F name)

    if not hash in storage
        process file F
        store hash in storage to remember

请参阅http://tools.ietf.org/html/rfc1321了解MD5的C实现

答案 1 :(得分:2)

有一些概率方法可以给出近似结果,但是如果你想确定一个字符串是否是你以前见过的字符串,你必须存储你看过的所有字符串到目前为止,还是等同的信息。这是一个鸽子原则的论点。当然,你可以直接使用各种不同的方法(如哈希表,二叉树等)对你看到的字符串进行线性搜索。

答案 2 :(得分:2)

如果我正确理解了您的问题,您希望创建一个应该具有特定值的SINGLE键,并且从该值您应该能够推断出已经处理了哪些文件?我不知道你是否能够做到这一点,只是从你的空间非常大并且在如此巨大的空间中产生独特的关键演示需要大量的记忆。

如上所述,您可以做的只是将每个路径URL存储在HashSet中。将十万个条目放入Set中并不是那么糟糕,查找时间是按照常量时间O(1)分摊的,所以它会非常快。

答案 3 :(得分:2)

Bloom过滤器可以解决您的问题。  布隆过滤器的想法很简单。它以一个长度为空的数组开始,其所有成员的值都为零。我们将有K个哈希函数。   当我们需要将项目插入到bloom过滤器时,我们拥有包含所有K哈希函数的项目。这些哈希函数将在bloom过滤器上获得K个索引。对于这些索引,我们需要将成员值更改为1。  要检查bloom过滤器中是否存在某个项,只需使用所有K个哈希值对其进行哈希,然后检查相应的数组索引。如果所有这些都是1,则该项目将出现在bloom过滤器中。

请注意,布隆过滤器可以提供假阳性结果。但这绝不会给出假阴性结果。您需要调整bloom过滤算法来解决这些误报情况。

答案 4 :(得分:1)

你需要什么,恕我直言,是一种基于树或哈希的集合实现。它基本上是一种数据结构,它支持非常快速的添加,删除和查询操作,并且只保留每个元素的一个实例(即没有重复)。几十万个字符串(假设它们本身不是几十万个字符长)对于这样的数据结构应该不是问题。

您选择的编程语言可能已经有一个,所以您不需要自己编写。 C ++有std::set。 Java具有Set实现TreeSetHashSet。 Python有一个Set。它们都允许您添加元素并快速检查元素是否存在(基于散列表的集合为O(1),基于树的集合为O(log(n))。除此之外,还有很多免费的集合实现,以及可以使用的通用二进制搜索树和哈希表。