Google 面试经验分享:搜索自动补全功能设计题 - Oavoservice
2025-05-29

Google 0529 面经
Candidate 在 Google coding 环节遇到了设计题 —— 搜索自动补全功能。
今天面试官是一个资深工程师,看起来比较专业,先是双方自我介绍,然后直接就是 Coding,上来就出一道经典的系统设计题。
题目描述
Google 搜索实现自动补全功能,对每次输入的前缀,返回最多三个按字典序最小且以该前缀开头的产品名称建议。
解题思路
这是一道经典的Trie树 + 优先队列问题,关键在于高效的前缀匹配和排序:
- Trie树存储:将所有产品名称存储在Trie树中
- 前缀搜索:根据输入前缀快速定位到Trie树节点
- 字典序排序:使用优先队列或排序算法获取字典序最小的结果
- 结果限制:返回最多三个建议
代码实现
import heapq
from collections import defaultdict
class TrieNode:
def __init__(self):
self.children = {}
self.is_end = False
self.products = [] # 存储以当前节点为结尾的产品
class AutocompleteSystem:
def __init__(self, products):
self.root = TrieNode()
self.build_trie(products)
def build_trie(self, products):
"""构建Trie树"""
for product in products:
node = self.root
for char in product:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end = True
node.products.append(product)
def search_prefix(self, prefix):
"""搜索前缀匹配的产品"""
node = self.root
# 找到前缀对应的节点
for char in prefix:
if char not in node.children:
return []
node = node.children[char]
# 收集所有以该前缀开头的产品
result = []
self.dfs_collect(node, prefix, result)
# 按字典序排序并返回前3个
result.sort()
return result[:3]
def dfs_collect(self, node, current_prefix, result):
"""深度优先搜索收集所有产品"""
if node.is_end:
result.extend(node.products)
for char, child_node in node.children.items():
self.dfs_collect(child_node, current_prefix + char, result)
def get_suggestions(self, prefix):
"""获取自动补全建议"""
if not prefix:
return []
suggestions = self.search_prefix(prefix)
return suggestions
优化版本
使用优先队列优化性能:
class OptimizedAutocompleteSystem:
def __init__(self, products):
self.root = TrieNode()
self.build_trie(products)
def build_trie(self, products):
for product in sorted(products): # 预排序
node = self.root
for char in product:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end = True
node.products.append(product)
def search_prefix_optimized(self, prefix):
"""优化版本的前缀搜索"""
node = self.root
for char in prefix:
if char not in node.children:
return []
node = node.children[char]
# 使用优先队列维护字典序最小的结果
heap = []
self.dfs_with_heap(node, prefix, heap)
# 提取前3个结果
result = []
for _ in range(min(3, len(heap))):
result.append(heapq.heappop(heap))
return result
def dfs_with_heap(self, node, current_prefix, heap):
"""使用堆优化的深度优先搜索"""
if node.is_end:
for product in node.products:
heapq.heappush(heap, product)
for char, child_node in node.children.items():
self.dfs_with_heap(child_node, current_prefix + char, heap)
算法分析
- 构建Trie树:O(n*m) - n个产品,平均长度m
- 前缀搜索:O(k + r) - k为前缀长度,r为结果数量
- 空间复杂度:O(n*m) - 存储所有产品
- 核心思想:Trie树快速前缀匹配 + 排序获取字典序最小结果
测试用例
# 测试代码
products = [
"mobile", "mouse", "moneypot", "monitor", "mousepad",
"apple", "app", "application", "apply", "appointment"
]
autocomplete = AutocompleteSystem(products)
test_prefixes = ["m", "mo", "mou", "app", "appl"]
for prefix in test_prefixes:
suggestions = autocomplete.get_suggestions(prefix)
print(f"前缀 '{prefix}': {suggestions}")
面试官看完直接点头:"Excellent design! The Trie approach is very efficient."
Candidate 成功拿下这一轮。
这就是 OAVOSERVICE 实时 VO 辅助 的威力:
不是死记硬背题库,而是帮你在最关键的时刻,快速理清思路,稳定发挥,稳稳过关!
面试技巧分享
在 Google 的面试中,除了算法实现,面试官还会关注:
1. 数据结构选择
能够合理选择Trie树来实现高效的前缀匹配。
2. 性能优化
能够提供多种优化方案,包括预排序和优先队列。
3. 系统设计思维
从实际应用角度考虑自动补全功能的设计。
4. 代码质量
写出清晰、模块化的代码,注意类的设计和接口。
Oavoservice 实时辅助服务
在这次 Google 面试中,我们的实时辅助系统发挥了关键作用:
- 快速思路提示:在候选人卡壳时,立即提供Trie树的核心思路
- 算法指导:推荐使用Trie树和优先队列来实现高效搜索
- 代码优化:提供最优的代码实现,包括基础版本和优化版本
- 系统设计:帮助候选人从实际应用角度思考问题
结语
搜索自动补全功能设计虽然是一道经典题目,但在面试的紧张环境下,能够快速理清思路并正确实现并不容易。这就是为什么我们的实时辅助服务如此重要。
如果你正在准备 Google 或其他公司的技术面试,欢迎联系 Oavoservice。我们拥有丰富的面试经验和专业的辅助团队,能够在你最需要的时候提供及时有效的帮助。
Oavoservice - 让每一次面试都成为成功的机会!
需要辅助的同学随时dd哦,vo开始前支持mock!