1

In the FinnAPL Idiom Library, the 19th item is described as “Ascending cardinal numbers (ranking, all different) ,” and the code is as follows:

⍋⍋X

I also found a book review of the same library by R. Peschi, in which he said, “'Ascending cardinal numbers (ranking, all different)' How many of us understand why grading the result of Grade Up has that effect?” That's my question too. I searched extensively on the internet and came up with zilch.

4

1 回答 1

3

升序基数

为了方便起见,我将这个小代码片段称为“排名”。当您开始将等级应用于二进制数时,它会变得很明显。例如:

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 低,所以它们会出现在数组的第一位。

于 2013-06-29T18:29:35.217 回答