有序集合間的對位運算

2021-10-24 17:02:53 字數 3735 閱讀 4994

【摘要】

兩個有序集合之間可能進行一一對應的計算,比如兩個集合如何比較大小,怎樣判斷集合是否相等?如何簡便快捷的處理集合間的對位運算,這裡為你全程解析,並提供 esproc 示例**。有序集合間的對位運算

有序集合間的對位運算,包括比較運算(>,<, 等於)和四則運算(+,-,*,/,%,\)。本問中討論的集合,都是有序集合,有序集合的成員是有次序的。有序集合間的對位運算,會按照順序使用對位成員進行比較或者四則運算。

集合可以使用符號 ">" 或 "<" 比較大小,從第乙個成員開始按照順序比較對位成員。例如 [1,3,1] 與[1,2,2]比較大小時,首先比較各自的第乙個成員,1 與 1 相等;繼續比較各自的第二個成員,因為 3>2,所以 [1,3,1] 大於[1,2,2],無需比較後面的成員了。

【例 1】 以奧運會獎牌榜為例,查詢哪幾屆奧運會中國獎牌榜排名比俄羅斯靠前。部分資料如下:

gamenationmedalgame

30usa

46,29,29

3030

china

38,27,23

3030

uk29,17,19

3030

russia

24,26,32

3030

korea

13,8,730…

………奧運獎牌榜的規則是:首先對比金牌數量,金牌數高的排名靠前,金牌數低的排名靠後,金牌數相同的將會按照銀牌數再次對比排名。銀牌數高的排名靠前,銀牌數低的排名靠後,銀牌數相同的將會按照銅牌數再次對比排名。以此類推,銅牌數也相同的國家排名並列。

【spl 指令碼】ab

1=file("olympic.csv").import@cqt()

/匯入奧運會歷屆排名

2=a1.run(medal=medal.split@c())

/獎牌欄位按逗號拆分為獎牌數集合

3=a2.group(game)

/按每屆分組

4=a3.select(~.select(nation=="china").medal>~.select(nation=="russia").medal)

/用 ">" 符號比較中俄的獎牌數集合大小,會按順序依次比較金牌、銀牌和銅牌數量,並選出中國排名更高的屆。

5=a4.(game)

/列出共有哪幾屆

a5的執行結果如下:

game

2325

2829

30比較兩個集合是否相等是很常見的需求,比如比較檔案內容是否相同,比較資料表的數值是否發生變化等。例如比較集合 [1,2,3] 和[2,1,3]是否相等。通常來說,集合的的對位成員不完全一致,認為兩個集合是不相等的。但是也有時候並不在意集合的成員順序,只需要比較兩個集合是否包含了同樣的成員。

【例 2】 下面是隨機抽樣後生成的檔案,比較兩次隨機抽樣是否選出了相同的序號。部分資料如下:

idpredicted_yoriginal_y

100.012388464367608093

0.011

0.01519899123978988

0.013

0.0007920238885061248

0.019

0.0012656367468159102

0.021

0.009460545997473379

0.023

0.024176791871681664

0.0………

【spl 指令碼】ab

1=file("p_old.csv").import@ct()

/讀取第一次輸出的檔案

2=file("p_new.csv").import@ct()

/讀取第二次輸出的檔案

3=cmp(a1.(id),a2.(id))

/使用函式 cmp() 比較兩次生成的 id 是否完全相同(成員值相等且順序一致)

a3的執行結果如下:

member

0結果為 0 表示兩個檔案 id 完全一致。

如果 id 的順序可能不同,可以使用函式 eq() 比較兩個集合的成員是否相同:ab

3=a1.(id).eq(a2.(id))

/使用函式 eq() 比較兩次生成的 id 值是否相同,不要求順序一致。

集合成員的對位計算,支援 +,-,*,/,%,\ 等四則運算。例如 3 天內 a 商店的銷售額集合是 [2,3,4],b 商店的銷售額集合是 [3,1,3],我們希望得到兩個商店的銷售額之和的集合 [5,4,7]。

【例 3】 求 2019 年 12 月 24 日到 26 日深證 300 (399007) 對深證成指 (399001) 的每日相對收益率。部分資料如下:

datecodenameopencloseamount

2020/2/18

399001

shenzhen

11244.7651

11306.4863

3.19e+11

2020/2/17

399001

shenzhen

10974.9328

11241.4993

3.12e+11

2020/2/14

399001

shenzhen

10854.4551

10916.3117

2.77e+11

2020/2/13

399001

shenzhen

10936.5011

10864.3222

2.87e+11

2020/2/12

399001

shenzhen

10735.0475

10940.7952

2.66e+11……

…………

【spl指令碼】ab

1=connect("db")

/連線資料來源

2=["399007","399001"].(a1.query("select   * from stockindex where code=? and date between'2019-12-23'and  '2019-12-26'",~))

/讀取深證 300 和深證成指在 2019 年 12 月 23 日到 26 日的資料,取 23 日是為了計算漲幅

3=a2.(~.calc(to(2,4),close/close[-1]))

/分別計算 24 到 26 日每天的漲幅

4=a3(1)--a3(2)

/使用符號 "--" 將兩個集合對位相減,即是相對收益率。符號??(?∈)用於兩個集合中成員的對位計算。

a4的執行結果如下:

member

0.0031349096521252617

0.0011897141619391371

-4.4910504685946595e-4

《spl cookbook》中還有更多相關計算示例。

byte集合是否相同 有序集合間的對位運算

摘要 兩個有序集合之間可能進行一一對應的計算,比如兩個集合如何比較大小,怎樣判斷集合是否相等?如何簡便快捷的處理集合間的對位運算,這裡為你全程解析,並提供 esproc 示例 有序集合間的對位運算 有序集合間的對位運算,包括比較運算 集合可以使用符號 或 2,所以 1,3,1 大於 1,2,2 無需...

有序單鏈表的集合運算

include stdafx.h include malloc.h typedef struct node list 建立單鏈表 void createlist list l,char a,int n r next null 使用了排序演算法中的插入排序 void sort list head p ...

對位運算 負數字運算的理解

位運算 好 在這裡,我拿洛谷p2104的題當作例題 題目 小z最近學會了二進位制數,他覺得太小的二進位制數太沒意思,於是他想對乙個巨大二進位制數做以下 4 種基礎運算 運算 1 將整個二進位制數加 1 運算 2 將整個二進位制數減 1 運算 3 將整個二進位制數乘 2 運算 4 將整個二進位制數整除...