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

如何按元素大小为列表生成索引值?要求单循环实现高性能

高效实现列表元素的大小位次替换(单循环生成结果)

核心思路

要兼顾单循环要求和极高性能,优先利用语言内置的高效排序(底层为C实现,远快于手动循环逻辑),再通过一次循环完成结果映射。核心逻辑:

  • 先对原列表元素排序,生成元素与对应位次的映射(位次从1开始,按元素从小到大顺序分配)
  • 用单循环遍历原列表,通过映射表直接替换每个元素为对应位次

代码实现(Python)

def rank_elements(arr):
    # 内置排序生成有序列表,创建元素到位次的映射(O(n log n),性能远超手动实现)
    sorted_arr = sorted(arr)
    rank_map = {val: idx + 1 for idx, val in enumerate(sorted_arr)}
    # 单循环生成最终结果
    return [rank_map[val] for val in arr]

# 测试示例
original = [5,7,83,1]
result = rank_elements(original)
print(result)  # 输出: [2,3,4,1]

性能说明

  • 时间复杂度:O(n log n),主要来自排序操作,这是此类问题的最优时间复杂度(排序无法低于O(n log n))
  • 空间复杂度:O(n),用于存储有序列表和映射表
  • 结果生成阶段为单循环,且映射表查找是O(1)哈希操作,性能拉满

重复元素场景扩展(可选)

如果列表存在重复元素,需相同元素对应相同位次,可调整映射表生成逻辑:

def rank_elements_with_duplicates(arr):
    sorted_arr = sorted(arr)
    rank_map = {}
    current_rank = 1
    for val in sorted_arr:
        if val not in rank_map:
            rank_map[val] = current_rank
            current_rank += 1
    return [rank_map[val] for val in arr]

# 测试重复元素
original = [5,7,5,1]
result = rank_elements_with_duplicates(original)
print(result)  # 输出: [2,3,2,1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:25:25