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

如何将目标位置数组(To location array)转换为索引数组?数组重排操作实现问询

数组置换重排的实现与逆索引数组生成问题

这确实是一种很常见的数组操作,叫做置换重排——简单来说就是按照给定的位置映射规则,把原数组的元素重新排布到目标位置。我来一步步帮你解决这两个问题:

一、直接实现根据b重排a得到c

根据你的需求,数组b的每个元素b[i]表示原数组a中索引i的元素要放到结果数组c的b[i]位置。实现这个逻辑最直接的方式就是初始化一个和a长度相同的空数组,然后遍历原数组的每个索引,把元素放到指定位置:

以Python为例:

a = [6, 4, 3, 1, 5]
b = [4, 2, 0, 1, 3]
c = [0] * len(a)  # 初始化结果数组

for original_idx in range(len(a)):
    target_idx = b[original_idx]
    c[target_idx] = a[original_idx]

print(c)  # 输出: [3, 1, 4, 5, 6]

这个逻辑在其他语言(比如JavaScript、Java)里也完全通用,核心就是遍历原索引,将元素映射到目标位置。

二、生成逆置换数组d使得c = a[d]

你需要的d数组其实是b的逆置换——也就是说,d[k]表示结果数组c中索引k的元素来自原数组a的哪个索引。

为什么d = b[b]不通用?

只有当置换b是对合置换(即执行两次置换后回到原状态,也就是b[b[i]] = i对所有i成立)时,d = b[b]才有效。但大部分置换都不是对合的,比如你的例子里b[b[0]] = b[4] = 3 ≠ 0,所以这个方法失效。

正确的逆置换生成方法

逆置换的核心逻辑是:对于结果数组的每个位置k,找到原数组中哪个索引i满足b[i] = k(因为a[i]最终会被放到c[k]),所以我们可以遍历b的每个索引i,把d[b[i]]赋值为i:

还是用Python示例:

b = [4, 2, 0, 1, 3]
d = [0] * len(b)

for original_idx in range(len(b)):
    target_idx = b[original_idx]
    d[target_idx] = original_idx

print(d)  # 输出: [2, 3, 1, 4, 0]

验证一下:c = [a[d[0]], a[d[1]], a[d[2]], a[d[3]], a[d[4]]] = [a[2], a[3], a[1], a[4], a[0]] = [3,1,4,5,6],完全符合你的需求。

这种置换操作在数据处理、排序后的索引回溯、矩阵变换等场景中都很常用,属于数组操作里的基础需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:32:31