【摘要】
兩個有序集合之間可能進行一一對應的計算,比如兩個集合如何比較大小,怎樣判斷集合是否相等?如何簡便快捷的處理集合間的對位運算,這裡為你全程解析,並提供 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 將整個二進位制數整除...