5 序列对齐
利用对位访问之前需要确保各序列已经按同一次序排好,但实际应用时序列未必总是这样,这时使用对齐函数A.align() 即可令序列按某个基准序列重新排序:
![64543b11f9432cec44eb88e3d19b4736.png](https://img-blog.csdnimg.cn/img_convert/64543b11f9432cec44eb88e3d19b4736.png)
A2和A3的序表均已按A1中的员工编号对齐,A4计算出员工的工资序表如下:
![7cede083beadf2d4b0e6ed42bdfeb13f.png](https://img-blog.csdnimg.cn/img_convert/7cede083beadf2d4b0e6ed42bdfeb13f.png)
A6将数据按照A5序表中运动员的名字对齐,A7据此计算出加权成绩。A8再计算出加权分的排名后,最终A9整理出结果序表如下:
![54bd8fccc38a688bcd94993cd54c0c5f.png](https://img-blog.csdnimg.cn/img_convert/54bd8fccc38a688bcd94993cd54c0c5f.png)
事实上,使用@a选项的对齐函数也会返回一个与基准序列对齐的序列,只是其每个成员都是集合,同样可以应用对位访问。
![4b2a24a3260e7ac43a78d2287e084072.png](https://img-blog.csdnimg.cn/img_convert/4b2a24a3260e7ac43a78d2287e084072.png)
计算后,A4结果如下:
![c4a134933f40bac22446d2756c640e48.png](https://img-blog.csdnimg.cn/img_convert/c4a134933f40bac22446d2756c640e48.png)
无选项A.align() 函数将对应基准序列的每个成员,在源序列中取出第1个成员再构成集合返回,而不是返回集合的集合,当事先明确知道每个分组子集只有1个成员时,使用A.align()函数即相当于完成了一次按基准序列排序的运算。
类似地,枚举分组也可以对位访问,只是A.enum() 中@1选项是无效的,只能处理分组式问题:
![f9a3843455c7c51ca19e70a0fc155aad.png](https://img-blog.csdnimg.cn/img_convert/f9a3843455c7c51ca19e70a0fc155aad.png)
A5计算出3个年龄组中员工总数如下:
![d948c5deb5e099396324b6fe0d10f979.png](https://img-blog.csdnimg.cn/img_convert/d948c5deb5e099396324b6fe0d10f979.png)
6 间隔数列
数列是一种特殊的集合,它本身是个集合,可以应用各种集合运算,同时,它又可以作为序号用于访问其它序列的子集,灵活运用数列是建立序号思维的重要环节,如:
![e48ad979ee044c3cf3dc1433ce12c099.png](https://img-blog.csdnimg.cn/img_convert/e48ad979ee044c3cf3dc1433ce12c099.png)
to() 函数可以得到由连续的整数构成的序列,而step() 函数则可以设定数列成员的间隔等参数,A1~A4结果依次如下:
![980a6258437be08414c48ee875b15260.png](https://img-blog.csdnimg.cn/img_convert/980a6258437be08414c48ee875b15260.png)
![cfcf7067b5f9734bdb75b81acf1fa709.png](https://img-blog.csdnimg.cn/img_convert/cfcf7067b5f9734bdb75b81acf1fa709.png)
![02d74519686d6d98d4db370a6c0a9bec.png](https://img-blog.csdnimg.cn/img_convert/02d74519686d6d98d4db370a6c0a9bec.png)
![a8c91d4c2ac55963c750c31be0f1c3d3.png](https://img-blog.csdnimg.cn/img_convert/a8c91d4c2ac55963c750c31be0f1c3d3.png)
使用子序列在原序列中的位置数列可以用来处理子集,如:
![45ff3a5c29e3d0f1b3e90c68f473c3e0.png](https://img-blog.csdnimg.cn/img_convert/45ff3a5c29e3d0f1b3e90c68f473c3e0.png)
在上面的例子中,可以用数列来为原序列赋值,也可以获取子序列等。
7 序号数列
如果对序列排序,那会丧失成员的原有次序信息,但有时这个信息还要用,比如我们想知道年龄最大的三名员工在全公司的入职次序,某支股票股价最高的三个交易日的涨幅,…。
为此,SPL提供了A.psort() 函数,用以返回排序后成员在排序前的序号。
![95e940131849ad747d9d8248aa0b684d.png](https://img-blog.csdnimg.cn/img_convert/95e940131849ad747d9d8248aa0b684d.png)
A2~A5结果如下:
![5a06beae172b503fdbbbc8a9937d5905.png](https://img-blog.csdnimg.cn/img_convert/5a06beae172b503fdbbbc8a9937d5905.png)
![11aef7edb8ab7d8ff8ece81c00fa8162.png](https://img-blog.csdnimg.cn/img_convert/11aef7edb8ab7d8ff8ece81c00fa8162.png)
![11aef7edb8ab7d8ff8ece81c00fa8162.png](https://img-blog.csdnimg.cn/img_convert/11aef7edb8ab7d8ff8ece81c00fa8162.png)
![6bfd3201e73fa90f872165d8dffdf794.png](https://img-blog.csdnimg.cn/img_convert/6bfd3201e73fa90f872165d8dffdf794.png)
通俗地说,在A.psort() 返回的数列中,第1个数是本次排序应当排在第1位的成员在原序列的序号,第2个数是应当排在第2位的成员在原序列的序号,…。
用序号数列产生的序列,也可以用A.inv() 函数获得序号数列的逆数列,来进行回复操作,如:
![123dbd75295135b57128736671037f9c.png](https://img-blog.csdnimg.cn/img_convert/123dbd75295135b57128736671037f9c.png)
A2~A5的计算结果如下:
![11aef7edb8ab7d8ff8ece81c00fa8162.png](https://img-blog.csdnimg.cn/img_convert/11aef7edb8ab7d8ff8ece81c00fa8162.png)
![974cb556c2006976748b1d116f1f6c26.png](https://img-blog.csdnimg.cn/img_convert/974cb556c2006976748b1d116f1f6c26.png)
![94b0d67e964a5864cac851fbfb7b46bc.png](https://img-blog.csdnimg.cn/img_convert/94b0d67e964a5864cac851fbfb7b46bc.png)
![6bfd3201e73fa90f872165d8dffdf794.png](https://img-blog.csdnimg.cn/img_convert/6bfd3201e73fa90f872165d8dffdf794.png)
有了A.psort()和A.inv() 两个函数,就可以很方便地解决需要保持原序号的问题:
![d95fcddd7545be79cf7abf6998b3ec4b.png](https://img-blog.csdnimg.cn/img_convert/d95fcddd7545be79cf7abf6998b3ec4b.png)
在查找数据时,使用二分法能够极大地提高效率,但这种方法要求原序列对于查找的关键字有序,若原序列无序则需要先排序。如果是查找成员本身,先排序没有问题,但要查找成员的序号时,排序则会破坏这个信息,这时又需要使用A.psort() 函数,如:
![ddb12a0012817948ebc19d37d9195055.png](https://img-blog.csdnimg.cn/img_convert/ddb12a0012817948ebc19d37d9195055.png)
这里用A.psort() 相当于为序列建立了一个二分法查找索引,一个序列可以同时按不同关键字建立多个查找索引。
对齐分组函数也可以返回序号构成的数列而不直接返回对齐后的序列,如:
![c329ef1ef5701b627a533c61b6de7c69.png](https://img-blog.csdnimg.cn/img_convert/c329ef1ef5701b627a533c61b6de7c69.png)
8 定位计算
计算出了所需记录的序号,就可以用定位计算A.calc() 来计算所需结果。使用定位计算可以避免不必要的计算,从而提高计算效率。
![b8a4654c7783922fd50d1bdab1eb70eb.png](https://img-blog.csdnimg.cn/img_convert/b8a4654c7783922fd50d1bdab1eb70eb.png)
A2,A4和A5中的计算结果如下:
![a30c5fd87d2466db1be44106563ace96.png](https://img-blog.csdnimg.cn/img_convert/a30c5fd87d2466db1be44106563ace96.png)
![19d99d2b0c5053a23a49b2e187bb479e.png](https://img-blog.csdnimg.cn/img_convert/19d99d2b0c5053a23a49b2e187bb479e.png)
![325192313761ebc51470eceb3f1cb9a1.png](https://img-blog.csdnimg.cn/img_convert/325192313761ebc51470eceb3f1cb9a1.png)
在这个例子中,二进制文件VoteRecord中存储了某次投票的结果,并已经按票数降序排序。A4计算出指定州的员工编号序列。A5根据编号序列,计算出这些员工还需获得多少票,排名就可以上升。如目前排在第3位的Ryan Williams,需要再获得69票,排名就可前进1位。在计算中需要跨行处理,这种计算不能仅根据选出员工的数据完成,还需要原表中的相关数据。