package Ġch . he ig vd . stats . ranking Ċ Ċ import Ġkotlin . coroutines . experimental . build Sequence Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* ĠR ough Ġimplementation Ġof ĠK end all - T au Ġcorrelation Ġcoefficient Ġcomputation . Ċ Ġ* Ċ Ġ* ĠThis Ġimplementation : Ċ Ġ* Ċ Ġ* Ġ- Ġis Ġslow Ġ( O ( n Â² )), Ġthanks Ġto Ġefficient Ġsorts Ġa Ġs mar ter Ġimplementation Ġshould Ġbe ĠO ( n Â· log ( n )) Ċ Ġ* Ġ- Ġdoesn 't Ġhandle Ġcases Ġbased Ġon Ġnon - square Ġcont ing ency Ġtables Ġ( T au - c ) Ċ Ġ* Ġ- Ġsimple Ġand Ġeasy Ġto Ġunderstand Ċ Ġ* Ċ Ġ*/ Ċ interface ĠK end all T au Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠK end all - T au - a ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġvariant Ġignores Ġt ies ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMore Ġdetails Ġon ĠW ikipedia Ġ( https :// en . wikipedia . org / wiki / K end all _ rank _ correlation _ coefficient # T au - a ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠT au - a Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtau A (): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠK end all - T au - b ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġvariant Ġsupports Ġt ies ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMore Ġdetails Ġon ĠW ikipedia Ġ( https :// en . wikipedia . org / wiki / K end all _ rank _ correlation _ coefficient # T au - b ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠT au - b Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtau B (): ĠDouble ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġbuild Ġa Ġ[ K end all T au ] Ġinstance Ġwith Ġtwo Ġrank ings ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T , ĠU > Ġbuild ( a : ĠArray < T >, Ġb : ĠArray < U >): ĠK end all T au Ġwhere ĠT Ġ: ĠComparable < T >, ĠU Ġ: ĠComparable < U > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( a . size Ġ== Ġb . size ) Ġ|| Ġthrow ĠException (" Arrays Ġneed Ġto Ġhave Ġequals Ġsizes ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠK end all T au Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġreturns Ġa Ġlist Ġof Ġavailable Ġindices Ġpairs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠOnly Ġpairs , Ġst Ġthat ĠP =( a , b ) Ġwith Ġa > b Ġare Ġreturned Ġin Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġindices () Ġ= Ġbuild Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġa . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( i , Ġj )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġpairs Ġcomparison Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpairs : ĠSequence < Int > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices (). map Ġ{ Ġa [ it . first ]. compareTo ( a [ it . second ]) Ġ* Ġb [ it . first ]. compareTo ( b [ it . second ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġlist Ġof Ġnumbers Ġof Ġtied Ġvalues Ġin Ġthe Ġi - th Ġgroup Ġof Ġt ies Ġfor Ġthe Ġfirst Ġquantity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġt Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . indices . map Ġ{ ĠPair ( a [ it ], Ġit ) Ġ}. groupBy Ġ{ Ġit . first Ġ}. map Ġ{ Ġit . value . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġlist Ġof Ġnumbers Ġof Ġtied Ġvalues Ġin Ġthe Ġi - th Ġgroup Ġof Ġt ies Ġfor Ġthe Ġsecond Ġquantity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġu Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . indices . map Ġ{ ĠPair ( b [ it ], Ġit ) Ġ}. groupBy Ġ{ Ġit . first Ġ}. map Ġ{ Ġit . value . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġnumber Ġof Ġcon cord ant Ġpairs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġnc Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpairs . filter Ġ{ Ġit Ġ> Ġ 0 Ġ}. count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġnumber Ġof Ġdiscord ant Ġpairs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġnd Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpairs . filter Ġ{ Ġit Ġ< Ġ 0 Ġ}. count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġn 0 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . size Ġ* Ġ( a . size Ġ- Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġn 1 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . map Ġ{ Ġit Ġ* Ġ( it Ġ- Ġ 1 ) Ġ}. sum () Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġn 2 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu . map Ġ{ Ġit Ġ* Ġ( it Ġ- Ġ 1 ) Ġ}. sum () Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtau A () Ġ= Ġ 1 . 0 Ġ* Ġ( nc Ġ- Ġnd ) Ġ/ Ġn 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtau B () Ġ= Ġ( nc Ġ- Ġnd ) Ġ/ Ġsqrt ( 1 . 0 Ġ* Ġ( n 0 Ġ- Ġn 1 ) Ġ* Ġ( n 0 Ġ- Ġn 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ