Есть ли способ исправить мой Макс heapify в моем коде - PullRequest
0 голосов
/ 03 февраля 2019

Проблема в том, что я пытаюсь исправить максимальную кучу, она не работает, так как ошибка продолжает возникать.Я следил за псевдокодом из нескольких книг, но ошибки все еще отображаются.Я пытаюсь обменять A[i] на A[largest], используя = для обмена, но вместо этого выдается ошибка

class Heap {
// public for JUnit testing purposes
public ArrayList<Integer> array;
public int heap_size;

public Heap(int size) {
}
public Heap(List<Integer> source) {
    this(source, false);
}
public Heap(List<Integer> source, boolean incremental) {
}

public static int parent(int index) {
    return index/2;
}
public static int left(int index) {
    return 2 * index;
}
public static int right(int index) {
    return (2 * index) + 1;
}

public void maxHeapify(int i, int A)
{
  int l = left(i);
  int r = right(i);
  if(l <= A.heap_size && A[l] > A[i])
    largest = l;
  else
    largest = i;
  if(r <= A.heap_size && A[r] > A[largest])
    largest = r;
  if(largest != i)
  {
    A[i] = A[largest];
    maxHeapify(A,largest);
  }
}
public void buildMaxHeap() {
}
public void insert(Integer k) {
}
public Integer maximum() {
    return 0;
}
public Integer extractMax() {
    return 0;
 }
}

Я ожидаю, что он запустится, но я получаю ошибку

    Heap.java:31: error: int cannot be dereferenced
  if(l <= A.heap_size && A[l] > A[i])
           ^
   Heap.java:31: error: array required, but int found
  if(l <= A.heap_size && A[l] > A[i])
                          ^
  Heap.java:31: error: array required, but int found
  if(l <= A.heap_size && A[l] > A[i])
                                 ^
    Heap.java:32: error: cannot find symbol
    largest = l;
    ^
   symbol:   variable largest
   location: class Heap

Если можете, пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Согласно сообщениям об ошибках, проблема в том, что аргумент A maxHeapify является целочисленным значением.Вам необходимо передать аргумент A в виде массива.

public void maxHeapify(int i, int[] A) {
    int largest = i;
    int l = left(i);
    int r = right(i);

    if(l < A.length && A[l] > A[largest])
        largest = l;
    if(r < A.length && A[r] > A[largest])
        largest = r;

    if(largest != i)
    {
        int tmp = A[i];
        A[i] = A[largest];
        A[largest] = tmp;
        maxHeapify(largest, A);
    }
}

Я протестировал вышеупомянутый maxHeapify в следующем коде.

public class HeapMain {
    public static void main(String[] args) {
        // Note: ignore the value at index 0
        int[] A = new int[]{-1, 3, 9, 10, 4, 2, 33, 5};
        Heap heap = new Heap(A.length);
        for (int i = heap.parent(A.length - 1); i > 0; i--) {
            heap.maxHeapify(i, A);
        }

        // You will get => 33 9 10 4 2 3 5
        for (int i = 1; i < A.length; i++) {
            System.out.print(A[i]);
            System.out.print(" ");
        }
        System.out.println();
    }
}

Примечание: родительский, левый и правый методы предполагают, что узлы кучи в массиве сохранены из индекса 1.

Следующий URL может быть полезен.

https://www.youtube.com/watch?v=ixdWTKWSz7s

0 голосов
/ 03 февраля 2019

== - оператор сравнения.Если вы хотите присвоить значение, вы должны использовать оператор =:

A[i] = A[largest];
...