APL的升序基数

时间:2013-06-29 18:29:35

标签: sorting apl

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

⍋⍋X

我还在R. Peschi找到了同一个图书馆的book review,其中他说:''升序基数(排名,所有不同)'我们有多少人理解为什么评分等级的结果有这种影响吗?“这也是我的问题。我在互联网上广泛搜索并提出了zilch。

1 个答案:

答案 0 :(得分:2)

升序基数

为了简化起见,我将这个小代码片段称为“排名”。当你开始将它应用于二进制数时,显然会发生什么。例如:

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.应用等级后,创建一个新的向量,其值是原始的键重新排列,因为它们将在排序后重新排列:4 1 2 3.再次应用等级是将原始键重新恢复为一系列递增的基数。但是,该第三个向量的值不是递增的基数本身。相反,它们对应于第二个向量的键。

这有点难以理解,因为它是对引用的引用,但第三个向量的值引用了原始位置中出现的原始数字集:

7 8 9 6
2 3 4 1

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

排名和可共享

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

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

只要输入向量的所有值都不同,此代码的输出与其兄弟相同,即升序基数(排名,全部不同)。但是,可共享版本不会为相同的版本分配新值:

X←0 0 1 0 1
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X         ⍝ output is 2 2 4 2 4

输出值通常应解释为相对值,即2s的排名相对低于4s,因此它们将首先出现在数组中。