在JavaScript中遍历键关联链表:能否规避while循环与O(N)数组转换?
链表遍历需求与问题
场景与数据结构
我有一个本质上存储在状态中的链表数据结构,用于表示对基础对象的一系列变更(补丁)。该链表通过键而非对象引用关联,以便轻松序列化和反序列化状态。
结构示例:
const latest = 'id4' // 实际为UUID,无法排序(此处为清晰展示用文本) const changes = { id4: {patch: {}, previous: 'id3'}, id3: {patch: {}, previous: 'id2'}, id2: {patch: {}, previous: 'id1'}, id1: {patch: {}, previous: undefined}, }
有时用户会触发耗时计算,结果存入状态,仅部分变更有对应结果:
const results = { id3: {performance: 83.6}, id1: {performance: 49.6}, }
核心需求
给定changes对象,需获取最接近链表顶端的结果(如示例中的results.id3)。
现有实现
我已用while循环实现该功能,当前运行稳定:
let id = latest let referenceId = undefined while (!!id) { if (!!results[id]) { referenceId = id id = undefined } else { id = changes[id].previous } }
该方法时间复杂度为O(N),但仅为极端情况:预期变更链表较长,但结果更新频繁,通常只需回溯几步即可找到匹配结果。
while循环的风险
受Gene Krantz研究启发(阅读《Failure is not an option》可了解NASA禁用递归的原因),我尽量避免while循环:这类循环易因疏忽引发错误,例如执行delete changes.id1就会导致无限循环。我希望规避该风险,退而求其次不返回结果——性能值缺失可处理,但应用挂起后果严重!
已尝试的其他方法
排序数组法(O(N))
为避免while循环,我曾考虑将changes对象按链表顺序转为数组后遍历,但需先遍历整个链表获取有序数组(未存储排序键,否则会破坏链表O(1)插入的特性),时间复杂度仍为O(N)。
问题
是否存在一种遍历该链表的方式,既不使用while循环,也无需通过O(N)操作将链表转换为普通数组?
内容的提问来源于stack exchange,提问作者thclark
相关产品推荐
相关产品推荐

