• Maksimal element max-heap ildizida saqlanadi
  • Binar kuchaga element joylashtirish
  • Maksimal elementni oʻchirish 53-rasm. Maksimal elementni oʻchirish
  • Uyum xususiyatlarini tiklash
  • Kalit qiymatini oshirish
  • Binar kucha bilan bilan ishlash
  • Mavzu yuzasidan savollar
  • Mustaqil ishlash uchun masalalar: 1. Masalalarda Heap-Sort algoritmini qoʻllang. 2. Binar uyumga element qoʻshish dasturini yozing
  • 12-§. Hisoblash geometriyasi algoritmlari Hisoblash geometriyasi
  • Samarqand davlat universiteti o. R. Yusupov, I. Q. Ximmatov, E. Sh. Eshonqulov




    Download 4,61 Mb.
    Pdf ko'rish
    bet85/111
    Sana18.05.2024
    Hajmi4,61 Mb.
    #241929
    1   ...   81   82   83   84   85   86   87   88   ...   111
    Bog'liq
    ALGORITMLAR VA MA‟LUMOTLAR STRUKTURALARI

    Boʻsh uyum (kucha) hosil qilish 
     
    struct heap *heap_create(int maxsize) 

    struct heap *h; 
    h = malloc(sizeof(*h)); 
    if (h != NULL)

    h->maxsize = maxsize; 
    h->nnodes = 0; 
    /* Heap nodes [0, 1, maxsize] */ 
    h->nodes = malloc(sizeof(*h->nodes) * (maxsize + 1)); 
    if (h->nodes == NULL)


    144 

    free(h); 
    return NULL

    return h; 

    Uyumni oʻchirish 
    void heap_free(struct heap *h) 

    free(h->nodes); 
    free(h); 

    void heap_swap(struct heapnode *a, struct heapnode *b) 

    struct heapnode temp; 
    temp = *a; 
    *a = *b; 
    *b = temp; } 
    16 
    14 10 8 






    51-rasm. Maksimal elementni izlash 
     
    struct heapnode *heap_max(struct heap *h 

    if (h->nnodes == 0) 
    return NULL; 
    return &h->nodes[l]; 

    Maksimal element 
    max-heap ildizida 
    saqlanadi 
    max-heap (10 ta element) 


    145 
    Binar uyum (kucha) ga element qoʻshish.
    Ustuvorligi 15 ga teng 
    boʻlgan elementni joylashtirish 
    52-rasm. Binar uyum (kucha) ga element qoʻshish 
    Binar kuchaga element joylashtirish 
    int heap_insert(struct heap *h, int key, char *value) 

    if (h->nnodes >= h->maxsize) { 
    return -1; 

    h->nnodes++; 
    h->nodes[h->nnodes].key = key; 
    h->nodes[h->nnodes].value = value; 
    for (int i = h->nnodes; i > 1 && 
    h->nodes[i].key > h->nodes[i / 2].key; i = i/2) 

    heap_swap(&h->nodes[i], &h->nodes[i / 2]); 

    return 0; 


    146 

    Maksimal elementni oʻchirish
     
    53-rasm. Maksimal elementni oʻchirish 
    struct heapnode heap_extract_max(struct heap 

    if (h->nnodes == 0) 
    return (struct heapnode){0, NULL}; 
    struct heapnode maxnode = h->nodes[l]; 
    h->nodes[l] = h->nodes[h->nnodes]; 
    h->nnodes--; 
    heap_heapify(h, 1); 
    return maxnode; 

    Uyum xususiyatlarini tiklash 
    void heap_heapify(struct heap *h, int index) 

    for (;;) { 


    147 
    int left = 2 * index; 
    int right = 2 * index + 1; 
    int largest = index; 
    if (left <= h->nnodes && 
    h->nodes[left].key > h->nodes[index].key) 
    { largest = left; } 
    if (right <= h->nnodes && h->nodes[right].key > h->nodes[largest].key) 
    { largest = right; } 
    if (largest == index) 
    break; 
    heap_swap(&h->nodes[index], &h->nodes[largest]); 
    index = largest; 


    Kalit qiymatini oshirish 
    int heap_increase_key(struct heap *h, int index, int key) 

    if (h->nodes[index].key > key) 
    return -l; 
    h->nodes[index].key = key; 
    for ( ; index > 1 && h->nodes[index].key > h->nodes[index / 2].key; index = index 
    / 2) 

    heap_swap(&h->nodes[index], &h->nodes[index / 2]); 

    return index; 
    }
    Binar kucha bilan bilan ishlash 
    int main() 

    struct heap *h; 
    struct heapnode node; 
    h - heap_create(100); 
    heap_insert(h, 
    16, "16"); 
    heap_insert(h, 
    14, "14"); 
    heap_insert(h, 
    10, ―10"); 


    148 
    heap_insert(h, 
    8, "8"); 
    heap_insert(h, 
    7, "7"); 
    heap_insert(h, 
    9, ―9"); 
    heap_insert(h, 
    3, "3"); 
    heap_insert(h, 
    2, "2"); 
    heap_insert(h, 
    A, ―4‖); 
    heap_insert(h, 
    1, "1"); 
    node = heap_extract_max(h); 
    printf(―Item: %d\n", node.key); 
    int i = heap_increase_key(h, 9, 100); 
    heap_free(h); 
    return 0; 
    }
     
    11.2. Uyum (kucha)larni saralash (Heap-Sort) 
    Heapsort
    (Heapsort, "Heap sorting") - n elementlarni saralashda 
    O(nlogn) amallarda eng yomon, o'rtacha va eng yaxshi (ya'ni 
    kafolatlangan) holda ishlaydigan saralash algoritmi. Ishlatiladigan 
    qo'shimcha xotira miqdori massiv kattaligiga bogʻliq emas (ya'ni O (1)). 
    Ushbu 
    saralashni 
    pufaksimon 
    saralashning 
    rivojlantirilgan 
    koʻrinishi deb qarash mumkin. 
    Eng yomon vaqt - 
    Eng yaxshi vaqt - 
    Oʻrtacha vaqt - 
     
     
    Heap-Sort algoritmini realizatsiya qilish (C++) 
    #include  
    #include  
    using namespace std; 
    int main() 

    srand(time(NULL)); 
    int const n = 100; 
    int a[n]; 


    149 
    for ( int i = 0; i < n; ++i ) 

    a[i] = rand()%1000; 
    cout << a[i] << " "; 

    //massivni to'ldirish 
    //-----------Saralash------------// 
    //O'sish bo'yicha saralash. 
    int sh = 0; //смещение 
    bool b = false; 
    for(;;) //Sikl cheksiz davom etadi 

    b = false; 
    for ( int i = 0; i < n; i++ ) 

    if( i * 2 + 2 + sh < n ) 

    if( ( a[i + sh] > /*<*/ a[i * 2 + 1 + sh] ) || ( a[i + sh] > /*<*/ a[i * 2 + 2 + 
    sh] ) ) 

    if ( a[i * 2 + 1 + sh] < a[i * 2 + 2 + sh] ) 

    swap( a[i + sh], a[i * 2 + 1 + sh] ); 
    b = true; 

    else if ( a[i * 2 + 2 + sh] < a[ i * 2 + 1 + sh]) 

    swap( a[ i + sh], a[i * 2 + 2 + sh]); 
    b = true; 


    // oxirgi ikki element uchun qo'shimcha tekshirish 
    // ushbu tekshiruv yordamida siz piramidani saralashingiz mumkin 
    // faqat uchta elementdan iborat 
    if( a[i*2 + 2 + sh] < /*>*/ a[i*2 + 1 + sh] ) 

    swap( a[i*2+1+sh], a[i * 2 +2+ sh] ); 
    b = true; 



    150 

    else if( i * 2 + 1 + sh < n ) 

    if( a[i + sh] > /*<*/ a[ i * 2 + 1 + sh] ) 

    swap( a[i + sh], a[i * 2 + 1 + sh] ); 
    b = true; 



    if (!b) sh++; 
    if ( sh + 2 == n ) break; 
    } //Saralash tugatildi 
    //Natijani chiqarish 
    cout << endl << endl; 
    for ( int i = 0; i < n; ++i ) cout << a[i] << " "; 
    // getch(); 
    return 0; 

    Mavzu yuzasidan savollar: 
    1. Ustivor navbat nima? 
    2. Heap-Sort algoritmi haqida gapiring 
    3. Uyum tushunchasi. 
    4. Binar kucha bilan ishlash? 
    5. Ustivor navbat ma‘lumotlar strukturasi qoʻllaniladigan sohalarga 
    qaysilar kiradi? 
    Mustaqil ishlash uchun masalalar: 
    1. Masalalarda Heap-Sort algoritmini qoʻllang.
    2. Binar uyumga element qoʻshish dasturini yozing 
     
     


    151 
    12-§. Hisoblash geometriyasi algoritmlari
     
    Hisoblash geometriyasi
    - geometrik masalalarni yechish 
    algoritmlari bilan shugʻullanadigan informatika bo'limi. 
    Bu uchburchak, qavariq sirtlarni qurish, bitta obyektning 
    boshqasiga tegishliligini aniqlash, ularning kesishishini topish va 
    boshqalar kabi vazifalar bilan shugʻullanadi, ular geometrik obyektlar 
    bilan ishlaydi: nuqta, segment, ko'pburchak, aylana va hokazolar. 
    Hisoblash geometriyasi kompyuter grafikalarida, muhandislik 
    dizaynida va boshqa koʻplab geometriya sohalarida qo'llaniladi. 

    Download 4,61 Mb.
    1   ...   81   82   83   84   85   86   87   88   ...   111




    Download 4,61 Mb.
    Pdf ko'rish

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Samarqand davlat universiteti o. R. Yusupov, I. Q. Ximmatov, E. Sh. Eshonqulov

    Download 4,61 Mb.
    Pdf ko'rish