升序基数
为了方便起见,我将这个小代码片段称为“排名”。当您开始将等级应用于二进制数时,它会变得很明显。例如:
X←0 0 1 0 1
⍋⍋X ⍝ output is 1 2 4 3 5
输出指示排序后值的位置。您可以从输出中看到两个 1 将在最后两个插槽 4 和 5 中结束,而 0 将在位置 1、2 和 3 中结束。因此,它为向量的每个值分配了排名。将其与升级进行比较:
X←7 8 9 6
⍋X ⍝ output is 4 1 2 3
⍋⍋X ⍝ output is 2 3 4 1
您可以将升级视为该职位获得该数字,并且您可以将等级视为该数字获得该职位:
7 8 9 6 ⍝ values of X
4 1 2 3 ⍝ position 1 gets the number at 4 (6)
⍝ position 2 gets the number at 1 (7) etc.
2 3 4 1 ⍝ 1st number (7) gets the position 2
⍝ 2nd number (8) gets the position 3 etc.
有趣的是,升级和排名就像一枚硬币的两个面,您可以在两者之间交替。换句话说,我们有以下身份:
⍋X = ⍋⍋⍋X = ⍋⍋⍋⍋⍋X = ...
⍋⍋X = ⍋⍋⍋⍋X = ⍋⍋⍋⍋⍋⍋X = ...
为什么?
到目前为止,这并没有真正回答佩斯基先生关于它为什么会产生这种影响的问题。如果从键值对的角度考虑,答案在于原始键是一组升序基数:1 2 3 4。应用升级后,创建了一个新向量,其值是原始的排序后重新排列的键: 4 1 2 3. 第二次应用升级是将原始键再次恢复为升序基数序列。但是,这第三个向量的值本身并不是升序基数。相反,它们对应于第二个向量的键。
这有点难以理解,因为它是对引用的引用,但是第三个向量的值引用了原始数字集,因为它们出现在其原始位置:
7 8 9 6
2 3 4 1
在示例中,2 从 7 的原始位置引用 7。由于值 2 也对应于第二个向量的键,这又是第二个位置,所以最后的消息是,排序后,7 将在位置 2。8 将在位置 3,9 在 4 和 6 中在第 1 位。
排名和分享
在 FinnAPL 成语库中,第 2 项描述为“升序基数(排名,可共享)”,代码如下:
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X
这段代码的输出和它的兄弟一样,只要输入向量的所有值都不同,升序基数(排名,都不同)。但是,可共享版本不会为相等的值分配新值:
X←0 0 1 0 1
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X ⍝ output is 2 2 4 2 4
输出的值一般应该被解释为相对的,即 2 的排名比 4 低,所以它们会出现在数组的第一位。