5 序列对齐

利用对位访问之前需要确保各序列已经按同一次序排好,但实际应用时序列未必总是这样,这时使用对齐函数A.align() 即可令序列按某个基准序列重新排序:




wps excel EVALUATE 重新打开 不计算_子序列


A2和A3的序表均已按A1中的员工编号对齐,A4计算出员工的工资序表如下:


wps excel EVALUATE 重新打开 不计算_子序列_02


A6将数据按照A5序表中运动员的名字对齐,A7据此计算出加权成绩。A8再计算出加权分的排名后,最终A9整理出结果序表如下:


wps excel EVALUATE 重新打开 不计算_wps序号打乱重新排序_03


事实上,使用@a选项的对齐函数也会返回一个与基准序列对齐的序列,只是其每个成员都是集合,同样可以应用对位访问。


wps excel EVALUATE 重新打开 不计算_数据_04


计算后,A4结果如下:


wps excel EVALUATE 重新打开 不计算_二分法_05


无选项A.align() 函数将对应基准序列的每个成员,在源序列中取出第1个成员再构成集合返回,而不是返回集合的集合,当事先明确知道每个分组子集只有1个成员时,使用A.align()函数即相当于完成了一次按基准序列排序的运算。

类似地,枚举分组也可以对位访问,只是A.enum() 中@1选项是无效的,只能处理分组式问题:


wps excel EVALUATE 重新打开 不计算_wps序号打乱重新排序_06


A5计算出3个年龄组中员工总数如下:


wps excel EVALUATE 重新打开 不计算_子序列_07


6 间隔数列

数列是一种特殊的集合,它本身是个集合,可以应用各种集合运算,同时,它又可以作为序号用于访问其它序列的子集,灵活运用数列是建立序号思维的重要环节,如:


wps excel EVALUATE 重新打开 不计算_子序列_08


to() 函数可以得到由连续的整数构成的序列,而step() 函数则可以设定数列成员的间隔等参数,A1~A4结果依次如下:


wps excel EVALUATE 重新打开 不计算_子序列_09


wps excel EVALUATE 重新打开 不计算_数据_10


wps excel EVALUATE 重新打开 不计算_wps序号打乱重新排序_11


wps excel EVALUATE 重新打开 不计算_数据_12


使用子序列在原序列中的位置数列可以用来处理子集,如:


wps excel EVALUATE 重新打开 不计算_wps序号打乱重新排序_13


在上面的例子中,可以用数列来为原序列赋值,也可以获取子序列等。

7 序号数列

如果对序列排序,那会丧失成员的原有次序信息,但有时这个信息还要用,比如我们想知道年龄最大的三名员工在全公司的入职次序,某支股票股价最高的三个交易日的涨幅,…。

为此,SPL提供了A.psort() 函数,用以返回排序后成员在排序前的序号。


wps excel EVALUATE 重新打开 不计算_二分法_14


A2~A5结果如下:


wps excel EVALUATE 重新打开 不计算_wps序号打乱重新排序_15


wps excel EVALUATE 重新打开 不计算_数据_16


wps excel EVALUATE 重新打开 不计算_数据_16


wps excel EVALUATE 重新打开 不计算_数据_18


通俗地说,在A.psort() 返回的数列中,第1个数是本次排序应当排在第1位的成员在原序列的序号,第2个数是应当排在第2位的成员在原序列的序号,…。

用序号数列产生的序列,也可以用A.inv() 函数获得序号数列的逆数列,来进行回复操作,如:


wps excel EVALUATE 重新打开 不计算_子序列_19


A2~A5的计算结果如下:


wps excel EVALUATE 重新打开 不计算_数据_16


wps excel EVALUATE 重新打开 不计算_子序列_21


wps excel EVALUATE 重新打开 不计算_子序列_22


wps excel EVALUATE 重新打开 不计算_数据_18


有了A.psort()和A.inv() 两个函数,就可以很方便地解决需要保持原序号的问题:


wps excel EVALUATE 重新打开 不计算_二分法_24


在查找数据时,使用二分法能够极大地提高效率,但这种方法要求原序列对于查找的关键字有序,若原序列无序则需要先排序。如果是查找成员本身,先排序没有问题,但要查找成员的序号时,排序则会破坏这个信息,这时又需要使用A.psort() 函数,如:


wps excel EVALUATE 重新打开 不计算_二分法_25


这里用A.psort() 相当于为序列建立了一个二分法查找索引,一个序列可以同时按不同关键字建立多个查找索引。

对齐分组函数也可以返回序号构成的数列而不直接返回对齐后的序列,如:


wps excel EVALUATE 重新打开 不计算_数据_26


8 定位计算

计算出了所需记录的序号,就可以用定位计算A.calc() 来计算所需结果。使用定位计算可以避免不必要的计算,从而提高计算效率。


wps excel EVALUATE 重新打开 不计算_二分法_27


A2,A4和A5中的计算结果如下:


wps excel EVALUATE 重新打开 不计算_数据_28


wps excel EVALUATE 重新打开 不计算_二分法_29


wps excel EVALUATE 重新打开 不计算_子序列_30


在这个例子中,二进制文件VoteRecord中存储了某次投票的结果,并已经按票数降序排序。A4计算出指定州的员工编号序列。A5根据编号序列,计算出这些员工还需获得多少票,排名就可以上升。如目前排在第3位的Ryan Williams,需要再获得69票,排名就可前进1位。在计算中需要跨行处理,这种计算不能仅根据选出员工的数据完成,还需要原表中的相关数据。