Ситуация: в конце процесса, порождающего мир моей игры, я остаюсь с 2048^2 (~ 4.2 миллиона) Размер Стек плитки. Затем мне нужно вычислить, где в списке моих обработчиков стеков им нужно идти. Вот мой метод:Алгоритм для ускорения обработки этих данных? (сортировка стека размером 4,2 МБ)
public static final void addTile(Tile t){
for(int i = 0; i < sections.length; i++)
for(int j = 0; j < sections[i].length; j++)
if(sections[i][j].contains(t.x, t.y)){ //<-- determine which list according to tile's pos
world.get(i).get(j).get(TILE_LIST).push(t);
return;
}
}
Существует Rectangle[][]
, что соответствует каждой точке, в «мире» arraylist
. Как вы можете видеть, это цикл O(n^2)
, который необходимо выполнить 4,2 миллиона раз. Даже с 4 потока, выполняющихся одновременно Обработка всех плиток занимает ~ 20 секунд.
Это не совсем нестабильное время обработки, но я думаю, что должен быть лучший алгоритм. Какие-либо предложения?
Было бы здорово знать, что ваш "содержит" делает. Если это какой-то поиск, я бы предложил хранить данные по-разному (для лучшего обратного поиска). Если это фактически функция, нужно было бы знать структуру, чтобы «инвертировать» ее. –
@JFMeier Meier Это прямоугольник содержит метод, как я уже сказал, «разделы» - это прямоугольник [] []. –
Сохранены ли разделы в отсортированном порядке? Если так, возможно, петли могут быть заменены двоичным поиском. –