Delphi XE6。希望实现有限的搜索风格,特别是用户输入可以查找的商家名称的编辑字段。我需要允许用户输入多个单词或多个单词的一部分。例如,在商业“堪萨斯第一银行”上,用户应该能够输入“Fir Kan”,它应该返回一个匹配。这意味着倒指数型结构。我有一些类型的每个唯一单词的列表,然后是(文档ID,主键ID等,这是一个整数)。我正在努力解决这种类型的结构......我有大约250,000个商业名称,其中有43,500个独特的单词。字数会从1个字出现到数千个(公司,公司等)我有一些要求......
1)。假设用户输入BAN。我需要找到所有以BAN开头的单词。我需要返回BANK,BANKER等...这意味着无论我使用什么结构,我都必须能够找到BAN,然后移动到下一个字母条目...并继续移动到下一个,直到我找到一个值这不是从BAN开始的。这消除了任何类型的HASH结构,对吗?
2)。我显然希望这很快。 HASH是最快的,但是我不能用这个,对吗?见要求1.
3)。此结构中的每个条目都需要能够保存整数列表。如果我最终使用LinkedList,那么每个元素都必须保存一个整数列表。
4)。我需要能够保存并加载这个结构。我不想每次使用它时都要构建它。
无论我最终如何,它似乎必须是一个NESTED结构,一个更高级别的列表(LinkedList?),每个节点都是一个整数列表。
我在找什么?商业产品使用什么? Outlook等具有搜索功能。
答案 0 :(得分:1)
每个单词都链接到一组特定的ID,每个ID代表一个公司名称,对吗?
我建议使用二叉树数据结构,因为搜索工作通常是 log(n),这非常快。特别是,如果商业名称在运行时发生变化,AVLTree应该做得很好,尽管自己实现它的工作量相当大。但是在互联网上的二叉树上应该有许多现成的单元。
对于每次成功搜索树数据结构中的单词,您应该获取他们的ID列表,并根据他们成功输入的单词对这些ID进行汇总。 作为最后一步,您将获取所有这些聚合的ID列表并进行交集。
应该只剩下适合所有输入单词的ID。这些ID引用了搜索到的商家名称。