【问题标题】:efficient way to find set membership找到集合成员的有效方法
【发布时间】:2014-12-25 12:29:33
【问题描述】:

我正在使用 2^n 向量,例如n=3 可能的值是:

000, 001, 010, 011, 100, 101, 110, 111

考虑到这组组合,我想找出最有效的方法

000, 000, 001, 100, 000, 110, 000, 110

如何查找给定值是否在可能的集合中。

一种方法是遍历整个列表(蛮力)。另一个是使用任何经典的搜索方法,例如log_2(n) +1的二进制搜索等

另一种方法是使用布隆过滤器,尽管这是一种概率方法

我想知道是否还有其他东西,给定一个位字符串列表,以有效地测试其成员资格。

【问题讨论】:

  • 如果 n 可以很大,您可能对此感兴趣:en.wikipedia.org/wiki/Restricted_Boltzmann_machine
  • 如果您只需要成员检查,那么高效的散列函数和散列集应该可以解决问题。
  • 还有 vEB 树,不过可能不节省空间(取决于数据集)

标签: performance algorithm set time-complexity bitstring


【解决方案1】:

某种基于哈希的集合(例如,Java 中的 HashSet)将在摊销的常数时间内进行插入和查找,这是您将在渐近术语中获得的最佳结果。

如果你真的想把船推出去,并且集合会很密集(即,可能存在相当一部分可能的位字符串),那么将它们转换为整数并使用位域。这也是常数时间,但更快的常数。

【讨论】:

    【解决方案2】:

    任何数据结构都可以。无论您的本地字典结构是什么,我都会使用它,因为这很容易做到并且是经过良好测试的代码。通常这是一个散列,尽管它通常被称为字典、HashMap 或 std::unordered_map 之类的其他东西。有时它是一棵二叉树。哈希 (Perl)、字典 (Python)、HashMap。

    如果我要为这个问题推出一个“完美的数据结构”,我可能希望在 trie 上有一些变体。但是最大的胜利是一个相当小的因素加速,所以除非我知道它是必要的,否则为什么要打扰呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多