目标: 证明对数组 A 应用两次 argsort 操作后,得到的结果 A’’ 表示 A 中每个元素的排序位置。
前提:
A
是原始数组。A'
是A
经过argsort()
一次后的结果。(第一次 argsort 操作)A''
是A'
经过argsort()
再次排序后的结果。(第二次 argsort 操作)
核心概念:
- argsort (X) 返回一个索引数组,表示如果要对 X 进行排序,应该按照这个索引数组的顺序选择 X 中的元素。
- A’ 中的元素表示 A 中对应元素的排序位置。
解释
-
第一次
argsort()
:A'[i] = j
表示A[j]
是A
中的第i
小元素。- 例如,假设
A = [10, -5, 20, 0]
,那么A' = [1, 3, 0, 2]
。 A'[0] = 1
表示A[1]
(即 -5) 是A
中最小的元素。A'[1] = 3
表示A[3]
(即 0) 是A
中第二小的元素。A'[2] = 0
表示A[0]
(即 10) 是A
中第三小的元素。A'[3] = 2
表示A[2]
(即 20) 是A
中最大的元素。
-
第二次
argsort()
:A''[k] = q
表示A'[q]
是A'
中的第k
小元素。- 由于
A'
实际上包含了A
的索引,因此A'
的元素范围是从 0 到 |A| - 1。 - 因为
A'
的元素值为索引值,所以就是从小到大的,所以A'
中的元素值和其代表的排序位置是一致的。 - 例如,如果
A' = [1, 3, 0, 2]
,那么A'' = [2, 0, 3, 1]
。A''[0] = 2
表示A'[2]
(即 0) 是A'
中的最小元素。(元素值=排列位置,即A'[q] = k
)A''[1] = 0
表示A'[0]
(即 1) 是A'
中的第二小元素。A''[2] = 3
表示A'[3]
(即 2) 是A'
中的第三小元素。A''[3] = 1
表示A'[1]
(即 3) 是A'
中的第四小元素。
-
关键洞察:
A''[k] = q
能够得到A'[q] = k
。A'[q] = k
意味着A[k]
是A
中的第q
小元素。- 换句话说,
A[k]
的排名是q
。 - 即
A'' [2, 0, 3, 1]
中的每个元素值,都代表了A [10, -5, 20, 0]
中对应位置元素的排名。