Минимальная куча Java уменьшает размер массива после удаления элемента - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю приоритетную очередь (свою собственную в виде массива) с минимальной сортировкой кучи, где я реализую метод, который удаляет первый элемент в приоритетной очереди (мой массив), который является корневым. Затем я снова вызываю метод heapifyNumbers() в моем массиве, чтобы снова отсортировать массив в минимальной куче. Проблема только в том, что я не могу уменьшиться из массива, поэтому последние два элемента будут повторяться.

Это метод удаления, который я создаю

public void deleteMinimum(int[] array){
    array[0] = array[array.length - 1];
    heapSort(array);
    //here I want to decrease array size by 1 after heap sorting the array
}

Здесь я просто заменяю первый индекс на последний индекс, а затем снова вызываю метод heapifyNumbers() в моем массиве, чтобы отсортировать массив. Как мне уменьшить размер массива на 1? Я знаю, что массивы нельзя уменьшить, но я вижу все реализации этого с использованием массивов, так что, возможно, должен быть какой-то способ создания нового массива?

Это мой вывод:

Перед сортировкой кучи:
[1, 10, 16, 19, 3, 5]

После сортировки кучи:
[1, 3, 5, 10, 16, 19]

После удаления:

Здесь есть дубликаты 19

[3, 5, 10, 16, 19, 19]

Я сделал это arr = Arrays.copyOf(array, array.length -1);, но я не знаю, содержит ли он временную сложность Log N

Это мой полный код, если вам интересно:

import java.util.*;

public class ObligatoriskOpgave2 {
    int[] arr={1,10,16,19,3,5};

    public static void buildheap(int []arr) {

        /*
         * As last non leaf node will be at (arr.length-1)/2
         * so we will start from this location for heapifying the elements
         * */
        for(int i=(arr.length-1)/2; i>=0; i--){
            heapifyNumbers(arr,i,arr.length-1);
        }
    }

    public static void heapifyNumbers(int[] arr, int i, int size) {
        int left = 2*i+1;
        int right = 2*i+2;
        int max;
        if(left <= size && arr[left] > arr[i]){
            max=left;
        } else {
            max=i;
        }

        if(right <= size && arr[right] > arr[max]) {
            max=right;
        }
        // If max is not current node, swapCurrentNodeWithMaximumOfChildren it with max of left and right child
        if(max!=i) {
            swapCurrentNodeWithMaximumOfChildren(arr,i, max);
            heapifyNumbers(arr, max,size);
        }
    }

    public static void swapCurrentNodeWithMaximumOfChildren(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    public static int[] heapSort(int[] arr) {

        buildheap(arr);
        int sizeOfHeap=arr.length-1;
        for(int i=sizeOfHeap; i>0; i--) {
            swapCurrentNodeWithMaximumOfChildren(arr,0, i);
            sizeOfHeap=sizeOfHeap-1;
            heapifyNumbers(arr, 0,sizeOfHeap);
        }
        return arr;
    }

    public void deleteMinimum(int[] array){
        array[0] = array[array.length - 1];
        heapSort(array);
    }

    public static void main(String[] args) {
        ObligatoriskOpgave2 o = new ObligatoriskOpgave2();

        System.out.println("Before Heap Sort : ");
        System.out.println(Arrays.toString(o.arr));
        o.arr=heapSort(o.arr);
        System.out.println("=====================");
        System.out.println("After Heap Sort : ");
        System.out.println(Arrays.toString(o.arr));


        o.deleteMinimum(o.arr);
        System.out.println(Arrays.toString(o.arr));
    }
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Решением было иметь значение HeapSize int, которое уменьшается при каждом удалении элемента. В следующий раз, когда массив будет повторен в цикле for, мы не пойдем дальше, чем размер кучи.

0 голосов
/ 06 ноября 2018

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

Массив - это контейнерный объект, который содержит фиксированное количество значений одного типа. Длина массива устанавливается при его создании. После создания его длина фиксируется.

Итак, если вы хотите использовать массив, вы должны создать новый массив с новой длиной.
И заполните новый массив значением старого массива. (см. часть Копирование массивов в первой ссылке)

...