database - 用于查找具有相似位值的附近键的数据结构

标签 database algorithm language-agnostic math hash

我有一些数据,最多一百万到十亿条记录,每条记录都由一个位域表示,每个键大约 64 位。这些位是独立的,您基本上可以将它们想象成随机位。

如果我有一个测试键,并且我想用相同的键找到我的数据中的所有值,哈希表将很容易地在 O(1) 中吐出这些值。

什么算法/数据结构可以有效地找到与查询键最相似的所有记录?这里的相似意味着大多数位是相同的,但允许有最少的错误。这传统上是用 Hamming distance. 来衡量的,它只计算不匹配位的数量。

有两种方法可以进行此查询,一种可能是通过指定不匹配率,例如“给我一个与我的查询不同的少于 6 位的所有现有 key 的列表”,或者通过简单的最佳匹配,例如“给我一个 10,000 个键的列表,这些键与我的查询具有最少的不同位。”

您可能会想跑到 k-nearest-neighbor algorithms ,但这里我们讨论的是独立位,因此像四叉树这样的结构似乎不太可能有用。

这个问题可以通过简单的暴力测试哈希表的少量不同位来解决。例如,如果我们想找到与我们的查询相差一位的所有键,我们可以枚举所有 64 个可能的键并测试它们。但这很快就爆炸了,如果我们想允许两个位的差异,那么我们必须探测 64*63=4032 次。对于更多的位数,它会呈指数级恶化。

那么是否有另一种数据结构或策略可以让这种查询更加高效呢? 数据库/结构可以任意预处理,需要优化的是查询速度。

最佳答案

你想要的是一个BK-Tree .这是一棵非常适合索引度量空间的树(你的问题是一个),并支持最近邻和距离查询。我写了an article前段时间讲过。

BK-Trees一般是引用文本描述的,使用levenshtein距离来构建树,但是用二进制字符串和汉明距离来写一个更简单。

关于database - 用于查找具有相似位值的附近键的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/977375/

相关文章:

jquery - 使用 jquery 将 XML 解析为 html5 数据库

mysql - 无法弄清楚我在双重否定查询(mysql)中出了什么问题

algorithm - 目前认为用于二维点匹配的 "best"算法是什么?

Swift4 Playgrounds凯撒密码错误

python - 霍夫曼编码问题

database - 设计通用的数据库实用程序类

javascript - 如何将 GraphQL 服务器添加到预先存在的 SQL 数据库中?

database - SQLite : Begin-commit for WAL mode

python - 如何在一些数据结构中表示一个奇怪的图

language-agnostic - 代码高尔夫 : New Year's Fireworks