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

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

Google 0529 面经

Candidate 在 Google coding 环节遇到了设计题 —— 搜索自动补全功能

今天面试官是一个资深工程师,看起来比较专业,先是双方自我介绍,然后直接就是 Coding,上来就出一道经典的系统设计题。

题目描述

Google 搜索实现自动补全功能,对每次输入的前缀,返回最多三个按字典序最小且以该前缀开头的产品名称建议。

解题思路

这是一道经典的Trie树 + 优先队列问题,关键在于高效的前缀匹配和排序:

  1. Trie树存储:将所有产品名称存储在Trie树中
  2. 前缀搜索:根据输入前缀快速定位到Trie树节点
  3. 字典序排序:使用优先队列或排序算法获取字典序最小的结果
  4. 结果限制:返回最多三个建议

代码实现

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!