algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Kopiec (Stóg) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 11
SłabyŚwietny
Nadesłany przez Marek Rusinowski, 04 lipca 2010 17:41
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

kopiec.h:
/*
 Copyright 2010 Marek p2004a Rusinowski
 www.algorytm.org
*/

#include <cmath>

#define MAX true
#define MIN false

class Heap {
  unsigned int max_size, size, *data;
  bool which;

  void swap(unsigned int index_a, unsigned int index_b) {
    unsigned int x = data[index_a];
    data[index_a] = data[index_b];
    data[index_b] = x;
  }

  bool cmp(unsigned int index_a, unsigned int index_b) {
      return which ? ( data[index_a] < data[index_b] ? true : false) : (data[index_a] > data[index_b] ? true : false);
  }

 public:
  // pobiera aktualna wysokosc kopca
  unsigned int getHeight() {
    return (unsigned int) floor((log((long double) size) / log((long double) 2)) + 1);
  }
  
  // pobiera aktualny rozmiar kopcac (ilosc elementow)
  unsigned int getSize() {
    return size;
  }
  
  // pobiera aktualny maksymalny rozmiar kopca
  unsigned int getMaxSize() {
    return max_size;
  }

  // konstruktor kopca;
  //   jako parametr max_size okreslamy poczatkowy maksymany rozmiar kopca, w parametrze max okreslamy warunek kopca czyli czy ma byc max (normalny) czy min kopiec
  Heap(unsigned int max_size, bool max = true);
  
  // wstawia element do kopca; 
  //   jako parametr value podajemy wartosc nowego elementu
  //   zwraca true jesli sie udalo i false jesli nie (np kopiec pelny)
  bool insert(unsigned int value);
  
  // usowa korzen kopca; 
  //   zwraca wartosc usuwanego korzenia
  unsigned int erase();
  
  // zmienia rozmiar kopca (nowa wartosc moze byc wieksza, moze byc mniejsza);
  //   jako parametr podajemy nowy maksymalny rozmiar kopca
  //   zwraca true jesli sie udalo i false jesli nie (np kopiec zajmuje za duzo i nie da sie zmniejszyc jego maksymalnego rozmiaru na podany)
  bool resize(unsigned int new_size);
};


kopiec.cpp:
/*
 Copyright 2010 Marek p2004a Rusinowski
 www.algorytm.org
*/

#include "kopiec.h"
#include <cstring>
#include <cstdio>
#include <cmath>

Heap::Heap(unsigned int ssize, bool max): max_size(ssize), data(new unsigned int [ssize + 2]), size(0), which(max) {
  memset(data, (max ? 0 : 0xFFFFFFFF) , ssize + 2);
}

bool Heap::insert(unsigned int value) {
  if (size == max_size) {
    return false;
  }
  data[size++] = value;
  for (unsigned int i = size; i != 1; i /= 2) {
    if (cmp((i / 2) - 1, i - 1)) {
      swap((i / 2) - 1, i - 1);
    } else {
      break;
    }
  }
  return true;
}

unsigned Heap::erase() {
  if (size == 0) {
    return 0;
  }
  unsigned value = data[0];
  data[0] = data[--size];
  unsigned i = 1;
  while (i * 2 <= size) {
    register unsigned tmp = cmp((i * 2) - 1, i * 2) ? (i * 2) : (i * 2) - 1;
    if (cmp(i - 1, tmp)) {
      swap(i - 1, tmp);
      i = tmp + 1;
    } else {
      break;
    }
  }
  return value;
}

bool Heap::resize(unsigned new_size) {
  if (new_size < size) {
    return false;
  }
  max_size = new_size;
  unsigned *tmp = new unsigned [new_size];
  memset(tmp, (which ? 0 : ~0) , new_size);
  memcpy(tmp, data, size);
  delete [] data;
  data = tmp;
  return true;
}

Komentarze
photo
-1 # p2004a 2017-03-02 14:07
Aktuany skrypt na stronie: webmastera.republika.pl/
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz