2017-04-13 99 views

回答

0

雖然我不認爲這是最優化的解決方案,但要解決這個問題:

{ 
    X: x where not null x; 
    grouped: group asc X; 
    firstRank: first each value grouped; 
    quantiles: (key grouped)! firstRank%count X; 
    quantiles x 
}[0N 1 2 0N 2 1 5] 

代碼

  1. 過濾掉來自輸入數組
  2. 排序陣列空按升序排列並按每個元素分組。其中給出了下一個結構的地圖1 2 5! (0 1; 2 3; 4)
  3. 通過鍵獲取第一個索引:1 2 5! 0 2 4
  4. 獲取基於(3)
  5. 地圖輸入數組元素位數函數值對應位數
+0

感謝@Anton,我在此之前已經打爲好。你的解決方案與維基百科的例子略有不同,但仍是最快的兩個之一。另一種最快的解決方案具有稍低的內存佔用量 –

0

我比較了幾種方法(包括prank4從對方的回答):

prank1:{ 
    n:asc x where not null x; 
    (sums[count each group n]%count n) @ x 
    } 
prank2:{ 
    p:(1+(asc n) bin n)%count n:x i:where not null x; 
    @[count[x]#0Nf;i;:;p] 
    } 
prank3:{@[((1+til[count i])%count i)@last each group asc i:x where not null x;x]} 

prank4:{ 
    X: x where not null x; 
    grouped: group asc X; 
    firstRank: first each value grouped; 
    quantiles: (key grouped)! firstRank%count X; 
    quantiles x 
    } 

檢查輸出是the nearest rank method of percentile calculation一致,除了prank4

prank1 0N 1 2 0N 2 1 5/0n 0.4 0.8 0n 0.8 0.4 1 

比較時序和內存佔用:

x:10000000?0N,til 500 
\ts prank1 x/494 402661632 
\ts prank2 x/3905 671088960 
\ts prank3 x/552 536879392 
\ts prank4 x/496 533741888 
prank2[x]~prank1 x/1b 
prank1[x]~prank3 x/1b 
prank1[x]~prank4 x/0b