MinHeap с 2 полями ... removeMin и удалить данный ключ - PullRequest
0 голосов
/ 27 марта 2020

У меня есть программа, чтобы прочитать список стран и их ВВП из файла и вставить их в MinHeap. Куча - это коллекция (массив) объектов Country. Объект Country имеет два поля. Строковое поле с именем name, которое содержит двухбуквенный код страны и целочисленное поле gdp для хранения значения ВВП. Метод вставки использует значения ВВП в качестве ключей для вставки. Поскольку это MinHeap, страна с минимальным ВВП всегда будет на уровне root. Также все остальные свойства кучи должны выполняться после каждой вставки и удаления. Во входном файле не будет повторяющихся значений ВВП.

Мне нужно заполнить класс Heap. java, чтобы реализовать следующие функции:

removeMinGDP () ; Нужно вывести страну с минимальным ВВП из кучи и вернуть ее. После удаления свойство кучи должно быть восстановлено. верните ноль, если куча была пустой.

removeGivenGDP (int gdp) : должен найти страну с данным значением ВВП и удалить ее. После удаления свойство кучи должно быть восстановлено. Эта функция должна возвращать название страны, которая была удалена. если страна с данным значением ВВП не может быть найдена, верните пустую строку.

Мне нужна помощь по removeMinGDP. Я знаю, что буду удалять root и заменять его на самый большой элемент. Я знаю, что должен подорвать. Я знаю общую идею, но не знаю, как ее реализовать. ТАК ОСНОВНО Я застрял, потому что removeMinGDP не принимает параметры, поэтому мне пришлось создать два закрытых метода, НО я не знаю, что передать в deleteMin.

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


  private Country[] storage; //the actual heap storing elements
  private int size; //number of elements currently in the heap
  private int cap; //capacity of the heap

  Heap (int c) {
    size = 0;
    cap = c;
    storage = new Country[cap];
  }

  public void insert(Country c) {
    if (size >= cap) {
      throw new IllegalStateException("Heap is full");
    }
    int curr = size++;
    storage[curr] = c;
    while ((curr != 0) && (storage[curr].gdp < storage[parent(curr)].gdp)) {
      exch(storage, curr, parent(curr));
      curr = parent(curr);
    }

  }

  private void exch(Country[] arr, int i, int j) {
    Country tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
  }

  private int parent(int i) {
    if (i <= 0) return -1;
    return (i-1)/2;
  }

  public int numCountries () {
    return size;
  }

  public boolean isEmpty() {
    return size == 0;
  }

  private boolean isLeaf(int pos)
  { 
    return (pos >= size/2) && (pos < size); 

  }

  private int leftchild(int pos) {
    if (pos >= size/2) return -1;
    return 2*pos + 1;
  }


  private int rightchild(int pos) {
    if (pos >= (size-1)/2) return -1;
    return 2*pos + 2;
  }

//***************************************************************************

  public Country removeMinGDP() {
    /**************************
     * remove the country with minimum  GDP
     * from the heap and return it. restore
     * the heap properties.
     * return null if heap is empty.
    ***************************/
    if(isEmpty()) return null;
    else{
      return deleteMin(arr,size);
  }
  }

  private Country deleteMin(Country arr[], int n){
    int last = arr[n-1];
    Country temp = arr[0];
    arr[0] = last;
    n = n-1;
    downheap(arr,n,0);
    return temp.name;
  }

  private void downheap(Country arr[], int n, int i){
    int biggest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;

    if(l < n && arr[l].gdp > arr[biggest].gdp) biggest = l;
    if(r < n && arr[r].gdp > arr[biggest].gdp) biggest = r;
    if(biggest != i){
      int swap = arr[i];
      arr[i] = arr[biggest];
      arr[biggest] = swap;

      downheap(arr, n, biggest);
    }
  }


  public String removeGivenGDP(int gdp) {
    /**************************
     * TODO: find the country with the given GDP 
     * value and remove it. return the name of 
     * the country and restore the heap property
     * if needed. If no countries with the given GDP
     * were found, return empty string ""
    ***************************/
    return "";
  }
}

Вот основная функция.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

class Main {
  public static void main(String[] args) throws FileNotFoundException {
    File input = new File("countries.txt");

    //Creating Scanner instance to read File
    Scanner sc = new Scanner(input);

    //Create an instance of MinHeap
    Heap h = new Heap(10);

    //Reading each line of file using Scanner class
    while(sc.hasNextLine()){
        String[] tokens = sc.nextLine().split(",");
        System.out.println("Inserted: " + tokens[0] + " -> " + tokens[1]);
        h.insert(new Country(tokens[0], Integer.parseInt(tokens[1].trim())));
    }

    System.out.println("\n\nTotal number of countries inserted is: " + h.numCountries());
    System.out.println("The name of the country with a GDP value of 2314 is " + h.removeGivenGDP(2314));
    System.out.println("Total number of countries now is: " + h.numCountries());

    System.out.println("\n\nCountries in ascending order of GDP values: ");
    while (!h.isEmpty()) {
      Country tmp = h.removeMinGDP();
      System.out.println(tmp.name + " -> " + tmp.gdp);
    } 

  }
}

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Чтобы удалить данный ВВП, вам необходимо:

  1. Искать в массиве storage запись, содержащую запрошенное значение.
  2. Скопировать последний узел в куче в это место.
  3. Уменьшите размер на 1.
  4. Если новое значение (то, которое вы скопировали с последнего узла) меньше, чем его родитель, то вам нужно отсеять этот узел вверх в кучу. В противном случае вам нужно откинуть его вниз в нужное место.

Да, последний узел, безусловно, может быть меньше, чем родительский узел удаленного вами узла. См. { ссылка } для примера.

0 голосов
/ 27 марта 2020

deleteMin и downheap не нуждаются в параметрах Country arr[] или int n. Они должны работать непосредственно с переменными экземпляра storage и size:

  private Country deleteMin(){
    int last = storage[size-1];
    Country temp = storage[0];
    storage[0] = last;
    ...

Класс инкапсулирует состояние : методы в вашем классе Heap могут работать напрямую с деталями реализации низкого уровня, как массив "хранения".

...