每節點存:children[char]、isEnd、hotScore (搜索頻次/點擊率)。
class TrieNode {
Map children = new HashMap<>();
boolean isEnd = false;
long hotScore = 0;
String word; // 終端節點存完整詞
}
void insert(String word, long score) {
TrieNode p = root;
for (char c : word.toCharArray()) {
p = p.children.computeIfAbsent(c, k -> new TrieNode());
}
p.isEnd = true;
p.word = word;
p.hotScore = Math.max(p.hotScore, score);
}
List suggest(String prefix, int limit) {
TrieNode p = root;
for (char c : prefix.toCharArray()) {
p = p.children.get(c);
if (p == null) return Collections.emptyList();
}
// DFS 收集所有終端詞
List candidates = new ArrayList<>();
collect(p, candidates);
// 按熱度降序
candidates.sort((a,b) -> Long.compare(b.hotScore, a.hotScore));
return candidates.stream().limit(limit).map(n -> n.word).collect(Collectors.toList());
}
void collect(TrieNode p, List out) {
if (p.isEnd) out.add(p);
p.children.values().forEach(c -> collect(c, out));
}
completion suggester 內置 FST (有限狀態轉換器) 實現。Open-Open 關鍵詞聯想實現 (Java Trie + 熱度)。