什么数据结构最快找到最佳匹配前缀?
What datastructure is the fastest to find the best matching prefix?
上下文:我正在研究用户代理字符串分析器 (Yauaa),作为此分析的一部分,我想做出有根据的猜测应该报告哪个品牌的设备。我有一个实现需要重写以提高效率。
因为我不想拥有所有设备的完整列表,所以我想根据型号的前缀进行检测。
所以我有一个带有前缀和关联品牌的数据集:
- "GT-" --> "Samsung"
- "LLD-" --> "Huawei"
然后我想做一个 .get("GT-1234124") 应该导致 "Samsung" 因为那是 "longest matching prefix".
我看过 Trie 结构,但似乎是针对相反的情况。我的理解是,您从一组值开始,您可以有效地获取以提供的前缀开头的所有值。
如果我要从头开始实现它,我会使用类似于 Trie 的树,但会以不同的方式绕过它。我正在寻找的是一种尽可能快地完成我需要的数据结构。
您为这个用例推荐什么数据结构?
是否有我可以使用的现有(经过验证的)实现?
我深入研究了数据结构,发现本质上 Trie 结构正是我需要的,而且我需要一种不同的方式来遍历该结构。
由于这个结构非常简单,我创建了自己的实现,效果很好。
更新:
- 我写了一篇关于这个的文章https://techlab.bol.com/finding-the-longest-matching-string-prefix-fast/
- 我将我的实现放入一个单独的库中,我将其开源并且已经可以通过 Maven Central 获得。参见 https://github.com/nielsbasjes/prefixmap
上下文:我正在研究用户代理字符串分析器 (Yauaa),作为此分析的一部分,我想做出有根据的猜测应该报告哪个品牌的设备。我有一个实现需要重写以提高效率。
因为我不想拥有所有设备的完整列表,所以我想根据型号的前缀进行检测。
所以我有一个带有前缀和关联品牌的数据集:
- "GT-" --> "Samsung"
- "LLD-" --> "Huawei"
然后我想做一个 .get("GT-1234124") 应该导致 "Samsung" 因为那是 "longest matching prefix".
我看过 Trie 结构,但似乎是针对相反的情况。我的理解是,您从一组值开始,您可以有效地获取以提供的前缀开头的所有值。
如果我要从头开始实现它,我会使用类似于 Trie 的树,但会以不同的方式绕过它。我正在寻找的是一种尽可能快地完成我需要的数据结构。
您为这个用例推荐什么数据结构?
是否有我可以使用的现有(经过验证的)实现?
我深入研究了数据结构,发现本质上 Trie 结构正是我需要的,而且我需要一种不同的方式来遍历该结构。
由于这个结构非常简单,我创建了自己的实现,效果很好。
更新:
- 我写了一篇关于这个的文章https://techlab.bol.com/finding-the-longest-matching-string-prefix-fast/
- 我将我的实现放入一个单独的库中,我将其开源并且已经可以通过 Maven Central 获得。参见 https://github.com/nielsbasjes/prefixmap