51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在360的威胁情报系统中,如何高效地查询某IP地址的历史攻击记录?请设计数据结构(如Trie树或哈希表)并说明算法复杂度。

360服务端开发工程师-Golang难度:中等

答案

1) 【一句话结论】采用基于Trie树(前缀树)的IP地址索引结构,结合哈希表存储历史记录,通过前缀树快速定位IP节点(O(1)时间),再通过哈希表高效查询历史记录(O(1)时间),整体查询复杂度接近O(1)。

2) 【原理/概念讲解】
首先,IP地址是32位的点分十进制(如“192.168.1.1”),具有层次化结构(每段8位,共4段)。Trie树(前缀树)天然适合存储层次化数据:每个节点代表IP的一个段(如第一段“192”),子节点对应下一段的可能值(0-255),叶子节点存储该IP的历史攻击记录。
类比:电话号码簿,每个字母对应一个节点,最后节点存储联系人信息——这里IP的每段对应节点,最后节点存储历史记录。

3) 【对比与适用场景】

数据结构定义特性使用场景注意点
Trie树前缀树,节点代表IP段(0-255),子节点代表下一段节点层次对应IP结构,支持前缀匹配,查询时逐层遍历IP地址查询(层次结构)、字典树、自动补全IP段数固定(4段),节点数最多1024,空间开销可控;插入/查询时间复杂度O(4)=O(1)
哈希表基于哈希函数的键值对存储查询/插入/删除平均O(1),但无法利用IP层次结构单个IP的快速查询(如直接通过IP字符串作为键)需处理哈希冲突,无法利用IP层次结构,若IP数量大可能因冲突导致性能下降

4) 【示例】
以伪代码展示核心逻辑:

  • TrieNode结构:
    type TrieNode struct {  
        children map[int]*TrieNode // 子节点(对应0-255)  
        ipHash   map[string][]AttackRecord // 存储该IP的历史记录(键=IP,值=记录列表)  
    }  
    
  • 插入函数(新增IP及攻击记录):
    func (n *TrieNode) insert(ip string, record AttackRecord) {  
        segments := splitIP(ip) // 按“.”分割为4段  
        for _, seg := range segments {  
            if n.children[seg] == nil {  
                n.children[seg] = &TrieNode{}  
            }  
            n = n.children[seg] // 移动到下一段节点  
        }  
        n.ipHash[ip] = append(n.ipHash[ip], record) // 叶子节点追加记录  
    }  
    
  • 查询函数(获取IP历史记录):
    func (n *TrieNode) query(ip string) []AttackRecord {  
        segments := splitIP(ip)  
        for _, seg := range segments {  
            if n.children[seg] == nil { // 未找到IP  
                return nil  
            }  
            n = n.children[seg]  
        }  
        return n.ipHash[ip] // 返回历史记录列表  
    }  
    

5) 【面试口播版答案】
“面试官您好,针对360威胁情报系统中高效查询IP历史攻击记录的需求,我的设计思路是采用基于Trie树(前缀树)的IP地址索引结构,结合哈希表存储历史记录。首先,IP地址是32位的点分十进制(如192.168.1.1),具有明显的层次结构(每段8位),Trie树天然适合这种层次化数据,能通过逐段匹配快速定位到目标IP节点。然后,每个Trie树的叶子节点(对应完整IP)会关联一个哈希表,存储该IP的所有历史攻击记录(键为IP字符串,值为攻击记录列表),这样查询时先通过Trie树O(1)时间定位到IP节点,再通过哈希表O(1)时间获取历史记录,整体查询复杂度接近O(1)。”

6) 【追问清单】

  • 追问1:若IP数量极大(如百万级),Trie树的空间开销如何控制?
    回答要点:IP段数固定为4段(每段0-255),Trie树节点数最多为4×256=1024,空间开销可控,且节点共享,实际内存占用远小于理论值。
  • 追问2:如何处理IP的更新(如新增攻击记录)?
    回答要点:在叶子节点的哈希表中追加记录,时间复杂度O(1)。
  • 追问3:若需要按时间范围查询(如最近7天的攻击记录),如何优化?
    回答要点:在哈希表的记录结构中增加时间字段,查询时过滤时间范围,或对哈希表按时间排序(如使用跳表优化时间范围查询)。
  • 追问4:若系统需要支持IP前缀查询(如查询所有192.168.x.x的IP历史记录),如何实现?
    回答要点:Trie树本身支持前缀匹配,遍历到对应前缀节点后,遍历该节点所有叶子节点的哈希表,合并结果。
  • 追问5:若IP地址存在格式错误(如非法段值),如何处理?
    回答要点:在插入/查询时检查每段是否在0-255范围内,不符合则返回错误。

7) 【常见坑/雷区】

  • 忽略IP的层次结构,直接用哈希表存储所有IP,导致查询时遍历所有记录,复杂度O(N)。
  • 忽视Trie树的空间优化,认为节点数会爆炸,实际IP段数固定,空间开销可控。
  • 未考虑哈希冲突,认为哈希表查询总是O(1),但实际可能因冲突导致性能下降。
  • 未说明查询复杂度,只说“高效”但未量化(如O(1) vs O(logN))。
  • 未考虑并发场景,比如多个查询同时进行,未说明是否需要加锁或使用无锁数据结构。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1