Реализовать PriorityQueue с помощью BinarySearchTree: Java

голоса
4

Мне нужно «создать приоритет очередь реализуется с помощью двоичного дерева поиска (BST)» для моего класса алгоритмов II. Тем не менее, я не уверен, как именно вы будете использовать дерево двоичного поиска в качестве приоритетной очереди. Может кто-то выяснить, что это такое, что назначение просит меня сделать?

В качестве ссылки, здесь Методы PriorityQueue должны реализовать:

add – adds a new item to the queue
peek – returns the head of the queue
remove – removes the head of the queue and returns it
search – returns the position of an element in the queue, or -1 if it is not found.
size – returns the total number of elements in the queue
inorder – returns an in-order, comma-separated string of every element in the queue
preorder – returns an pre-order, comma-separated string of every element in the queue
height – returns the height of the underlying BST

Заранее спасибо за любые советы !!

Задан 21/05/2011 в 22:50
источник пользователем
На других языках...                            


3 ответов

голоса
0

Бинарное дерево поиска используются для эффективного поддержания элементов в отсортированном порядке. Если вид порядка основана на приоритете, то ваше бинарное дерево становится приоритетной очередью. Вы палить наивысший приоритет пункта и вставить новые элементы в соответствии с их приоритетом.

Отредактированный, чтобы добавить:

Это может помочь рассмотреть альтернативные варианты - если вы использовали связный список в качестве очереди, как вы знаете, куда вставить новый элемент, кроме пешком весь путь вниз по списку, который является O (N) с худшим случаем от N. Использование двоичного дерева решает эту проблему.

Ответил 21/05/2011 в 22:57
источник пользователем

голоса
4

Двоичное дерево всегда упорядочено и всегда будет оставаться в порядке , если новые элементы вставляются.

Основное преимущество бинарных дерев поиска по сравнению с другими структурами данных является то, что связанными с ними алгоритмы сортировки и алгоритмы поиска, такими как упорядоченный обход могут быть очень эффективными.

И это ваша очередь приоритет. В возможной реализации, элементы с наименьшим приоритетом будет получить наибольшее количество и предметы с наивысшим приоритетом получит наименьший номер. Если эти элементы вставляются в BST , и вы читаете это inorder, то у вас есть порядок , в котором очередь должна быть обработана.

Для обработки очереди, вы «поп» от первого элемента в дереве, а остальные будут упорядочены автоматически BST.

Единственное, что вы должны позаботиться о том, правильное введение новых элементов в дереве и что произойдет, если первый из них удаляется.

Ваши методы будут соотнесены с операциями дерева, addвставляют новый элемент в нужном месте и изменить дерево , если это необходимо, sizeнапример , возвращает размер дерева, inorderбудут перемещаться по дереву.

Надеюсь, что сделал это немного яснее.

Ответил 21/05/2011 в 22:58
источник пользователем

голоса
0

добавить быстрый взгляд удалить стандартные методы для BST

для поиска вы можете кэшировать размер в каждом узле , который будет текущее число элементов в поддереве которого узел является корнем (или другими словами node.size = 1+ (node.right==null?0:node.right.size) + (node.left==null?0:node.left.size))

то поиск будет

int search(E el,Node n){
    if(n==null)return -1;//stop recursion && nullpointer
    int comp = el.compareTo(n.value);
    if(comp==0)return n.left==null?0:node.left.size;
    else if(comp<0){
        return search(el,node.left);
    }else{
        int res = search(el,node.right)
        return res<0?res:res+(n.left==null?0:node.left.size)+1;//pass through -1 unmodified
    }
}
Ответил 21/05/2011 в 23:08
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more