2014-11-01 4 views
1

Я пытаюсь реализовать очередь приоритетов, используя minheap, но мои объекты выходят из очереди в неправильном порядке. Моя интуиция подсказывает мне, что проблема связана с моими методами просеивания вверх или вниз в очереди, но я не вижу, где проблема. Мог ли кто-нибудь взглянуть на мои алгоритмы и посмотреть, есть ли что-то неправильное, что сразу видно? Заранее спасибо.Реализация очереди приоритетов с минимальной кучей

Вот метод для просеивания вниз:

private void walkDown(int i) { 

    if (outOfBounds(i)) 
    { 
     throw new IndexOutOfBoundsException("Index not in heap : " + i); 
    } 

    int current = i; 
    boolean right; 
    Customer temp = this.heap[i]; 

    while (current < (this.size >>> 1)) 
    { 

     right = false; 

     if (right(current) < this.size && 
       this.comparator.compare(this.heap[left(current)], 
         this.heap[right(current)]) > 0) 
     { 
      right = true; 
     } 


     if (this.comparator.compare(temp, right ? this.heap[right(current)] 
       : this.heap[left(current)]) < 0) 
     { 
      break; 
     } 

     current = right ? right(current) : left(current); 
     this.heap[parent(current)] = this.heap[current]; 

    } 

    this.heap[current] = temp; 

} 

И метод для просеивания до:

private void walkUp(int i) { 

    if (outOfBounds(i)) 
    { 
     throw new IndexOutOfBoundsException("Index not in heap : " + i); 
    } 

    int current = i; 
    Customer temp = this.heap[i]; 

    while (current > 0) 
    {   
     if (this.comparator.compare(this.heap[current], 
        this.heap[parent(current)]) >= 0) 
     { 
      break; 
     } 

     this.heap[current] = this.heap[parent(current)]; 
     current = parent(current); 

    } 

    this.heap[current] = temp; 

} 

EDIT:

Сравнения метод определяется следующим образом:

 @Override 
     public int compare(Customer cust1, Customer cust2) { 

      return cust1.priority() - cust2.priority(); 

     } 
+0

Не могли бы вы отправить свой метод сравнения? В этом случае кажется, что он используется для большей части логики. –

+0

также есть глобальные объекты, называемые слева и справа? Вероятно, не очень хорошая идея также иметь логическое имя справа. –

ответ

0

I ende d написание метода, который выполняет вышеописанный метод для каждого элемента в куче, и это сработало. Это не изящное решение, но оно выполняет свою работу.

Смежные вопросы