Я хотел бы попросить вас помочь определить, какая часть моего кода неэффективна.Я сравниваю алгоритм QuickSort с алгоритмом CountingSort , предполагая, что число элементов в Array[Byte]
меньше 16.
Однако CountingSort время намного выше, чем QuickSort время, во всех тестах, которые я выполнял последовательно.Затем я хотел протестировать этот код в Spark , чтобы вычислить Медианный фильтр , но результаты распределенного времени выполнения соответствуют времени последовательного выполнения.Я имею в виду, что QuickSort всегда быстрее, чем CountingSort , даже для небольших массивов.
Очевидно, что в моем коде висит окончательная обработка.
Это код:
def Histogram(Input: Array[Byte]) : Array[Int] = {
val result = Array.ofDim[Int](256)
val range = Input.distinct.map(x => x & 0xFF)
val mx = Input.map(x => x & 0xFF).max
for (h <- range)
result(h) = Input.count(x => (x & 0xFF) == h)
result.slice(0, mx + 1)
}
def CummulativeSum(Input: Array[Int]): Array[Long] = Input.map(x => x.toLong).scanLeft(0.toLong)(_ + _).drop(1)
def CountingSort(Input: Array[Byte]): Array[Byte] = {
val hist = Histogram(Input)
val cum = CummulativeSum(hist)
val Output = Array.fill[Byte](Input.length)(0)
for (i <- Input.indices) {
Output(cum(Input(i) & 0xFF).toInt - 1) = Input(i)
cum(Input(i) & 0xFF) -= 1
}
Output
}