You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助实现Simple Prefix Tree的insert递归方法

Simple Prefix Tree Insert 方法实现完整指南

完整实现代码

def insert(self, value: Any, weight: float, prefix: list) -> None:
    """Insert the given value into this autocompleter.
    The value is inserted with the given weight, and is associated with
    the prefix sequence prefix.
    If the value has already been inserted into this autocompleter,   
    then the given weight should be added to the existing weight of this value."""

    # 情况1:当前节点即为目标值,累加权重
    if self.root == value:
        self.weight += weight
        return
    
    # 情况2:当前节点是目标前缀,处理值节点的添加或权重更新
    if self.root == prefix:
        # 检查子树中是否已存在该值节点
        for subtree in self.subtrees:
            if subtree.root == value:
                subtree.weight += weight
                return
        # 不存在则创建新值节点并添加到子树
        new_tree = SimplePrefixTree()
        new_tree.root = value
        new_tree.weight = weight
        new_tree.subtrees = []
        self.subtrees.append(new_tree)
        return
    
    # 情况3:递归构建前缀路径,直到到达目标前缀节点
    # 空树初始化:先创建空前缀根节点
    if self.is_empty():
        self.root = []
        self.weight = 0.0
        self.subtrees = []
    
    # 验证当前节点前缀是目标前缀的合法子序列
    if len(self.root) > len(prefix) or self.root != prefix[:len(self.root)]:
        raise ValueError("Prefix path does not extend from current node's root")
    
    # 生成下一级前缀节点的标识
    next_prefix_length = len(self.root) + 1
    if next_prefix_length > len(prefix):
        raise ValueError("Current node exceeds the target prefix path")
    next_prefix = prefix[:next_prefix_length]
    
    # 在子树中查找已存在的下一级前缀节点,找到则递归插入
    for subtree in self.subtrees:
        if subtree.root == next_prefix:
            subtree.insert(value, weight, prefix)
            return
    
    # 未找到则创建新前缀节点,递归完成后续插入后添加到子树
    new_prefix_tree = SimplePrefixTree()
    new_prefix_tree.root = next_prefix
    new_prefix_tree.weight = 0.0  # 前缀节点权重设为0,仅值节点存储权重
    new_prefix_tree.subtrees = []
    new_prefix_tree.insert(value, weight, prefix)
    self.subtrees.append(new_prefix_tree)

核心逻辑拆解

1. 重复值处理

当当前节点的root就是要插入的value时,直接累加权重,这是处理同一值多次插入的场景,保证权重不会被覆盖而是累加。

2. 目标前缀节点处理

当当前节点的root匹配目标prefix时,说明已经到达值节点的父节点:

  • 遍历子树检查是否已有该value的节点,存在则累加权重;
  • 不存在则创建新的叶子节点(subtrees为空),设置root为value、weight为给定值,添加到当前子树。

3. 递归构建前缀路径

这是实现前缀链的核心逻辑:

  • 空树初始化:如果树还未初始化,先创建以空前缀[]为根的节点,这是前缀树的标准起始节点。
  • 前缀合法性校验:确保当前节点的前缀是目标prefix的子序列(比如[]是['p','i','g']的子序列,['p']也是),避免无效的路径插入。
  • 生成下一级前缀:根据当前节点的前缀长度,生成下一层级的前缀(比如从[]生成['p'],从['p']生成['p','i'])。
  • 查找或创建子节点:遍历子树找到对应前缀的节点,递归调用insert继续后续流程;如果没找到,创建新的前缀节点,递归完成插入后将其加入当前子树。

模拟插入示例

以插入value='pig'、weight=2.0、prefix=['p','i','g']为例:

  1. 初始状态:树为空,先初始化根节点为[],weight=0.0,subtrees为空。
  2. 根节点[]处理:不匹配'pig'和['p','i','g'],生成下一级前缀['p'],创建新节点并递归调用其insert方法。
  3. 节点['p']处理:不匹配目标,生成下一级前缀['p','i'],创建新节点并递归。
  4. 节点['p','i']处理:不匹配目标,生成下一级前缀['p','i','g'],创建新节点并递归。
  5. 节点['p','i','g']处理:匹配目标prefix,子树为空,创建'pig'节点(weight=2.0)并添加到子树。

最终树结构:

[] → ['p'] → ['p','i'] → ['p','i','g'] → 'pig'(weight=2.0)

若再次调用insert('pig', 1.5, ['p','i','g']),会递归到'pig'节点,执行权重累加,最终权重变为3.5。

内容的提问来源于stack exchange,提问作者LianNuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:35:04