Дарааллыг нэг холбоост
жагсаалт ашиглан нэвтрүүлэх
          Лекц № 13
                      LOGO
Хичээлийн агуулга




Багш: В.Нямсүрэн
Дарааллыг динамикаар
тодорхойлох шаардлага
 Дарааллыг массив ашиглан нэвтрүүлэх үед
  массивын хэмжээгээр дараалалд хадгалагдах
  элемэнтийн тоо хязгаарлагдаж байсан.

 Мөн дарааллын дүүрсэн болон хоосон байх
  төлвийг тодорхойлоход нилээд төвөгтэй байсан.




Багш: В.Нямсүрэн
Дарааллыг динамикаар
тодорхойлох шаардлага
 Тэгвэл дарааллыг нэвтрүүлэх бас нэг арга нь нэг
  холбоост жагсаалт ашиглах явдал юм.
 Дарааллын зарчим ѐсоор дарааллын эхлэл,
  төгсгөлийн хоѐр элемэнтээс бусад элемэнтэд
  хандах шаардлагагүй байдаг.
 Тиймээс нэг холбоост жагсаалтын эхлэл
  төгсгөлийн    элемэнтийг     заах     заагчийн
  тусламжтайгаар дараалалд хийх үйлдлүүдийг
  гүйцэтгэх боломжтой.




Багш: В.Нямсүрэн
Дарааллыг нэг холбоост
жагсаалтаар илэрхийлэх
 Дарааллыг нэг холбоост жагсаалтаар илэрхийлж
  байгаа тул
    Элемэнт буюу зангилаа нь өгөгдөл ба
     холбоос гэсэн хоѐр хэсгээс тогтоно.
    Хийгдэх     үйлдлүүд      нь      дараалалд
     зөвшөөрөгдсөн үйлдлүүд байна. Харин
     дарааллыг динамикаар тодорхойлж байгаа
     тул   дүүрсэн   эсэхийг    шалгах    үйлдэл
     тодорхойлохгүй.




Багш: В.Нямсүрэн
Давхар төгсгөлт дараалал
/Double Ended Queue/
 Элемэнт нэмэх ба устгах үйлдлийг аль ч
  төгсгөлд нь гүйцэтгэж болох дарааллыг давхар
  төгсгөлт дараалал гэнэ.

 Давхар төгсгөлт дараалал нь нэг талаас эсрэг
  чиглэлтэй хоѐр дарааллын нэгдэл, нөгөө талаас
  хоѐр стекийн нэгдэл юм.

 Давхар төгсгөлт дарааллыг хоѐр холбоост
  жагсаалт ашиглан нэвтрүүлэх нь зохимжтой.


Багш: В.Нямсүрэн
Давхар төгсгөлт дараалал



 Давхар төгсгөлт дарааллын тухайн нэг төгсгөлд
  орсон элемэнт тэр төгсгөлөөрөө гарвал стекийн
  зарчмаар, харин нөгөө төгсгөлөөрөө гарвал
  дарааллын зарчмаар ажиллах болно




Багш: В.Нямсүрэн
Давхар төгсгөлт дараалал
 Мөн элемэнт нэмэх үйлдлийг нэг төгсгөлд,
  элемэнт устгах үйлдлийг хоѐр төгсгөлд нь хийх
  боломжтой давхар төгсгөлт дарааллыг оролт нь
  хязгаарлагдмал давхар төгсгөлт дараалал
  гэнэ.

 Харин элемэнт нэмэх үйлдлийг хоѐр төгсгөлд,
  элемэнт устгах үйлдлийг нэг төгсгөлд нь хийх
  боломжтой давхар төгсгөлт дарааллыг гаралт
  нь хязгаарлагдмал давхар төгсгөлт дараалал
  гэнэ.

Багш: В.Нямсүрэн
Эрэмбэт дараалал
/Priority Queue/
 Хамгийн өндөр эрэмбэтэй элемэнтийг эхэлж
  гаргах дарааллыг эрэмбэт дараалал гэнэ.
 Өөрөөр хэлбэл эрэмбэт дараалал нь дараах
  үйлдлүүдээр тодорхойлогдоно.
    Элемэнт оруулах
    Хамгийн өндөр эрэмбэтэй элемэнтийг гаргах

 Хэрэв дараалалд ижил эрэмбэтэй элемэнтүүд
  байвал тэдгээрийн эхэлж орсон нь эхэлж гарах
  зарчмаар ажиллана


Багш: В.Нямсүрэн
Эрэмбэт дарааллын амьдралын жишээ:




Багш: В.Нямсүрэн
Эрэмбэт дараалал
 Эрэмбэт     дараалллыг    дараах    аргуудаар
  хэрэгжүүлж болно.
1. Эрэмбэт дарааллын элемэнтүүдийг орсон
   дарааллаар хадгалан, харин дарааллын
   хамгийн их буюу өндөр эрэмбэтэй элемэнтийг
   хайж олон, түүнийг дарааллаас гаргана
2. Дараалалд элемэнт оруулахдаа дарааллын
   төгсгөлөөс      элемэнтүүдийн      эрэмбэтэй
   харьцуулан зохих байрлалд оруулна. Тиймээс
   дарааллын элемэтүүд нь эрэмбэлэгдсэн байх
   байх ба хамгийн өндөр эрэмбэтэй элемэнт нь
   ямагт дарааллын эхэнд байрлах ба элемэнтийг
   гаргахдаа шууд дарааллын эхнээс гаргана.
Багш: В.Нямсүрэн
Эрэмбэт дараалалын
зангилааг илэрхийлэх
class PQNode{
    int element;
    PQNode*link;
    PQNode(int evalue, QNode*lvalue=NULL)
    {
         element=evalue;
         link=lvalue;
    }
    friend class PriorityQueue;
};



Багш: В.Нямсүрэн
Эрэмбэт дарааллыг
зохион байгуулах

 Дараалалд дараах гадаад заагчуудыг тодорхойлж,
  ашиглах шаардлагатай
   1. Эхлэлийн заагч.
   2. Төгсгөлийн заагч.




Багш: В.Нямсүрэн
Эрэмбэт дараалалд
хийгдэх үйлдлүүд
Эрэмбэт дараалад элемэнт нэмэх– Insert()
Эрэмбэт дарааллаас өндөр эрэмбэтэй/хамгийн
их/ элемэнтийг олох– Maximum()
Эрэмбэт дарааллаас өндөр эрэмбэтэй/хамгийн
бага/ элемэнтийг олох– Minimum()
Эрэмбэт дарааллаас өндөр эрэмбэтэй элемэнтийг
устгах– Delete()
Эрэмбэт дарааллаас элемэнт хайх – Search()
Эрэмбэт дараалал хоосон эсэхийг шалгах–
IsEmpty()
Эрэмбэт дарааллын элемэнтүүдийг хэвлэх–
SizeOfStack()
Багш: В.Нямсүрэн
Эрэмбэт дарааллыг нэг холбоост
жагсаалт ашиглан зохион байгуулах
class PriorityQueue{
         PQNode *front;
         PQNode *rear;
public:
         PriorityQueue();
         ~PriorityQueue();
         int Maximum();
         int Minimum();
         void Insert(int);
         bool Delete(int);
         void Display();
         int Search (int);
         bool IsEmpty();
};
Багш: В.Нямсүрэн
ЭД-ыг үүсгэх
байгуулагч функц
PriorityQueue::PriorityQueue()
{
    front=rear=NULL;
}


Тайлбар:
PriorityQueue PQ;
// PQ нэртэй эрэмбэт дараалал үүсгэж байна.
                 front rear



Багш: В.Нямсүрэн
ЭД-ыг санах ойгоос
чөлөөлөх устгагч функц
PriorityQueue::~PriorityQueue()
{
     while (front != NULL)
     {
         PQNode* curr = front;
         front = front->link;
         delete curr;
     }
     rear = NULL;
}



Багш: В.Нямсүрэн
ЭД-ыг санах ойгоос
чөлөөлөх устгагч функц

     currfront               rear


            100    56   34   456




Багш: В.Нямсүрэн
ЭД-ыг санах ойгоос
чөлөөлөх устгагч функц

                   currfront        rear


                      56       34   456




Багш: В.Нямсүрэн
ЭД-ыг санах ойгоос
чөлөөлөх устгагч функц

                            rear
                         currfront


                            456




Багш: В.Нямсүрэн
ЭД-ыг санах ойгоос
чөлөөлөх устгагч функц

                            rearfront
                         curr




Багш: В.Нямсүрэн
ЭД-д элемэнт
нэмэх функц
void PriorityQueue::Insert(int InsertItem)
{
  PQNode*curr=new PQNode(InsertItem,NULL);
  if(IsEmpty())
     front=curr;
  else
     rear->link=curr;
  rear=curr;
}




Багш: В.Нямсүрэн
ЭД-д элемэнт нэмэх
                   front rear          curr


                                       100



      front                     rear          curr


         100           56       456           34


Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн их/
элемэнтийг олох функц:
int PriorityQueue::Maximum(){
   int Temp;
   PQNode*curr=front;
   Temp=curr->element;
   while(curr->link!=NULL) {
      if(curr->element>Temp)
         Temp=curr->element;
      curr=curr->link;
   }
   if(curr->link==NULL && curr->element>Temp)
      Temp=curr->element;
   return Temp;
}

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн их/
элемэнтийг олох функц:

       front curr                  rear


              100   56       456      34




                     Temp
                      1000

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн их/
элемэнтийг олох функц:


       front curr                  rear


              100   56       456      34




                     Temp
                      1000

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн их/
элемэнтийг олох функц:


       front        curr           rear


              100   56       456      34




                     Temp
                     45600
                      100

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн их/
элемэнтийг олох функц:


       front                     rear
                              curr


              100   56       456    34




                     Temp
                     45600
                      100

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн
 бага/ элемэнтийг олох функц:
int PriorityQueue::Minimum(){
   int Temp;
   PQNode*curr=front;
   Temp=curr->element;
   while(curr->link!=NULL){
       if(curr->element<Temp)
          Temp=curr->element;
       curr=curr->link;
   }
   if(curr->link==NULL && curr->element<Temp)
       Temp=curr->element;
   return Temp;
}

 Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн
бага/ элемэнтийг олох

       front curr                  rear


              100   56       456      34




                     Temp
                      1000

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн
бага/ элемэнтийг олох


       front curr                   rear


              100   56        456      34




                     Temp
                      560 0
                      100

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн
бага/ элемэнтийг олох


       front        curr          rear


              100   56      456      34




                     Temp
                      560

Багш: В.Нямсүрэн
ЭД-аас өндөр эрэмбэтэй/хамгийн
бага/ элемэнтийг олох


       front                    rear
                             curr


              100   56      456    34




                     Temp
                      340
                      56

Багш: В.Нямсүрэн
ЭД-аас элемэнт устгах функц:
bool PriorityQueue::Delete(int DeleteItem){
    if(IsEmpty()){
       cout<<"Queue is Empty"<<endl;
       return false;
    }
    else{
       PQNode* curr = front;
       PQNode* prevCurr = NULL;
       while (curr!=NULL &&
           curr->element!= DeleteItem){
         prevCurr = curr;
         curr = curr->link;
       }
 Багш: В.Нямсүрэн
ЭД-аас элемэнт устгах функц:
               if (curr == NULL)
                 cout<<"item not found";
               if (curr == front)
                 front = curr->link;
               else
                 prevCurr->link = curr->link;
               if (curr == rear)
                 rear = prevCurr;
               delete curr;
               return true;
      }
}

    Багш: В.Нямсүрэн

Dsi lec13

  • 1.
    Дарааллыг нэг холбоост жагсаалташиглан нэвтрүүлэх Лекц № 13 LOGO
  • 2.
  • 3.
    Дарааллыг динамикаар тодорхойлох шаардлага Дарааллыг массив ашиглан нэвтрүүлэх үед массивын хэмжээгээр дараалалд хадгалагдах элемэнтийн тоо хязгаарлагдаж байсан.  Мөн дарааллын дүүрсэн болон хоосон байх төлвийг тодорхойлоход нилээд төвөгтэй байсан. Багш: В.Нямсүрэн
  • 4.
    Дарааллыг динамикаар тодорхойлох шаардлага Тэгвэл дарааллыг нэвтрүүлэх бас нэг арга нь нэг холбоост жагсаалт ашиглах явдал юм.  Дарааллын зарчим ѐсоор дарааллын эхлэл, төгсгөлийн хоѐр элемэнтээс бусад элемэнтэд хандах шаардлагагүй байдаг.  Тиймээс нэг холбоост жагсаалтын эхлэл төгсгөлийн элемэнтийг заах заагчийн тусламжтайгаар дараалалд хийх үйлдлүүдийг гүйцэтгэх боломжтой. Багш: В.Нямсүрэн
  • 5.
    Дарааллыг нэг холбоост жагсаалтаарилэрхийлэх  Дарааллыг нэг холбоост жагсаалтаар илэрхийлж байгаа тул  Элемэнт буюу зангилаа нь өгөгдөл ба холбоос гэсэн хоѐр хэсгээс тогтоно.  Хийгдэх үйлдлүүд нь дараалалд зөвшөөрөгдсөн үйлдлүүд байна. Харин дарааллыг динамикаар тодорхойлж байгаа тул дүүрсэн эсэхийг шалгах үйлдэл тодорхойлохгүй. Багш: В.Нямсүрэн
  • 6.
    Давхар төгсгөлт дараалал /DoubleEnded Queue/  Элемэнт нэмэх ба устгах үйлдлийг аль ч төгсгөлд нь гүйцэтгэж болох дарааллыг давхар төгсгөлт дараалал гэнэ.  Давхар төгсгөлт дараалал нь нэг талаас эсрэг чиглэлтэй хоѐр дарааллын нэгдэл, нөгөө талаас хоѐр стекийн нэгдэл юм.  Давхар төгсгөлт дарааллыг хоѐр холбоост жагсаалт ашиглан нэвтрүүлэх нь зохимжтой. Багш: В.Нямсүрэн
  • 7.
    Давхар төгсгөлт дараалал Давхар төгсгөлт дарааллын тухайн нэг төгсгөлд орсон элемэнт тэр төгсгөлөөрөө гарвал стекийн зарчмаар, харин нөгөө төгсгөлөөрөө гарвал дарааллын зарчмаар ажиллах болно Багш: В.Нямсүрэн
  • 8.
    Давхар төгсгөлт дараалал Мөн элемэнт нэмэх үйлдлийг нэг төгсгөлд, элемэнт устгах үйлдлийг хоѐр төгсгөлд нь хийх боломжтой давхар төгсгөлт дарааллыг оролт нь хязгаарлагдмал давхар төгсгөлт дараалал гэнэ.  Харин элемэнт нэмэх үйлдлийг хоѐр төгсгөлд, элемэнт устгах үйлдлийг нэг төгсгөлд нь хийх боломжтой давхар төгсгөлт дарааллыг гаралт нь хязгаарлагдмал давхар төгсгөлт дараалал гэнэ. Багш: В.Нямсүрэн
  • 9.
    Эрэмбэт дараалал /Priority Queue/ Хамгийн өндөр эрэмбэтэй элемэнтийг эхэлж гаргах дарааллыг эрэмбэт дараалал гэнэ.  Өөрөөр хэлбэл эрэмбэт дараалал нь дараах үйлдлүүдээр тодорхойлогдоно.  Элемэнт оруулах  Хамгийн өндөр эрэмбэтэй элемэнтийг гаргах  Хэрэв дараалалд ижил эрэмбэтэй элемэнтүүд байвал тэдгээрийн эхэлж орсон нь эхэлж гарах зарчмаар ажиллана Багш: В.Нямсүрэн
  • 10.
    Эрэмбэт дарааллын амьдралынжишээ: Багш: В.Нямсүрэн
  • 11.
    Эрэмбэт дараалал  Эрэмбэт дараалллыг дараах аргуудаар хэрэгжүүлж болно. 1. Эрэмбэт дарааллын элемэнтүүдийг орсон дарааллаар хадгалан, харин дарааллын хамгийн их буюу өндөр эрэмбэтэй элемэнтийг хайж олон, түүнийг дарааллаас гаргана 2. Дараалалд элемэнт оруулахдаа дарааллын төгсгөлөөс элемэнтүүдийн эрэмбэтэй харьцуулан зохих байрлалд оруулна. Тиймээс дарааллын элемэтүүд нь эрэмбэлэгдсэн байх байх ба хамгийн өндөр эрэмбэтэй элемэнт нь ямагт дарааллын эхэнд байрлах ба элемэнтийг гаргахдаа шууд дарааллын эхнээс гаргана. Багш: В.Нямсүрэн
  • 12.
    Эрэмбэт дараалалын зангилааг илэрхийлэх classPQNode{ int element; PQNode*link; PQNode(int evalue, QNode*lvalue=NULL) { element=evalue; link=lvalue; } friend class PriorityQueue; }; Багш: В.Нямсүрэн
  • 13.
    Эрэмбэт дарааллыг зохион байгуулах Дараалалд дараах гадаад заагчуудыг тодорхойлж, ашиглах шаардлагатай 1. Эхлэлийн заагч. 2. Төгсгөлийн заагч. Багш: В.Нямсүрэн
  • 14.
    Эрэмбэт дараалалд хийгдэх үйлдлүүд Эрэмбэтдараалад элемэнт нэмэх– Insert() Эрэмбэт дарааллаас өндөр эрэмбэтэй/хамгийн их/ элемэнтийг олох– Maximum() Эрэмбэт дарааллаас өндөр эрэмбэтэй/хамгийн бага/ элемэнтийг олох– Minimum() Эрэмбэт дарааллаас өндөр эрэмбэтэй элемэнтийг устгах– Delete() Эрэмбэт дарааллаас элемэнт хайх – Search() Эрэмбэт дараалал хоосон эсэхийг шалгах– IsEmpty() Эрэмбэт дарааллын элемэнтүүдийг хэвлэх– SizeOfStack() Багш: В.Нямсүрэн
  • 15.
    Эрэмбэт дарааллыг нэгхолбоост жагсаалт ашиглан зохион байгуулах class PriorityQueue{ PQNode *front; PQNode *rear; public: PriorityQueue(); ~PriorityQueue(); int Maximum(); int Minimum(); void Insert(int); bool Delete(int); void Display(); int Search (int); bool IsEmpty(); }; Багш: В.Нямсүрэн
  • 16.
    ЭД-ыг үүсгэх байгуулагч функц PriorityQueue::PriorityQueue() { front=rear=NULL; } Тайлбар: PriorityQueue PQ; // PQ нэртэй эрэмбэт дараалал үүсгэж байна. front rear Багш: В.Нямсүрэн
  • 17.
    ЭД-ыг санах ойгоос чөлөөлөхустгагч функц PriorityQueue::~PriorityQueue() { while (front != NULL) { PQNode* curr = front; front = front->link; delete curr; } rear = NULL; } Багш: В.Нямсүрэн
  • 18.
    ЭД-ыг санах ойгоос чөлөөлөхустгагч функц currfront rear 100 56 34 456 Багш: В.Нямсүрэн
  • 19.
    ЭД-ыг санах ойгоос чөлөөлөхустгагч функц currfront rear 56 34 456 Багш: В.Нямсүрэн
  • 20.
    ЭД-ыг санах ойгоос чөлөөлөхустгагч функц rear currfront 456 Багш: В.Нямсүрэн
  • 21.
    ЭД-ыг санах ойгоос чөлөөлөхустгагч функц rearfront curr Багш: В.Нямсүрэн
  • 22.
    ЭД-д элемэнт нэмэх функц voidPriorityQueue::Insert(int InsertItem) { PQNode*curr=new PQNode(InsertItem,NULL); if(IsEmpty()) front=curr; else rear->link=curr; rear=curr; } Багш: В.Нямсүрэн
  • 23.
    ЭД-д элемэнт нэмэх front rear curr 100 front rear curr 100 56 456 34 Багш: В.Нямсүрэн
  • 24.
    ЭД-аас өндөр эрэмбэтэй/хамгийних/ элемэнтийг олох функц: int PriorityQueue::Maximum(){ int Temp; PQNode*curr=front; Temp=curr->element; while(curr->link!=NULL) { if(curr->element>Temp) Temp=curr->element; curr=curr->link; } if(curr->link==NULL && curr->element>Temp) Temp=curr->element; return Temp; } Багш: В.Нямсүрэн
  • 25.
    ЭД-аас өндөр эрэмбэтэй/хамгийних/ элемэнтийг олох функц: front curr rear 100 56 456 34 Temp 1000 Багш: В.Нямсүрэн
  • 26.
    ЭД-аас өндөр эрэмбэтэй/хамгийних/ элемэнтийг олох функц: front curr rear 100 56 456 34 Temp 1000 Багш: В.Нямсүрэн
  • 27.
    ЭД-аас өндөр эрэмбэтэй/хамгийних/ элемэнтийг олох функц: front curr rear 100 56 456 34 Temp 45600 100 Багш: В.Нямсүрэн
  • 28.
    ЭД-аас өндөр эрэмбэтэй/хамгийних/ элемэнтийг олох функц: front rear curr 100 56 456 34 Temp 45600 100 Багш: В.Нямсүрэн
  • 29.
    ЭД-аас өндөр эрэмбэтэй/хамгийн бага/ элемэнтийг олох функц: int PriorityQueue::Minimum(){ int Temp; PQNode*curr=front; Temp=curr->element; while(curr->link!=NULL){ if(curr->element<Temp) Temp=curr->element; curr=curr->link; } if(curr->link==NULL && curr->element<Temp) Temp=curr->element; return Temp; } Багш: В.Нямсүрэн
  • 30.
    ЭД-аас өндөр эрэмбэтэй/хамгийн бага/элемэнтийг олох front curr rear 100 56 456 34 Temp 1000 Багш: В.Нямсүрэн
  • 31.
    ЭД-аас өндөр эрэмбэтэй/хамгийн бага/элемэнтийг олох front curr rear 100 56 456 34 Temp 560 0 100 Багш: В.Нямсүрэн
  • 32.
    ЭД-аас өндөр эрэмбэтэй/хамгийн бага/элемэнтийг олох front curr rear 100 56 456 34 Temp 560 Багш: В.Нямсүрэн
  • 33.
    ЭД-аас өндөр эрэмбэтэй/хамгийн бага/элемэнтийг олох front rear curr 100 56 456 34 Temp 340 56 Багш: В.Нямсүрэн
  • 34.
    ЭД-аас элемэнт устгахфункц: bool PriorityQueue::Delete(int DeleteItem){ if(IsEmpty()){ cout<<"Queue is Empty"<<endl; return false; } else{ PQNode* curr = front; PQNode* prevCurr = NULL; while (curr!=NULL && curr->element!= DeleteItem){ prevCurr = curr; curr = curr->link; } Багш: В.Нямсүрэн
  • 35.
    ЭД-аас элемэнт устгахфункц: if (curr == NULL) cout<<"item not found"; if (curr == front) front = curr->link; else prevCurr->link = curr->link; if (curr == rear) rear = prevCurr; delete curr; return true; } } Багш: В.Нямсүрэн