什么数据结构最快找到最佳匹配前缀?

What datastructure is the fastest to find the best matching prefix?

上下文:我正在研究用户代理字符串分析器 (Yauaa),作为此分析的一部分,我想做出有根据的猜测应该报告哪个品牌的设备。我有一个实现需要重写以提高效率。

因为我不想拥有所有设备的完整列表,所以我想根据型号的前缀进行检测。

所以我有一个带有前缀和关联品牌的数据集:

然后我想做一个 .get("GT-1234124") 应该导致 "Samsung" 因为那是 "longest matching prefix".

我看过 Trie 结构,但似乎是针对相反的情况。我的理解是,您从一组值开始,您可以有效地获取以提供的前缀开头的所有值。

如果我要从头开始实现它,我会使用类似于 Trie 的树,但会以不同的方式绕过它。我正在寻找的是一种尽可能快地完成我需要的数据结构。

您为这个用例推荐什么数据结构?

是否有我可以使用的现有(经过验证的)实现?

我深入研究了数据结构,发现本质上 Trie 结构正是我需要的,而且我需要一种不同的方式来遍历该结构。

由于这个结构非常简单,我创建了自己的实现,效果很好。

参见: https://github.com/nielsbasjes/yauaa/blob/master/analyzer/src/main/java/nl/basjes/parse/useragent/utils/PrefixLookup.java


更新:

  1. 我写了一篇关于这个的文章https://techlab.bol.com/finding-the-longest-matching-string-prefix-fast/
  2. 我将我的实现放入一个单独的库中,我将其开源并且已经可以通过 Maven Central 获得。参见 https://github.com/nielsbasjes/prefixmap