Удаление Java PriorityQueue произвольной производительности элементов

Как прокомментировал @khelwood при импорте модулей с использованием import network3, вам необходимо предоставить пространство имен для доступа к функциям и классам, определенным внутри network3:

network3.ReLu
network3.linear
network3.ConvPoolLayer

Чтобы можно было просто использовать ReLu , linear и ConvPoolLayer вы можете изменить строку импорта на одну из следующих:

from network3 import *

или

from network3 import ReLu, linear, ConvPoolLayer
7
задан weiyin 16 April 2009 в 15:53
поделиться

1 ответ

Если вы используете реализацию Sun, это O (log (n)) . Из Javadocs :

Примечание о реализации: эта реализация обеспечивает O (log (n)) время для методов enqueing и dequeing ( предлагают , опрос , remove () и add ); Линейное время для удаления (Объект) и содержит (Объект) методы; и постоянное время для методов поиска ( peek , element и size ).

Другие реализации могут иметь различную сложность.


Редактировать: Javadocs не покрыть производительность удаления элемента с помощью итератора, поэтому мне пришлось искать исходный код. Все это относится к реализации Sun и может отличаться версией Apple, GNU Classpath и т. Д. Источник Sun доступен здесь здесь ; он также включен в JDK, так что вы, возможно, уже установили его.

В итераторе PriorityQueue случай по умолчанию для remove () заключается в вызове PriorityQueue.removeAt (lastRet) , где lastRet - это индекс, который последний раз был возвращен функцией next () . removeAt () представляется O (log (n)) наихудшим случаем (возможно, придется просеять очередь, но не нужно повторять).

Однако, иногда случаются плохие вещи. Из комментариев removeAt () :

/**
 * Removes the ith element from queue.
 *
 * Normally this method leaves the elements at up to i-1,
 * inclusive, untouched.  Under these circumstances, it returns
 * null.  Occasionally, in order to maintain the heap invariant,
 * it must swap a later element of the list with one earlier than
 * i.  Under these circumstances, this method returns the element
 * that was previously at the end of the list and is now at some
 * position before i. This fact is used by iterator.remove so as to
 * avoid missing traversing elements.
 */

Когда ненулевой элемент возвращается removeAt () , итератор добавляет его в специальную очередь для последующего использования: когда В итераторе заканчиваются элементы в очереди, затем он перебирает эту специальную очередь. Когда remove () вызывается во время этой второй фазы итерации, итератор вызывает PriorityQueue.removeEq (lastRetElt) , где lastRetElt - последний элемент, возвращенный из особая очередь removeEq вынужден использовать линейный поиск, чтобы найти правильный элемент для удаления, что делает его O (n) .

10
ответ дан 7 December 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: