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

如何高效按指定索引顺序插入多元素到列表,降低O(n²)时间复杂度

优化方案

分两大场景给出可落地的实现:

场景1:已提前拿到所有元素和索引(离线场景,推荐)

不需要引入任何第三方依赖,用并查集(DSU) 实现接近线性的时间复杂度O(n α(n)),α为阿克曼函数反函数,对百万级数据完全无压力。

实现原理

因为插入操作是按顺序执行的,后插入的元素只会让早插入的、插入位置大于等于当前位置的元素最终位置后移1位。我们倒序处理所有插入请求,用并查集维护当前可用的空位,每次直接找到当前元素需要占用的空位,标记占用后直接写入结果数组,不需要任何元素移动操作。

代码实现

def batch_insert(items, indexes):
    n = len(items)
    # parent[i] 表示i位置之后第一个可用的空位
    parent = list(range(n + 1))
    
    def find(u):
        # 路径压缩优化
        while parent[u] != u:
            parent[u] = parent[parent[u]]
            u = parent[u]
        return u
    
    res = [None] * n
    # 倒序处理所有插入请求
    for i in reversed(range(n)):
        insert_pos = find(indexes[i])
        res[insert_pos] = items[i]
        # 标记当前位置已占用,指向后续第一个空位
        parent[insert_pos] = find(insert_pos + 1)
    return res

验证效果

用你给出的示例测试:

items = ['itemX', 'itemY', 'itemZ']
indexes = [0, 0, 1]
print(batch_insert(items, indexes))
# 输出:['itemY', 'itemZ', 'itemX'],完全符合预期

对于最坏场景的1e6次头部插入,该实现耗时仅需数百毫秒,远快于原生list插入的O(n²)实现。

场景2:插入请求为流式(无法提前拿到所有索引,在线场景)

低改动第三方库方案

直接替换原生list为sortedcontainers库的SortedList,它底层为跳表实现,单次插入时间复杂度为O(log n),代码改动量极小:

from sortedcontainers import SortedList

result = SortedList()
for index, item in zip(indexes, items):
    result.insert(index, item)
# 转成标准Python列表
result = list(result)

无依赖实现

如果不能引入第三方库,可以自己实现分块列表:将大列表拆分为多个大小为√n的子块,插入时仅需要移动对应子块内的元素,单次插入时间复杂度为O(√n),对于1e6级数据也能做到秒级返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:03