Pages

Tampilkan postingan dengan label Algoritma dan pemrograman 2. Tampilkan semua postingan
Tampilkan postingan dengan label Algoritma dan pemrograman 2. Tampilkan semua postingan

GRAF DAN POHON

      Dalam pembuatan graf atau pohon dapat menggunakan algoritma dijkstra atau kruskal. Kedua algoritma ini dapat digunakan untuk pembuatan graf pada kasus yang ada di lingkungan sekitar, biasanya algoritma ini digunakan untuk mengukur jarak antar tempat yang menghasilkan suatu graf atau pun pohon.
      Algoritma dijkstra (pencarian jalur terpendek), merupakan suatu algoritma yang disebut sebagai single-source shortest path yang digunakan dalam menentukan jalur terpendek dari simpul sumber menuju simpul tujuan berdasarkan bobot pada sisi. Bobot pada sisi dapat berupa jarak, waktu, biaya, ataupun bobot yang lainnya. Algoritma dijkstra bekerja dengan cara mengujungi semua simpul-simpul yang terdapat pada graf, dimulai pada simpul sumber. Secara berulang, algoritma ini akan memilih simpul-simpul terdekat dan menghitung total bobot semua sisi yang dilewati untuk mencapai simpul tujuan.
      Algoritma ini bertujuan untuk menemukan jalur terpendek berdasarkan bobot terkecil dari satu titik ke titik lainnya. Misalkan titik mengambarkan gedung dan garis menggambarkan jalan, maka algoritma Dijkstra melakukan penghitungan terhadap semua kemungkinan-kemungkinan adanya bobot terkecil dari setiap titik.
      Sedangkan algoritma kruskal adalah sebuah algoritma dalam teori graf yang mencari sebuah minimum spanning tree untuk sebuah graf berbobot yang terhubung. Ini berarti, jika grafik tidak terhubung, maka harus menemukan hutan rentang minimum atau pohon rentang minimum untuk setiap komponen yang terhubung di dalam graf terhubung. Algoritma Kruskal juga tergolong algoritma Greedy dalam teori graf yang digunakan untuk mencari minimum spanning tree. Algoritma ini pertama kali muncul pada tahun 1956 dalam sebuah tulisan yang ditulis oleh Joseph Kruskal. Algoritma Kruskal adalah contoh dari algoritma rakus . Algoritma ini pertama kali muncul dalam Prosiding American Mathematical Society , hal 1956.
      Dasar pembentukan algoritma Kruskal berasal dari analogi growing forest. Growing forest maksudnya adalah untuk membentuk pohon merentang minimum T dari graf G adalah dengan cara mengambil satu per satu sisi dari graf G dan memasukkannya ke dalam pohon yang telah terbentuk sebelumnya. Seiring dengan berjalannya jalur graf ke setiap sisi, maka forest akan memiliki pohon yang semakin sedikit. Analogi ini disebut dengan growing forest. Algoritma Kruskal akan terus menambahkan sisi-sisi ke dalam hutan yang sesuai, hingga akhirnya tidak ada lagi forest, melainkan hanya sebuah pohon merentang minimum.
      Graph adalah kumpulan dua himpunan, yaitu himpunan titik ( vertex, simpul atau node ) dan kumpulan dari garis ( edge ). Sedangkan pohon merupakan graph tak berarah yang terhubung dan tidak mengandung sirkuit. Sirkuit sendiri ialah simpul awal sama dengan simpul akhir.
- Kelebihan Algoritma Kruskal
      Kelebihan algoritma Kruskal dibanding algoritma prim adalah sebagai berikut :
Sangat cocok diterapkan saat graf memiliki sisi berjumlah sedikit namun memiliki sangat banyak simpul, karena orientasi kerja algoritma ini adalah berdasarkan pada urutan bobot sisi, tidak berdasarkan simpul.

Contoh pemecahan permasalahan

- Pencarian rumah makan dengan algoritma djikstra dan algoritma kruskal.
1. Peta tata letak antar rumah makan.


2. Graf rumah makan


Keterangan :
A : Warung Nasi Goreng Hj. Udin
B : Rumah Makan Padang Lubuak
C : Rumah Makan Masakan Banjar Mama Aswan
D : Rumah Makan Bubur Ayam Pak Suhendar
E : Nasi Kuning Jasmine
F : Warung Makan Nasi Rames Mesra Malang
G : Depot Mega
H : Warung Makan Umi
I : Rumah Makan Padang Telaga
J : Rumah Makan Bulan

3. Tabel matriks dari graf rumah makan


      Kesimpulan dari materi ini adalah algoritma dijkstra (pencarian jalur terpendek), merupakan suatu algoritma yang disebut juga sebagai single-source shortest path yang digunakan dalam menentukan jalur terpendek dari simpul sumber menuju simpul tujuan berdasarkan bobot pada sisi. Algoritma dijkstra bekerja dengan cara mengujungi semua semua simpul-simpul yang terdapat pada graf yang dimulai pada simpul sumber.
      Algoritma kruskal adalah sebuah algoritma dalam teori graf yang mencari sebuah minimum spanning tree untuk sebuah graf berbobot yang terhubung. Dasar pembentukan algoritma Kruskal berasal dari analogi growing forest. Graph adalah kumpulan dua himpunan, yaitu himpunan titik ( vertex/simpul/node ) dan kumpulan dari garis ( edge ). Tree merupakan graph tak berarah yang terhubung dan tidak mengandung sirkuit. Sirkuit sendiri ialah simpul awal = simpul akhir.


























Referensi :
Laporan algoritma dan pemrograman 2 kelompok 4

ALGORITMA DAN PEMROGRAMAN 2 BUBBLE DAN QUICK SORT

Bubble dan quick sort


1. Pengertian sorting

      Sorting atau pengurutan adalah proses menyusun elemen-elemen dari masukan awal acak, menjadi keluaran akhir yang tertata dengan urutan tertentu. Permasalahan pengurutan (sorting problem) secara formal didefinisikan sebagai berikut . Input di sini adalah uatu urutan dari n bilangan. Output di sini adalah suatu permutasi atau penyusunan kembali dari input sedemikian rupa sehingga pada tata urutan ascending (dari nilai kecil ke besar) atau pada tata urutan descending (dari nilai besar ke kecil). Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat mendasar dan sering digunakan.
      Beberapa metode sorting mengurutkan data yang dikenal antara lain adalah :
1. Bubble Sort (sederhana tetapi lambat)
2. Quick Sort (cepat tetapi rumit)
3. Shell Sort (agak cepat dan tidak terlalu rumit)
4. Selection Sort
5. Insert Sort
6. Merge Sort

2. Bubble sort dan quick sort

      Bubble Sort (metode gelembung) adalah metode pengurutan dengan cara melakukan penukaran data dengan tepat disebelahnya secara terus menerus hingga dapat dipastikan dalam suatu kumpulan data, tidak ada lagi perubahan. Jika tidak ada perubahan, berarti data sudah terurut. Disebut pengurutan gelembung karena masing-masing kunci, dengan lambat akan menggelembung ke posisinya yang tepat.
      Bubble sort memiliki algoritma yang beroperasi seperti berikut.
1. elemen pertama dibandingkan dengan elemen kedua. Bila elemen kedua < elemen pertama, kedua elemen tersebut ditukar.
2. Elemen kedua dan ketiga dibandingkan, bila elemen ketiga < elemen kedua, kedua elemen tersebut ditukar.
3. Proses terus berlangsung dengan elemen ketiga dan keempat, dan seterusnya. Sampai akhir deretan jumlah data, tercapai.
4. Bila tak ada lagi yang ditukarkan, algoritma berhenti.
5. Bila terjadi pertukaran selama berurutan, proses akan diulang. Sehingga semua elemen tersusun, dan tidak ada pertukaran lagi, kemudian algoritma berhenti
      Algoritma bubble sort adalah sebagai berikut.
1. Membandingkan data ke-i dengan data ke-(i+1). Jika tidak sesuai, maka tukar data ke-i = data ke-(i+1) dan data ke-(i+1) = data ke-i. Jika kita menginginkan algoritma menghasilkan data dengan urutan ascending (A-Z) kondisi tidak sesuai adalah data ke-i > data ke-i+1, dan sebaliknya untuk urutan descending (A-Z).
2. Membandingkan data ke-(i+1) dengan data ke-(i+2). Kita melakukan pembandingan ini sampai data terakhir. Contoh: 1 dgn 2; 2 dgn 3; 3 dgn 4; 4 dgn 5 … ; n-1 dgn n.
3. Selesai satu iterasi, adalah jika kita sudah selesai membandingkan antara (n-1) dgn n. Setelah selesai satu iterasi kita lanjutkan lagi iterasi berikutnya sesuai dengan aturan ke-1. Mulai dari data ke-1 dgn data ke-2, dan seterusnya.
4. Proses akan berhenti jika tidak ada pertukaran dalam satu iterasi.

      kelebihan dan kelemahan bubble sort.

Kelebihan :
1. Merupakan metode sorting yang paling simple.
2. Metode yang mudah dipahami algoritmanya.

Kelemahan :
1. Metode yang paling tidak efisien.
2. Saat mengurutkan data dengan jumlah yang sangat besar, akan mengalami kelambatan.
3. Kinerja memburuk secara signifikan.
4. Jumlah dari pengulangannya akan tetap sama, walaupun data sudah cukup terurut.

      Hal-hal ini disebabkan, karena setiap data harus dibandingkan dengan setiap data yang lain untuk menentukan posisinya


      Quick Sort, quick sort adalah algoritma pengurutan yang sangat cepat dengan tipe penyelesaian divide and conquer. sehingga cocok untuk mengurutkan data dalam jumlah besar. Ketika proses pengurutan dilakukan secara berulang, maka menghasilkan partisi hanya satu elemen saja dan kemudian digabung kembali sehingga terlihat bahwa data telah berurutan. Strategi divide-and-conqueror digunakan di dalam quicksort.
      Di bawah ini akan dijelaskan langkah-langkahnya :
1. Pilih nilai pivot. Kita ambil nilai di tengah-tengah elemen sebagai sebagai nilai dari
 pivot, tetapi bisa nilai mana saja.
2. Partisi. Atur ulang semua elemen sedemikian rupa, lalu semua elemen yang lebih rendah daripada pivot  dipindahkan ke sebelah kiri dari array/list dan semua elemen yang lebih besar dari pivot dipindahkan ke sebelah kanan dari array/list. Nilai yang sama dengan pivot dapat diletakkan di mana saja dari array.
3. Urutkan semua bagian (kiri dan kanan). Aplikasikan algoritma quick sort secara rekursif pada bagian sebelah kiri dan kanan.
      Disebut Quick Sort, karena Algoritma quick sort mengurutkan dengan sangat cepat. Quick sort disebut juga dengan partition exchange sort, karena konsepnya membuat partisi- partisi, dan sorting dilakukan per partisi.
      Algoritma quick sort mengurutkan dengan sangat cepat, namun algoritma ini sangat komplex dan diproses secara rekursif. Sangat memungkinkan untuk menulis algoritma yang lebih cepat untuk beberapa kasus khusus, namun untuk kasus umum, sampai saat ini tidak ada yang lebih cepat dibandingkan algoritma quick sort.
      Dalam algoritma quick sort, pemilihan pivot adalah hal yang menentukan apakah algoritma berjalan dengan baik atau tidak. Berikut beberapa cara pemilihan pivot :
1. Pivot adalah elemen pertama, elemen terakhir, atau elemen tengah array. Cara ini hanya  bagus jika elemen tabel tersusun secara acak, tetapi tidak bagus jika elemen tabel semula sudah terurut.
2. Pivot dipilih secara acak dari salah satu elemen array. Cara ini baik, tetapi belum tentu maksimal, sebab memerlukan prosedur khusus untuk menentukan pivot secara acak.
3. Pivot adalah elemen median tabel. Cara ini paling bagus, karena hasil partisi menghasilkan dua bagian tabel yang berukuran seimbang. Cara ini memberikan kompleksitas waktu yang minimum. Masalahnya, mencari median dari elemen tabel yang  belum terurut adalah persoalan tersendiri.

Kompleksitas Algoritma Quick Sort
      Kebutuhan waktu dari quicksort bergantung pada pembuatan partisi, seimbang atau tidak, yang bergantung juga pada elemen yang digunakan sebagai pivot. Dalam menghitung kompleksitas ini, perlu dilihat pula perhitungan recurrence, karena terdapat fungsi rekursif untuk penyelesaian masalah-masalah di dalamnya.

Terdapat 3 jenis kompleksitas waktu dari quick sort :
      Kasus terburuk (worst case), yaitu terjadi bila terbentuk partisi dengan komposisi sub-masalah antara n – 1 elemen dan 0 elemen. Dengan demikian pemanggilan fungsi secara rekursif dengan array berukuran 0 akan langsung kembali, T(0) = Θ(1), sehingga berlaku : T(n) = T(n – 1) + cn = O(n2).
      Kasus terbaik (best case), yaitu terjadi bila terbentuk partisi dengan dengan komposisi seimbang, dengan ukuran masing-masing tidak lebih dari n/2. Sehingga didapat: T(n) = 2T(n/2) + cn = na + cn log n = O(n log n).
      Kasus rata-rata (average case), yaitu terjadi dari perimbangan pivot antara terbaik dan terburuk, yang dalam prakteknya lebih mendekati kasus terbaik ketimbang terburuk. Sehingga didapat: Tavg(n) = O(n log n).

Kelebihan dan Kelemahan Algoritma Quick Sort

Beberapa hal yang membuat quick sort unggul :
1. Secara umum memiliki kompleksitas O(n log n).
2. Algoritmanya sederhana dan mudah diterapkan pada berbagai bahasa pemrograman dan arsitektur mesin secara efisien.
3. Dalam prakteknya adalah yang tercepat dari berbagai algoritma pengurutan dengan perbandingan, seperti merge sort dan heap sort.
4. Melakukan proses langsung pada input.
5. Bekerja dengan baik pada berbagai jenis input data seperti angka dan karakter.

Namun terdapat pula kelemahan quick sort :
1. Sedikit kesalahan dalam penulisan program membuatnya bekerja tidak beraturan, hasilnya tidak benar atau tidak pernah selesai.
2. Memiliki ketergantungan terhadap data yang dimasukkan, yang dalam kasus terburuk memiliki kompleksitas O(n2).
3. Secara umum bersifat tidak stabil, yaitu mengubah urutan input dalam hasil akhirnya, dalam hal input yang memiliki nilai sama.
4. Pada penerapan secara rekursif atau memanggil dirinya sendiri, bila terjadi kasus terburuk dapat menghabiskan stack dan memberhentikan program.

3. Algoritma bubble sort dan quick sort

      1. Algoritma bubble sort adalah sebagai berikut.

for(i=0; i<=n-2; i++)
    {
     for (j=n-1; j>=i+1; j--)
     {
         if (data[j]<data[j-1])
         {
             buble=data[j];
             data[j]=data[j-1];
             data[j-1]=buble;
         }
     }
    }
      2. Algoritma quick sort adalah sebagai berikut.

1.      Quick sort, I=left, j=right.
Pivot = data[tengah] = data[left+right/2]

2.      Ketentuan partisi
I < j
Data[i] < pivot = i++
Data[j] < pivot = j—
I ≤= j = data[i] ↔ data[j]
I++, j--

3.      Rekursif
Left < j = quick sort (data, left, j)I < right = quick sort (data, I, right)

4. Contoh program

      1. Berikut contoh program bubble sorting.

#include <iostream>
using namespace std;

int main()
{
    int i,j,n, buble, pilih, data[10],input[10];
    string pil;
    cout<<"      PROGRAM SORTING          "<<endl;
    cout<<"      Pilih Metode :           "<<endl;
    cout<<"      1. Ascending             "<<endl;
    cout<<"      2. Descending            "<<endl;
    cout<<endl;
    cout<<"Masukkan jumlah data yang ingin di simpan : ";cin>>n;
    for(i=0; i<n; i++)
    {
        cout<<"Data ke - "<<i+1<<" : ";cin>>data[i];
    }
    atas:
    cout<<"Masukkan metode yang ingin digunakan : ";cin>>pilih;
    if (pilih==1)
    {
    for(i=0; i<=n-2; i++)
    {
     for (j=n-1; j>=i+1; j--)
     {
         if (data[j]<data[j-1])
         {
             buble=data[j];
             data[j]=data[j-1];
             data[j-1]=buble;
         }
     }
    }
    cout<<"Data telah disorting secara ascending "<<endl;
    for(i=0; i<n; i++)
        {
            cout<<"Data ke - "<<i+1<<" : "<<data[i]<<endl;
        }
    }

    else if (pilih==2)
    {
    for(i=0; i<=n-2; i++)
    {
     for (j=n-1; j>=i+1; j--)
     {
         if (data[j]>data[j-1])
         {
             buble=data[j];
             data[j]=data[j-1];
             data[j-1]=buble;
         }
     }
    }
    cout<<"Data telah disorting secara descending "<<endl;
    for(i=0; i<n; i++)
        {
            cout<<"Data ke - "<<i+1<<" : "<<data[i]<<endl;
        }
    }

        else
        {
            cout<<"Pilihan salah. Apakah anda ingin mengulang [Y/T] : ";cin>>pil;
            cout<<endl;
            if(pil=="y"||pil=="Y")
            {
                goto atas;
            }
            else if(pil=="t"||pil=="T")
            {
                cout<<"Proses selesai"<<endl;
            }
        }
}
      Hasil running dari program di atas adalah sebagai berikut.

a. Hasil running program dengan data ascending


b. Hasil running program dengan data descending


      2. Berikut contoh program quick sorting.

#include <iostream>
#include <conio.h>
using namespace std;
void quick_sort(int arr[], int left, int right)
{
      int i = left, j = right;int tmp;
      int pivot = arr[(left+right)/2];/* partition */
  while (i<j){
   while (arr[i] < pivot)
   i++;
   while (arr[j] > pivot)
   j--;
   if (i<=j){
    tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
    i++;j--;
                                                    };
         }; /* recursion */
      if (left < j)
            quick_sort(arr, left, j);
      if (i < right)
            quick_sort(arr, i, right);
}
int main()
{
int i,n,data[50];
cout<<"Masukan banyak data: ";cin>>n;
for(i=0;i<n;i++)
{cout<<"Masukan data ["<<i<<"] : ";cin>>data[i];}
cout<<"\nData sebelum diurutkan: "<<endl;
for(i=0;i<n;i++)
{
cout<<data[i]<<" ";
}cout<<"\n";
quick_sort(data,0,n-1);//hasil pengurutan
cout<<"\nHasil pengurutan:\n";
{
int i;
for (i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<"\n";
}getch();
}

      Hasil running dari program di atas adalah sebagai berikut.



























Referensi :

https://www.academia.edu/10450333/Laporan_Quick_Sort
http://dtugasalgoritma.blogspot.com/2010/12/quick-sort-algoritma.html
http://onophp.blogspot.com/2018/11/quick-sort-pengertian-agoritma-dan.html
http://www.pintarkoding.com/metode-pemograman-algoritma-quick-sort/
 

Copyright © Yunitaa's Creations. Template created by Volverene from Templates Block
WP by Simply WP | Solitaire Online