APL中的成语进步指数

时间:2013-07-03 20:45:55

标签: algorithm sorting apl

FinnAPL Library的第一个成语,称为“无代替的渐进索引”,就操作而言是相当简单的:

X←'dog food'
Y←'fod'
((⍴X)⍴⍋⍋X⍳X,Y)⍳(⍴Y)⍴⍋⍋X⍳Y,X ⍝ output 5 2 1

对于inY中的每个值,它返回X中的索引位置。如果Y具有两次相同的值,则返回X中第二次出现的索引。例如,如果Y为'fodd',则输出为{{ 1}},因为X中的第二个“d”位于第8位。对于Y中未找到的任何Y值,它返回X范围之外的索引值。例如,如果Y为'fudd',则输出为5 2 1 8

这个习语就像是围绕操作符5 9 1 8.的索引的镜像。正确的参数连接Y后跟X,用X执行操作索引,然后将其截断为Y的长度。左边的参数几乎相同,只是它反转了X和Y的角色。它连接了X通过Y,对X执行索引操作并将其截断为Y的长度。

虽然很容易看出发生了什么,但很难理解它为什么会起作用。所以,这是我的问题。

1 个答案:

答案 0 :(得分:2)

作为运营商的快速概述。 index-of运算符返回右参数中值的左参数中的索引位置。我想称之为“排名”的ascending cardinal numbers idiom ⍋⍋返回输入值在升级排序后占据的位置。最后,在表达式中使用shape-of运算符(⍴Y)⍴A会将A的第一个值作为等长的向量返回到Y.换句话说,它就像子字符串函数一样(至少在这里适用)。

完成后,让我们考虑如何形成最终操作指数的左右参数:

 1  2  3  4  5  2  2  1  5  2  1    X⍳X,Y   left
 1  8 11  2  6  7 10  3  4  5  9    ⍋X⍳X,Y
 1  4  8  9 10  5  6  2 11  7  3    ⍋⍋X⍳X,Y

 5  2  1  1  2  3  4  5  2  2  1    X⍳Y,X   right
 3  4 11  2  5  9 10  6  7  1  8    ⍋X⍳Y,X
10  4  1  2  5  8  9 11  6  7  3    ⍋⍋X⍳Y,X

 1  4  8  9 10  5  6  2             left    (⍴X)⍴⍋⍋X⍳X,Y
10  4  1                            right   (⍴Y)⍴⍋⍋X⍳Y,X
 5  2  1                            result

查看正确的参数'10 4 1',您可以看到,已将等级分配给表达式'X⍳Y,X'中字母'fod'的索引值。换句话说,在升级排序后,'f'将位于第10位,'o'位于第4位,'d'位于第1位。通过将索引值应用于排序后的字母,可以更清楚地看到这一点:

(Y,X)[⍋X⍳Y,X]                       ⍝ dddoooog ff

当左参数的索引值应用于X后跟Y的串联时,这是完全相同的结果:

(X,Y)[⍋X⍳X,Y]                       ⍝ dddoooog ff

即使它们是相同的,它们也是将索引值应用于两个不同字符串“foddog food”和“dog foodfod”的结果。通过第二次应用等级向上运算符以及获取子字符串,引用框架返回到原始字符串“dog food”和“fod”。但是,它们现在有一个共同点,因为左右参数是与“dddoooog ff”相关的“等级”。作为等级,正如我在另一篇post中所讨论的那样,他们也提到了原来的立场。因此,通过应用最终的index-of运算符,索引不仅指向左参数的位置,还指存储在X中的原始字符串中的索引位置,“dog food”。

许多这些排序习惯用法的一般形式是索引排名索引,其中排名充当桥梁,将输入绑定到输出。这是可能的,因为作为一组键值对,等级向量的元素可以同时同时引用两个事物。在该示例中,右参数中的10具有键值1,与“fud”中的“f”的索引值相关。左参数中的10具有键值5,与索引值相关。 “狗食”中的“f”。除此之外,这些值都是10,将一个等级向量与另一个等级向量相关联。因此,键和值都是指字母“f”,但有两种不同的方式。

故事的寓意是在设计排序习语时,开始的地方可能只是在弄清楚等级向量如何形成输入和输出之间的桥梁。