2017-04-13 3 views

Répondre

0

Bien que je ne pense pas que ce soit la solution la plus optimale, mais il devrait résoudre le problème:

{ 
    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] 

Le code

  1. Filtres à nulls de tableau d'entrée
  2. tableau de Trie dans l'ordre croissant et le groupe par chaque élément. Ce qui donne la carte de la structure suivante 1 2 5! (0 1; 2 3; 4)
  3. Obtient le premier index avec la clé: 1 2 5! 0 2 4
  4. Obtient valeur de la fonction quantile sur la base (3)
  5. Cartes éléments de réseau d'entrée correspondant quantile
+0

grâce @Anton, j'ai joué dans l'intervalle, aussi bien. Votre solution diffère légèrement des exemples de Wikipedia, mais est néanmoins l'une des deux plus rapides. L'autre solution la plus rapide a une empreinte mémoire légèrement inférieure –

0

j'ai comparé plusieurs approches (y compris prank4 de l'autre réponse):

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 
    } 

Vérifiez que la production est conforme à the nearest rank method of percentile calculation, à l'exception prank4:

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

Comparer les horaires et l'empreinte mémoire:

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