Sorting APL中的升序基数

Sorting APL中的升序基数,sorting,apl,Sorting,Apl,在FinnAPL习语库中,第19项被描述为“升序基数(排名,所有不同)”,代码如下: ⍋⍋X ⌊.5×(⍋⍋X)+⌽⍋⍋⌽X 我还发现了R.Peschi的同一个图书馆的一个例子,他在其中说,“升序基数(排名,各不相同)”我们中有多少人理解为什么对升序结果进行分级会有这种效果?这也是我的问题。我在互联网上进行了广泛的搜索,找到了Zlich。升序基数 为了简化起见,我将把这个小代码片段称为“rank”。当你开始将它应用于二进制数时,rank发生了什么就变得很明显了。例如: X←0 0 1 0 1

在FinnAPL习语库中,第19项被描述为“升序基数(排名,所有不同)”,代码如下:

⍋⍋X
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X

我还发现了R.Peschi的同一个图书馆的一个例子,他在其中说,“升序基数(排名,各不相同)”我们中有多少人理解为什么对升序结果进行分级会有这种效果?这也是我的问题。我在互联网上进行了广泛的搜索,找到了Zlich。

升序基数

为了简化起见,我将把这个小代码片段称为“rank”。当你开始将它应用于二进制数时,rank发生了什么就变得很明显了。例如:

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 = ...
为什么?

到目前为止,这并没有真正回答Peschi先生的问题,即为什么会有这种影响。如果从键值对的角度考虑,答案在于原始键是一组升序基数:1 2 3 4。应用grade up后,将创建一个新的向量,其值是在排序后重新排列的原始键:4 1 2 3。第二次应用grade up是指将原始关键点恢复为升序基数序列。然而,第三个向量的值本身并不是升序基数。相反,它们对应于第二个向量的键

这有点难以理解,因为它是对一个引用的引用,但是第三个向量的值引用了原始的一组数字,因为它们发生在它们的原始位置:

7 8 9 6
2 3 4 1
在该示例中,2从7的原始位置引用7。由于值2也对应于第二个向量的键,而第二个向量又是第二个位置,因此最后一条消息是排序后,7将位于位置2。8将位于位置3,9将位于位置4,6将位于位置1

排名和可共享性

在FinnAPL习语库中,第二项被描述为“升序基数(排名,可共享)”,代码如下:

⍋⍋X
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X
只要输入向量的所有值都不同,此代码的输出与它的兄弟代码相同,即升序基数(排名,所有不同)。但是,可共享版本不会为相等的值分配新值:

X←0 0 1 0 1
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X         ⍝ output is 2 2 4 2 4
输出值通常应解释为相对值,即2s的秩相对低于4s,因此它们将首先出现在数组中