wps序号打乱重新排序_SPL 的序号思维及定位计算(下)

5 序列对齐

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

64543b11f9432cec44eb88e3d19b4736.png

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

7cede083beadf2d4b0e6ed42bdfeb13f.png

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

54bd8fccc38a688bcd94993cd54c0c5f.png

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

4b2a24a3260e7ac43a78d2287e084072.png

计算后,A4结果如下:

c4a134933f40bac22446d2756c640e48.png

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

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

f9a3843455c7c51ca19e70a0fc155aad.png

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

d948c5deb5e099396324b6fe0d10f979.png

6 间隔数列

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

e48ad979ee044c3cf3dc1433ce12c099.png

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

980a6258437be08414c48ee875b15260.png
cfcf7067b5f9734bdb75b81acf1fa709.png
02d74519686d6d98d4db370a6c0a9bec.png
a8c91d4c2ac55963c750c31be0f1c3d3.png

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

45ff3a5c29e3d0f1b3e90c68f473c3e0.png

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

7 序号数列

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

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

95e940131849ad747d9d8248aa0b684d.png

A2~A5结果如下:

5a06beae172b503fdbbbc8a9937d5905.png
11aef7edb8ab7d8ff8ece81c00fa8162.png
11aef7edb8ab7d8ff8ece81c00fa8162.png
6bfd3201e73fa90f872165d8dffdf794.png

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

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

123dbd75295135b57128736671037f9c.png

A2~A5的计算结果如下:

11aef7edb8ab7d8ff8ece81c00fa8162.png
974cb556c2006976748b1d116f1f6c26.png
94b0d67e964a5864cac851fbfb7b46bc.png
6bfd3201e73fa90f872165d8dffdf794.png

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

d95fcddd7545be79cf7abf6998b3ec4b.png

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

ddb12a0012817948ebc19d37d9195055.png

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

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

c329ef1ef5701b627a533c61b6de7c69.png

8 定位计算

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

b8a4654c7783922fd50d1bdab1eb70eb.png

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

a30c5fd87d2466db1be44106563ace96.png
19d99d2b0c5053a23a49b2e187bb479e.png
325192313761ebc51470eceb3f1cb9a1.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值