一、由简入繁:先能用,再能快,再能“记忆”
0)最简起步:值直接挂在特征节点上(值语义 / variant)
思路:特征节点里直接存值(variant),写入就是赋值,读取就是 visit。
优点
- 实现最简单,心智负担低
- 数据局部性好(访问快)
- 序列化简单(几乎“直接写盘”)
缺点
- 没有共享:相同值会拷贝 N 份(string/vector/轮廓/占据会爆)
- 无法做“全局唯一事实”:多处引用同一事实,更新/融合要同步所有拷贝
- 相似检索/去重困难(要扫全局或重建索引)
这一步像“先用铅笔画草图”。
1)复杂化第一步:全局特征值仓库(唯一链)+ 指针引用
思路:值不再嵌入特征节点,而是进入一个全局特征值链,特征节点只指向特征值节点。
优点
- 共享语义出现:相同值可以复用(节省大对象内存)
- 引用天然成立(一个值被多个特征引用)
- 可以在值节点上挂元数据(命中次数/置信度/来源)
缺点
- 访问多一次间接(指针跳转)
- 需要处理生命周期(删除/引用计数/GC 或“永不删”的策略)
- 序列化变复杂:指针需要重定向(主键/索引重建)
这一步是“从草图变成可复用零件库”。
2)复杂化第二步:去重索引树(按类型多棵树)
思路:为了让“查找是否已有同值”变快,按类型建索引树:标量/文本/矢量/引用……
优点
- 查重、查找从 O(N) 变成 O(logN) 或近似 O(1)
- 更适合你的核心需求:快速判断“这个值是否已存在”
- 为相似检索打基础(bucket/金字塔/海明距离)
缺点
- 工程复杂度显著上升:每次增删改都要维护“链 + 索引一致性”
- 锁与并发问题变多(尤其你链表模板已带锁,外部又加锁容易死锁)
- key/哈希策略要定规矩(单位、量化、规范化、维度、模式)
这一步是“零件库加上货架编号和仓储系统”。
3)复杂化第三步:融合/更新(记忆行为)
思路:同一对象多次观测,融合到同一“唯一值”上(或融合到区间/统计模型)。
优点
- “记忆”出现:多帧观测稳定、抗抖动(EMA、区间扩张、投票)
- 事实统一:更新一次,所有引用处自动同步
- 能积累置信度/命中次数,驱动后续抽象/概念化
缺点
- 共享的副作用:你融合的是“值节点”,可能影响所有引用者(要区分事实 vs 观测)
- 需要定义每种类型的融合规则(轮廓/占据更复杂)
- 若融合策略不当,会造成“值漂移”或“分裂成无数近似值”
这一步是“仓库不仅存货,还会自动做质检、汇总、滚动均值”。
二、由繁入简:把复杂性锁在仓库里,让外部像写字一样简单
当你把“仓库+索引+融合”做完,外面再让每个模块直接碰这些细节,就会变成“系统到处是复杂性”。所以你自然会走“由繁入简”的回收步骤:
4)接口收口:外部不再区分类型,统一 CRUD 入口
思路:对外只暴露统一入口,例如:
获取或创建(特征值主信息类 mi)查找(mi)/删除(node)/覆盖(node, mi)/融合(node, mi, params)
外部只构造特征值主信息类(其中 payload 用 variant),不关心索引树怎么分。
优点
- 业务层心智模型变简单
- 类型分发、key 生成、锁顺序、索引一致性都集中到一个模块
- 便于以后加新类型(Bits512、占据金字塔)而不改业务层
缺点
- 仓库模块变成“重型核心”,需要高质量的测试与断言
- 统一入口意味着错误更集中(但也更容易定位)
这一步是“仓库系统复杂,但对外只有一个窗口”。
5)再进一步:把“改”从修改值节点,变成“替换引用”
这是你架构里最重要的“简化但不降级”的技巧:
值节点尽量不可变(immutable)
业务层的“修改特征值”变成:
newV = 获取或创建(mi)特征节点->值 = newV
优点
- 避免共享值被改导致的连锁影响
- 融合可以变成“创建新统计值”或“保留多版本”
- 删除策略更清晰(旧节点是否还有引用)
缺点
- 需要“引用计数/使用次数”或回收策略,否则仓库会涨
- 对“事实型共享”场景,你仍可能想支持“就地融合”(所以要两种路径并存)
这一步是“修改不是改零件本身,而是把机器换上新的零件”。
三、整体评价:这条路线的核心得失
你走“先简后繁”的收益
- 先跑通、再优化,不容易“开局就把自己写死”
- 把真正需要的复杂度(共享、融合、相似检索)集中到最适合的层:仓库层
- 最终可以做到:外部简单、内部强大
这条路线的代价
- 中期会经历“系统到处在改接口”的阵痛(你现在正处于这个阶段)
- 锁/一致性/生命周期管理是最难的坑(你也已经踩到“链表锁 + 外部锁”这类问题)
- 融合与共享的语义需要明确分层:事实值vs观测值
四、给你一个“落地的终点形态”
一句话:仓库里复杂,业务层极简。
值表达:
特征值主信息类{ 类型, 比较模式, payload(variant), 元数据 }仓库提供:
获取或创建 / 查找 / 删除 / 覆盖 / 融合 / 重建索引业务层(特征类/标准特征工具/场景管理)只做:
- 构造主信息
- 调用仓库拿到唯一值节点
- 在特征节点上“改引用”,而不是改值节点