Может ли кто-нибудь помочь мне быстрее реализовать j2ME алгоритм Dijkstra? У меня две петли, одна внутри. Как этоСамый быстрый алгоритм Дейкстры для j2ME
while(for each item in Q)
{
//...do something.
//the following loop is to find the minimum
for(all un-visited nodes in Q)
{
//.. do something to get min.
}
}
меня почти 23000 узлов и 50000 ребра, соединяющие их ... Внутренний цикл выполняется в среднем 169330131 раз после всех улучшений, указанных ниже. Это займет 5 минут, чтобы завершить мой w910i мобильный и более чем на минут на моем эмуляторе. Это слишком много для меня. Любые предложения по улучшению? У меня уже есть следующие улучшения.
- Использование массива вместо вектора.
- Убедитесь, что внутренний цикл не учитывает посещенные узлы. Все мои посещенные узлы находятся в конце массива, и я узел знаю счет. Поэтому я могу легко пропустить их вообще.
Я назвал этот алгоритм. Я нашел более простой алгоритм в другом месте. Обратите внимание, что если бы мне пришлось внедрить тот, который был в Википедии, есть два внутренних цикла. , а Q не пуст: // Внешняя петля. u: = вершина в Q с наименьшим dist []; // Первый внутренний цикл. .... для каждого соседа v из u: // Второй внутренний цикл. Вторая внутренняя петля меньше. Он может выполнять максимум 4-5, поскольку для каждого узла должно быть не более 5 ребер. Число узлов, имеющих более 2 ребер, составляет 1000 из 23000 общих узлов. Таким образом, время выполнения для внутреннего цикла пренебрежимо мало. – dmantamp
Вы читали раздел в википедии о времени работы? Он предлагает использовать списки смежности и двоичную кучу или какую-либо другую структуру в качестве очереди приоритетов - это в значительной степени удалит этот первый внутренний цикл –
. Присмотритесь внимательно, Deekshit - если вы используете приоритетную очередь (кучу) для Q, находите наименьший элемент в Q равен O (1), что делает общее время выполнения O (n + m) числом узлов и ребер. –