カスタム順序で整数の配列をソートしようとしています。
例えば
quickSort[Int](indices)(Ordering.by[Int, Double](value(_)))
基本的に、特定の列の値で行のインデックスを並べ替えようとしています。かなり大きなデータに対してこれを実行すると、stackoverflow エラーが発生します。より直接的なアプローチ (タプルの並べ替えなど) を使用する場合、これは問題になりません。
デフォルトの Ordering[Int] を拡張しようとすると問題がありますか?
これは次のように再現できます。
val indices = (0 to 99999).toArray
val values = Array.fill[Double](100000)(math.random)
scala.util.Sorting.quickSort[Int](indices)(Ordering.by[Int, Double](values(_))) // Works
val values2 = Array.fill[Double](100000)(0.0)
scala.util.Sorting.quickSort[Int](indices)(Ordering.by[Int, Double](values2(_))) // Fails
アップデート:
問題が何であるかがわかったと思います(自分の質問に答えています)。整数の順序定義を変更することで、逆説的な状況を作り出したようです。
クイックソート アルゴリズム自体の内部では、配列の位置も整数であり、配列の位置を比較する特定のステートメントがあります。この位置比較は、標準の整数順序に従っている必要があります。
しかし、新しい定義により、これらの位置コンパレーターもインデックス付き値コンパレーターに追従するようになり、事態は本当に混乱しています。
ライブラリはデフォルト値の型の順序に依存する可能性があるため、少なくとも当面は、これらのデフォルト値の型の順序を変更すべきではないと思います。
Update2
上記は実際には問題ではなく、Ordering と一緒に使用すると、quickSort にバグがあることが判明しました。新しい順序付けが定義されると、順序付け間の等値演算子は「equiv」ですが、クイックソートでは「==」が使用されます。これにより、インデックス付きの値が比較されるのではなく、インデックスが比較されます。