【发布时间】:2014-10-06 05:27:12
【问题描述】:
我有很多数据需要非常快速地进行模糊查询(当然,这是相对的,但是对于大约 1 亿个键来说,在几秒的范围内,但理想情况下更快)。它采用键/值对的形式,其中键是唯一的字符串,值是字符串数组。这是实际数据的结构,但我可以随意将其组织成任何数据结构以加快查找速度。
键值的查找不仅应包括该确切键的值,还应包括在预定阈值(例如 5)内的 levenshtein 距离内的所有键的值。
例如,hello 的查找不仅应返回在 hello 的键下索引的所有值,还应返回 Hello、hello!、yello、helo、hellooo 的值等。
当然,最简单的解决方案是遍历每个键,计算它的 levenshtein 距离,如果它在某个阈值内,则包括它的值。然而,这个解决方案不能很好地扩展 O(n) 时间复杂度来迭代每个键,O(n-1) 迭代每个键来比较它,以及 O(n) 每个 levenshtein 计算,导致查找O(n * n * n-1) 的时间,这当然是不可接受的。
如何构建这些数据以优化查找时间复杂度?空间复杂度、插入、删除和编辑运行时都无关紧要(不过,我更愿意将插入时间控制在 1 秒以内,以避免出现瓶颈)。
关于数据的一些信息:
- 已准备好以 10/秒的相当恒定速率添加唯一键
- 字符串已准备好以 10/秒的相当恒定的速率附加到值数组
- 每个键值的大小通常为 1-5 个元素,但有些异常值有数百个
- 值数组中的每个字符串的长度通常为 20-40 个字符
【问题讨论】:
-
你是在做拼写检查还是别的什么?
标签: data-structures nlp levenshtein-distance fuzzy-search