Я сделал алгоритм срединного фильтра, и я хочу его оптимизировать. В настоящее время занимает около 1 секунды, чтобы фильтровать строки 2MM (файл читается в ArrayList elements
), и я пытаюсь уменьшить его до меньшего (возможно, в половине случаев?). Я использую ArrayLists для своего алгоритма и минимизировал использование вложенных циклов чтобы избежать увеличения времени, однако я до сих пор не могу достичь менее 0,98 секунд.Есть ли что-то быстрее, чем Collections.sort() в Java?
Вот фрагмент кода, который делает медианный фильтр:
//Start Filter Algorithm 2
int index=0;
while(index<filterSize){
tempElements.add(this.elements.get(index+counter)); //Add element to a temporary arraylist
index+=1;
if(index==filterSize){
outputElements.add(tempElements.get((filterSize-1)/2)); //Add median Value to output ArrayList
tempElements.clear(); //Clear temporary ArrayList
index = 0; //Reset index
counter+=1; //Counter increments by 1 to move to start on next element in elements ArrayList
}
if(elementsSize-counter <filterSize){
break; //Break if there is not enough elements for the filtering to work
}
}
Что происходит, что я перекручивание через elements
ArrayList для filterSize
я предоставил. Затем я добавляю элементы во временный (tempElements
) arraylist, сортирую его с помощью Collections.sort()
(это то, чего я хочу избежать), найдите медианное значение и добавьте его в мой конечный выходный arraylist. Затем я очищаю arraylist tempElements
и продолжаю проходить через мой цикл, пока я не смогу фильтровать больше из-за отсутствия элементов (меньше filterSize
).
Я просто ищу способ оптимизировать его и получить его быстрее. Я попытался использовать TreeSet, но я не могу получить значение из индекса из него.
Благодаря
Трудно сказать, какой из них оптимален, этот или на основе выбора. В этом случае вы выполняете в общей сложности _n_ между сравнениями и присваиваниями за итерацию; вы можете написать выбор только для одного назначения (путем отслеживания первого элемента для удаления, как в круговом буфере), тогда вы выполняете не более _n_ между сравнениями и назначениями. Я думаю, что это случай, когда профилирование и множество тестовых данных скажут вам, какой алгоритм работает быстрее. –
Я буду делать оба алгоритма и отчитываться, какой из них быстрее. У меня есть хороший набор данных для тестирования алгоритмов. Большое спасибо за помощь – nTuply