我正在寻找一种数据结构来解决以下问题。接收大量相当短的字符串(例如 5000 万,少于 30 个字符)作为输入,并根据需要对它们进行索引。然后,回答我给出一个新字符串的查询,并且您提供与提供的字符串相似的初始集合中的字符串(例如,10 个最好的此类字符串)。“相似性”的概念理想地是类似于编辑距离或 Jaro-Winkler 距离,或其近似值,但它应该能够适应拼写和词序的微小变化,以及添加垃圾词。(例如,与标准索引任务不同,如果请求“foo bar”确实是集合中最接近的字符串,则它应该产生“foo”)。
举个例子,假设字符串集合是 {"Charles Dickens", "Mary Shelley", "Robert Stephenson"}。查询“狄更斯,查尔斯”应该找到“查尔斯狄更斯”。查询“by Shelley”应返回“Mary Shelley”。
逐一计算查询字符串与集合中所有字符串的相似性的简单方法对于大型集合来说太慢了。什么是更有效地回答此类查询的好数据结构?理想情况下,我会寻找一个好的 Java 实现。