【问题标题】:Avoiding database when checking for existing values检查现有值时避免使用数据库
【发布时间】:2017-01-07 03:55:12
【问题描述】:

在简单地检查以前出现的字符串或值时,有没有办法通过散列或按位运算符或其他算法来避免使用数据库? 假设没有办法存储之前出现的字符串的全部历史,只能存储很少的信息。

【问题讨论】:

  • 你想解决什么问题?
  • 您正在查看的先前出现的字符串的数量是多少?
  • 您正在查看的先前出现的字符串的数量是多少? -- 每天 30-40 个,而且还在不断增长。它们实际上是使用 GUID 和时间戳构建的文件名,因此它们彼此相当独特,但任务是过滤掉之前已经出现的确切文件名并让新的文件名通过。

标签: database algorithm data-structures


【解决方案1】:

您可能对布隆过滤器感兴趣。他们不会让你权威地说,“是的,这个值在感兴趣的集合中”,但他们确实让你说“是的,这个值可能在集合中”与“不” ,这个值肯定是不是在集合中”。在许多情况下,这已经足够有用了。

它的工作方式是:

  • 您创建了一个布尔值数组(即位)。你能负担得起的阵列越大越好。
  • 您创建了一堆不同的散列函数,每个散列函数接受一个输入字符串并将其映射到数组的一个元素。您希望这些哈希函数是独立的,这样即使一个哈希函数将两个字符串映射到同一个元素,不同的哈希函数很可能会将它们映射到不同的元素。
  • 要记录一个字符串在集合中,您依次应用每个散列函数(为您提供数组中的一组元素)并将所有映射到的元素设置为 TRUE。李>
  • 要检查字符串是否(可能)在集合中,您可以执行相同的操作,只是现在您只需检查映射到的元素以查看它们是否为 TRUE。如果它们都为 TRUE,则该字符串可能在集合中;否则,肯定不是。

如果您对这种方法感兴趣,请参阅https://en.wikipedia.org/wiki/Bloom_filter 了解详细分析,这些分析可以帮助您适当地调整过滤器(选择正确的数组大小和散列函数的数量)以获得有用的概率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多