Friday, December 21, 2012

Heap C++ implementation / Kopiec C++

Implementacja kopca w C++ oraz metod dla tej stuktury, dostępny jest również słownik pozwalający na orientownie się w hierarchii pierwotnej kopca gdy zaburzona zostanie jego struktura np. poprzez dodanie nowych elementów etc.
Heap C++ implementation with dictionary.
English ver in comments...
/*****************************************************************************/
/* Heap C++ implementation, methods n algorithms + dictionary showing index  */
/* of an element. Polish n English menu's versions available                 */
/* compile: g++ -Wall -pedantic heap.cpp                                     */
/* how to use: ./a.out                     -> n do whatever u want           */

#include <iostream>

//#define PL
#define ENG

using namespace std;

/*****************************************************************************/
/*!
 * \brief Object
 * \param value - wartosc liczbowa
 * \param key - klucz
 */
class Object
{
public:
 int value;
 int key;

 Object()
 {
       //srand((int)time(0));
       //value=rand()%(10);
    value=0;
 }

 ~Object(){}

};
/**/
/*****************************************************************************/

/*****************************************************************************/
/*!
 * \brief Heap
 * \param Tab - tablica wartosci kopca
 * \param Dictionary - slownik
 * \param n - takie n
 */
class Heap
{
public:
 Object *Tab;
 int n;
 int *Dictionary;
/*!
 * \brief Tworzy tablice obiektow rozmiaru size
 *        oraz slownik pozwalajacy na lokaalizacje
 *        elementow kopca gdy jego porzadek zostanie
 *        zaburzony
 *
 */
 Heap(int size)
 {
  n=size;

  Tab=new Object[size+1];
  Dictionary=new int[size+1];

  for(int i=1;i<=size+1;i++)
  {
  Tab[i].key=i;
  }

  for(int i=1;i<size+1;i++)
  {
  Dictionary[i]=Tab[i].key;
  }
 }
~Heap(){cout<<"boom!!! free machines's brain"<<endl;
            delete[] Tab; delete Dictionary;}


/*!
 * \brief Ustawia wartosc tablicy o danym kluczu
 */
void ChangeKElement(int k,int v)
{
         Tab[Dictionary[k]].value=v;
}

/*!
 * \brief Wypisuje wartosci kopca
 */
void PrintHeap()
{
    cout<<"Heap:"<<endl<<endl;;
    for(int i=1;i<n+1;i++)
        {
   cout<<Tab[i].value<<endl;
        }
}

/*!
 * \brief Wypisuje wartosci kluczy
 */
void PrintKeys()
{
    cout<<"Keys:"<<endl<<endl;;
    for(int i=1;i<n+1;i++)
  {
   cout<<Tab[i].key<<endl;
  }
}

/*!
 * \brief Wypisuje slownik
 */
void PrintDictionary()
{
    cout<<"Dictionary:"<<endl<<endl;;
    for(int i=1;i<n+1;i++)
  {
   cout<<Dictionary[i]<<endl;
  }
}

/*!
 * \brief Naprawia kopiec iteracyjnie
 */
void FixHeapIt()
{
       int p,d,tmp_w,tmp_k;


       for(int i=2;i<=n;i++)
       {
        d=i;
        p=d/2;


        tmp_w=Tab[i].value;
        tmp_k=Tab[i].key;

         while((p>0)&&(Tab[p].value>tmp_w))
          {
           Tab[d].value=Tab[p].value;
           Tab[d].key=Tab[p].key;
           Dictionary[Tab[p].key]=d;
            d=p;
            p=d/2;

         Tab[d].value=tmp_w;
         Tab[d].key=tmp_k;
         Dictionary[tmp_k]=d;
       }
    }

}

/*!
 * \brief tzw swap - zamiana elementow
 */
void siup(int *ptr1, int *ptr2)
{
   int tmp=*ptr1;
   *ptr1=*ptr2;
   *ptr2=tmp;
}

/*!
 * \brief Naprawia kopiec rekurencyjnie
 */
void FixHeapRe(int i)
{
       int star_wars=i;
       if(((2*i)<n+1) && (Tab[2*i].value<Tab[star_wars].value))
                      star_wars=2*i;
       if(((2*i+1)<n+1) && (Tab[2*i+1].value<Tab[star_wars].value))
                      star_wars=2*i+1;
       if(star_wars!=i)
         {
           siup(&Tab[star_wars].value,&Tab[i].value);
           siup(&Tab[star_wars].key,&Tab[i].key);
           siup(&Dictionary[Tab[star_wars].key],&Dictionary[Tab[i].key]);
           FixHeapRe(star_wars);
         }
}

/*!
 * \brief Buduje kopiec
 */
void BuildHeap()
{
    for (int i=n+1;i>0;i--)
       {
         FixHeapRe(i);
        }
}

/*!
 * \brief Wypisuje proste menu
 */
    void PrintMenu()
    {
         char opt='?';
         #ifdef ENG
         while(opt!='q')
         {
                          cout<<" "<<endl;
          cout<<"p - print heap"<<endl;
          cout<<"& - print keys"<<endl;
          cout<<"# - print dictionary"<<endl;
          cout<<"z - change value of key's element"<<endl;
          cout<<"r - fix heap"<<endl;
          cout<<"q - quit"<<endl;
          cin>>opt;

          switch(opt)
          {
                       case 'p': cout<<"--------"<<endl;
                                  PrintHeap(); opt='?'; break;
                       case '&': cout<<"--------"<<endl;
                                  PrintKeys(); opt='?'; break;
                       case '#': cout<<"--------"<<endl;
                                  PrintDictionary(); opt='?'; break;
                       case 'z': cout<<"object's key: "<<endl;
                                  int k1,w1;
                                  cin>>k1;
                                  cout<<"object's value: "<<endl;
                                  cin>>w1;
                                  ChangeKElement(k1,w1);opt='?'; break;
                       case 'r': cout<<"fixed:"<<endl;
                                   BuildHeap(); PrintHeap(); opt='?'; break;
                       case 'q': cout<<"maskotky's toy says hasta la vista!"<<endl;break;
          }
          #endif
          #ifdef PL
         while(opt!='q')
         {
                          cout<<" "<<endl;
          cout<<"p - wypisz kopiec"<<endl;
          cout<<"& - wypisz klucze"<<endl;
          cout<<"# - wypisz slownik"<<endl;
          cout<<"z - zamien wartosc elementu o danym kluczu"<<endl;
          cout<<"r - napraw kopiec"<<endl;
          cout<<"q - zakoncz"<<endl;
          cin>>opt;

          switch(opt)
          {
                       case 'p': cout<<"--------"<<endl;
                                  PrintHeap(); opt='?'; break;
                       case '&': cout<<"--------"<<endl;
                                  PrintKeys(); opt='?'; break;
                       case '#': cout<<"--------"<<endl;
                                  PrintDictionary(); opt='?'; break;
                       case 'z': cout<<"klucz: "<<endl;
                                  int k1,w1;
                                  cin>>k1;
                                  cout<<"wartosc: "<<endl;
                                  cin>>w1;
                                  ChangeKElement(k1,w1);opt='?'; break;
                       case 'r': cout<<"naprawiony:"<<endl;
                                   BuildHeap(); PrintHeap(); opt='?'; break;
                       case 'q': cout<<"maskotky's toy says hasta la vista"<<endl; break;
          }
          #endif
     }
    }
};
/**/
/*****************************************************************************/

int main()
{
    cout<<"\nhello, this is heap toy!"<<endl;

    Heap My_Heap(8); //kopiec ma 8 elementow

    // ustawienie elementow kopca
    My_Heap.ChangeKElement(1,4);
    My_Heap.ChangeKElement(2,3);My_Heap.ChangeKElement(3,7);
    My_Heap.ChangeKElement(4,9);My_Heap.ChangeKElement(5,8);
    My_Heap.ChangeKElement(6,5);My_Heap.ChangeKElement(7,2);
    My_Heap.ChangeKElement(8,1);
    //

    //My_Heap.BuildHeap();
    //My_Heap.PrintHeap();
    //My_Heap.PrintKeys();
    //My_Heap.PrintDictionary();

    My_Heap.PrintMenu();

 return 0;
}

No comments:

Post a Comment