Rabu, 15 Mei 2019

Tree dan Graph (Algoritma dan Pemrograman 2)

Pengertian Tree


             Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan hubungan yang bersifat hirarkis (hubungan one to many) antara elemen-elemen. Tree bisa didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus yang disebut Root dan node lainnya. Tree juga adalah suatu graph yang acyclic, simple, connected yang tidak mengandung loop.
Sebuah binary search tree (bst) adalah sebuah pohon biner yang boleh kosong, dan setiap nodenya harus memiliki identifier/value. Value pada semua node subpohon sebelah kiiri adalah selalu lebih kecil dari value dari root, sedangkan value subpohon di sebelah kanan adalah sama atau lebih besar dari value pada root, masing-masing subpohon tersebut (kiri dan kanan) itu sendiri adalah juga binary search tree.
             Struktur data bst sangat penting dalam struktur pencarian, misalkan dalam kasus pencarian dalam sebuah list, jika list sudah dalam keadaan terurut maka proses pencarian akan semakin cepat, jika kita menggunakan  list contigue dan melakukan pencarian biner,akan tetapi  jika kita ingin melakukan perubahan isi list (insert atau delete), menggunakan list contigue akan sangat lambat, karena prose insert dan delete dalam list contigue butuh memindahkan linked-list, yang untuk operasi insert atau delete tinggal mengatur- atur pointer,akan tetapi pada n-linked list, kita tidak bisa melakukan pointer sembarangan setiap saat, kecuali hanya satu kali dengan kata lain hanya secara squential.secara sederhana pohon bisa didefinisikan sebagai kumpulan elemen yangsalah satu elemennya disebut dengan akar (root) dan elemen yang lainnya (simpul),terpecah menjadi sejumlah himpunan yang saling tidak berhubungan satu dengan yang lainnya.
Predecessor : node yang berada di atas node tertentu
Successor    : node yang dibawah node tertentu
Ancestor     : seluruh node yang terletak sebelum node  tertentu dan terletaksesudah pada jalur yang                          sama
Descendant : seluruh node yang terletak sesudah node tertentu dan terletaksesudah pada jalur yang                            sama
Parent         : predecessor satu level diatas suatu node
Child          : successor satu level dibawah suatu node
Sibling       : node-node yang memiliki parent yang sama dengan suatunode
Subtree      : bagian dari tree yang berupa suatu node beserta descendantnya dan memiliki semua                              karakteristik dari tree tersebut
Size            : banyaknya node dalam suatu tree
Height        : banyaknya tingkatan/level dalam suatu tree
Root           : satu-satunya node khusus dalam tree yang tidak mempunyaipredecessor
Leaf           : node-node dalam tree yang tidak memiliki successor
Degree       : banyaknya child yang dimiliki suatu node

Jenis-jenis Tree

         Tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal duasubtree dan kedua subtree tersebut harus terpisah. Maka tiap node dalam binarytree hanya boleh memiliki paling banyak dua child.Keterangan :Left Child : B, D, H, ...Right Child : C, G, J, ...Jenis Binary Tree :1.3.1.1

      Binary Tree yang tiap nodenya (kecuali leaf) memiliki dua child dan tiap sub treeharus mempunyai panjang path yang sama : 1.3.1.2

            Mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki panjang pathyang berbeda. Node kecuali leaf memiliki 0 atau 2 child 1.3.1.3

            Binary Tree yang semua nodenya (kecuali leaf) hanyamemiliki satu child. 1.3.2

          Adalah binary search tree yang memiliki perbedaan tingkat tinggi/level antarasubtree kiri dan subtree kanan maksimal adalah 1. Dengan AVL Tree, waktupencarian dan bentuk tree dapat dipersingkat dan disederhanakan.Selain AVL Tree terdapat juga Height Balanced n tree, yaitu binary search treeyang memiliki perbedaan level antara subtree kiri dan subtree kanan maksimaladalah n. Sehingga AVL Tree adalah Height Balanced 1 Tree.

 Pengertian Graph

          Graf adalah kumpulan noktah (simpul) di dalam bidang dua dimensi yang dihubungkan dengan sekumpulan garis (sisi).Graph dapat digunakan untuk merepresentasikan objek-objek diskrit dan hubungan antara objek-objek tersebut. Representasi visual dari graph adalah dengan menyatakan objek sebagai noktah, bulatan atau titik (Vertex), sedangkan hubungan antara objek dinyatakan dengan garis (Edge). Graf merupakan suatu cabang ilmu yang memiliki banyak terapan. Banyak sekali struktur yang bisa direpresentasikan dengan graf, dan banyak masalah yang bisa diselesaikan dengan bantuan graf. Seringkali graf digunakan untuk merepresentasikan suaru jaringan. Misalkan jaringan jalan raya dimodelkan graf dengan kota sebagai simpul (vertex/node) dan jalan yang menghubungkan setiap kotanya sebagai sisi (edge) yang bobotnya (weight) adalah panjang dari jalan tersebut.
         Ada beberapa cara untuk menyimpan graph di dalam sitem komputer. Struktur data bergantung pada struktur graph dan algoritma yang digunakan untuk memmanipulasi graph. Secara teori salah satu dari keduanya dapat dibedakan antara struktur list dan matriks, tetapi dalam penggunaannya struktur terbaik yang sering digunakan adalah kombinasi keduanya.

 Graph tak berarah (undirected graph atau non-directed graph)
          Urutan simpul dalam sebuah busur tidak dipentingkan. Misal busur e1 dapat disebut busur AB atau   BA
 Graph berarah (directed graph) :
           Urutan simpul mempunyai arti. Misal busur AB adalah e1 sedangkan busur BA adalah e8.
 Graph Berbobot (Weighted Graph)
           Jika setiap busur mempunyai nilai yang menyatakan hubungan antara 2 buah simpul, maka                 busur tersebut dinyatakan memiliki bobot.
           Bobot sebuah busur dapat menyatakan panjang sebuah jalan dari 2 buah titik, jumlah rata-rata             kendaraan perhari yang melalui sebuah jalan, dll. Istilah-istilah dalam graf
           Kemudian terdapat istilah-istilah yang berkaitan dengan graph yaitu:
Vertex
           Adalah himpunan node / titik pada sebuah graph.
 Edge
          Adalah himpunan garis yang menghubungkan tiap node / vertex.
 Adjacent
          Adalah dua buah titik dikatakan berdekatan (adjacent) jika dua buah titik tersebut terhubung                dengan sebuah sisi. AdalahSisi e3 = v2v3 insident dengan titik v2 dan titik v3, tetapi sisie3 =              v2v3 tidak insident dengan titik v1 dan titik v4.
          Titik v1 adjacent dengan titik v2 dan titik v3, tetapi titik v1 tidakadjacent dengan titik v4.

Weight


           Adalah Sebuah graf G = (V, E) disebut sebuah graf berbobot (weight graph), apabila terdapat               sebuah fungsi bobot bernilai real W pada himpunan E,
           W : E ® R,
            nilai W(e) disebut bobot untuk sisi e, " e Î E. Graf berbobot tersebut dinyatakan pula sebagai                G = (V, E, W).
           Graf berbobot G = (V, E, W) dapat menyatakan
           * suatu sistem perhubungan udara, di mana
           · V = himpunan kota-kota
           · E = himpunan penerbangan langsung dari satu kota ke kota lain
           · W = fungsi bernilai real pada E yang menyatakan jarak atau ongkos atau waktu
          * suatu sistem jaringan komputer, di mana
          · V = himpunan komputer
          · E = himpunan jalur komunikasi langsung antar dua komputer
          · W = fungsi bernilai real pada E yang menyatakan jarak atau ongkos atau waktu
 Path
          Adalah Walk dengan setiap vertex berbeda. Contoh, P = D5B4C2ASebuah walk (W)                            didefinisikan sebagai urutan (tdk nol) vertex & edge. Diawali origin vertex dan                                    diakhiri terminusvertex. Dan setiap 2 edge berurutan adalah series. Contoh, W =                                  A1B3C4B1A2.
Cycle
         Adalah Siklus ( Cycle ) atau Sirkuit ( Circuit ) Lintasan yang berawal dan berakhir pada simpul           yang sama

Source code Algoritma Dijkstra

Berikut merupakan source code untuk algoritma Dijkstra, yaitu:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define INF 999

using namespace std;

int main()
{
    int n,i,j,start;
    printf("Masukan Jumlah Vertex : ");
    scanf("%d",&n);
    int G[n][n],tempGraf[n][n],jarak[n],visit[n],temp[n],count;
    printf("Masukan Matrix Graf : \n");
    for(i = 0;i < n ;i++)
    {
        for (j=0;j<n;j++)
        {
            cout<<"Matriks ["<<i<<"]["<<j<<"]: ";
            scanf("%d",&G[i][j]);
        }
    }
    printf("Masukan Vertex Asal : ");
    scanf ("%d",&start);

    for(i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            if (G[i][j] == 0)
            {
                tempGraf[i][j] = INF;
            }
            else{
                tempGraf[i][j] = G[i][j];
            }
        }
    }
    for (i = 0;i<n;i++)
    {
        jarak[i] = tempGraf[start][i];
        temp[i] = start;
        visit[i] = 0;
    }
    jarak[start] = 0;
    visit[start] = 1;

    count =1; //dimulai dari 1 karena kita tidak akan menghitung vertex asal lagi

    //proses untuk menghitung vertex yang dikunjungi
    int jarakmin,nextvertex;
    while (count < n-1)
    {
        jarakmin = INF;
        for (i=0;i<n;i++)
        {
            //jika jarak lebih kecil dari jarak minimum dan vertex belum dikunjungi
            // maka jarak minimum adalah jarak yang sudah dibandingkan sebelumnya dengan jarakmin
                if(jarak[i] < jarakmin && visit[i]!=1)
                {
                    jarakmin = jarak[i];
                    nextvertex = i; //untuk memberikan vertex pada jarak minimum
                }
        }

        // untuk mengecek vertex selanjutnya yang terhubung dengan vertex lain yang memiliki jarak minimum
        visit[nextvertex] = 1;
        for(i = 0;i<n;i++)
        {
            if(visit[i]!=1)
            {
                if(jarakmin+tempGraf[nextvertex][i]<jarak[i])
                {
                    jarak[i] = jarakmin+tempGraf[nextvertex][i];
                    temp[i] = nextvertex;
                }
            }
        }
    count++;
    }
    //nenampilkan jalur dan jarak untuk setiap vertex
    int a[n+1],k;
    for (i = 0; i < n ;i++)
    {
        if(i!=start)
        {
            printf ("\nHasil jarak untuk vertex ke-%d adalah %d\n",i,jarak[i]);

            j=i;
             printf ("%d<-",i);
            while(j!=start)
            {
                j=temp[j];
                printf ("%d",j);
                if(j!=start)
                {
                    printf ("<-");
                }

            }

        }
    }
    printf ("\nTotal Jaraknya adalah %d\n",jarak[n-1]);
    return 0;

}


Source code Algoritma Kruskal

Berikut merupakan source code untuk algoritma Dijkstra, yaitu:

#include <cstdlib>
#include <iostream>
#include <fstream>


using namespace std;

class kruskal
{
    private:
    int n ;//no of nodes
    int noe; //no edges in the graph
    int graph_edge[100][4];

    int tree[10][10];

    int sets[100][10];
    int top[100];

    public:
    int read_graph();
    void initialize_span_t();
    void sort_edges();
    void algorithm();
    int find_node(int );
    void print_min_span_t();
};

int kruskal::read_graph()
{
///cout<<"Program ini Mengimplementasikan Algoritma Kruskal\n";
cout<<"Banyak titik graph : ";
cin>>n;
noe=0;

cout<<"\nJarak antar tiap titik:\n";

for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
        cout<<"("<<i<<" , "<<j<<") = ";
        int w;
        cin>>w;
            if(w!=0)
            {
            noe++;

            graph_edge[noe][1]=i;
            graph_edge[noe][2]=j;
            graph_edge[noe][3]=w;
            }
        }
    }

}

void kruskal::sort_edges()
{
/** Sort the edges using bubble sort in increasing order******/

for(int i=1;i<=noe-1;i++)
{
    for(int j=1;j<=noe-i;j++)
    {
        if(graph_edge[j][3]>graph_edge[j+1][3])
        {
        int t=graph_edge[j][1];
        graph_edge[j][1]=graph_edge[j+1][1];
        graph_edge[j+1][1]=t;

        t=graph_edge[j][2];
        graph_edge[j][2]=graph_edge[j+1][2];
        graph_edge[j+1][2]=t;

        t=graph_edge[j][3];
        graph_edge[j][3]=graph_edge[j+1][3];
        graph_edge[j+1][3]=t;
        }
    }
}

cout<<"\n\nSetelah Jarak diurutkan adalah ::\n";
for(int i=1;i<=noe;i++)
cout<<"("<< graph_edge[i][1]
<<" , "<<graph_edge[i][2]
<<" ) = "<<graph_edge[i][3]<<endl;
}

void kruskal::algorithm()
{

    for(int i=1;i<=n;i++)
    {
    sets[i][1]=i;
    top[i]=1;
    }

cout<<"\nRentang Yang di Pakai\n\n";

    for(int i=1;i<=noe;i++)
    {
    int p1=find_node(graph_edge[i][1]);
    int p2=find_node(graph_edge[i][2]);

        if(p1!=p2)
        {
            cout<<"Rentang yg masuk ke pohon ::"
            <<" < "<<graph_edge[i][1]<<" , "
            <<graph_edge[i][2]<<" > "<<endl<<endl;

            tree[graph_edge[i][1]][graph_edge[i][2]]=graph_edge[i][3];
            tree[graph_edge[i][2]][graph_edge[i][1]]=graph_edge[i][3];

            // Mix the two sets

            for(int j=1;j<=top[p2];j++)
            {
                top[p1]++;
                sets[p1][top[p1]]=sets[p2][j];
            }

            top[p2]=0;
        }
        else
        {
            cout<<"Jika "
            <<" < "<<graph_edge[i][1]<<" , "
            <<graph_edge[i][2]<<" > "<<"di masukkan, maka terbentuk siklus. jadi di hapus\n\n";
        }
    }
}
int kruskal::find_node(int n)
{
    for(int i=1;i<=noe;i++)
    {
        for(int j=1;j<=top[i];j++)
        {
        if(n==sets[i][j])
            return i;
        }
    }

    return -1;
}


int main(int argc, char *argv[])
{
    kruskal obj;
    obj.read_graph();
    obj.sort_edges();
    obj.algorithm();

    system("PAUSE");
    return EXIT_SUCCESS;

}

Maps
Berikut merupakan maps yang diijadikan dasar oleh penyusun untuk dibuat graf pada kasus pendistribusian obat ke apotek-apotek yang ada di Kota Pelaihari, yaitu:


   Graph

  Berikut merupakan graph pada algoritma Dijkstra mengenai kasus pendistribusian obat
  ke apotek-apotek yang ada di Kota Pelaihari, yaitu:

Berikut merupakan graph pada algoritma Kruskal mengenai kasus pendistribusian obat ke
apotek-apotek yang ada di Kota Pelaihari, yaitu:

Matriks 
1.        Matriks pada Algoritma Dijkstra
Berikut merupakan matriks yang terdapat pada algoritma Dijkstra, yaitu:

0
1
2
3
4
5
6
7
8
9
10
11
0
0
255
0
0
0
0
0
0
1600
0
0
0
1
255
0
441
0
0
0
0
0
0
0
0
0
2
0
441
0
2760
0
0
0
0
1800
0
0
26
3
0
0
2760
0
7070
0
0
0
0
0
0
0
4
0
0
0
7070
0
5590
0
0
0
0
0
0
5
0
0
0
0
5590
0
1310
0
0
0
0
0
6
0
0
0
0
0
1310
0
656
0
1690
0
0
7
0
0
0
0
0
0
656
0
435
0
0
0
8
1600
0
1800
0
0
0
0
435
0
0
0
0
9
0
0
0
0
0
0
1690
0
0
0
20
0
10
0
0
0
0
0
0
0
0
0
20
0
30
11
0
0
26
0
0
0
0
0
0
0
30
0

2.        Matriks pada Algortima Kruskal
Berikut merupakan matriks yang terdapat pada algoritma Kruskal, yaitu:

1
2
3
4
5
6
7
8
9
10
11
12
1
0
255
0
0
0
0
0
0
1600
0
0
0
2
255
0
441
0
0
0
0
0
0
0
0
0
3
0
441
0
2760
0
0
0
0
1800
0
0
26
4
0
0
2760
0
7070
0
0
0
0
0
0
0
5
0
0
0
7070
0
5590
0
0
0
0
0
0
6
0
0
0
0
5590
0
1310
0
0
0
0
0
7
0
0
0
0
0
1310
0
656
0
1690
0
0
8
0
0
0
0
0
0
656
0
435
0
0
0
9
1600
0
1800
0
0
0
0
435
0
0
0
0
10
0
0
0
0
0
0
1690
0
0
0
20
0
11
0
0
0
0
0
0
0
0
0
20
0
30
12
0
0
26
0
0
0
0
0
0
0
30
0

             Running
1.        Hasil running pada Algoritma Dijkstra
Berikut merupakan hasil running yang terdapat pada algoritma Dijkstra, yaitu:

2.        Hasil running pada Algoritma Kruskal
Berikut merupakan hasil running yang terdapat pada algoritma Kruskal, yaitu:




Kesimpulan 

Algoritma Kruskal adalah algoritma untuk mencari pohon merentang minimum secara langsung didasarkan pada algoritma MST (Minimum spanning tree) umum. Pada algoritma Kruskal sisi-sisi di dalam graf diurut terlebih dahulu berdasarkan bobotnya dari kecil ke besar. Sisi yang dimasukkan ke dalam himpunan T adalah sisi graf G sedemikian sehingga T adalah pohon. Pada keadaan awal, sisi-sisi sudah diurut berdasarkan bobot membentuk hutan (forest). Hutan tersebut dinamakan hutan merentang (spanning forest). Sisi dari graf G ditambahkan ke T jika tidak membentuk sirkuit di T.
Algoritma Dijkstra, (penemunya adalah seorang ilmuwan komputer, Edsger Dijkstra), adalah sebuah algoritma yang dipakai dalam memecahkan permasalahan jarak terpendek untuk sebuah graph berarah dengan bobot-bobot sisi yang bernilai positif.
Berdasarkan penelitian yang telah dilakukan, dapat disimpulkan bahwa
program algoritma djikstra maupun algoritma kruskal sangat membantu didalam menemukan data berupa jarak yang terdekat sehingga dapat menambah efisiensi waktu dalam pencarian tempat yang terdekat yang akan dituju. Dari kedua program ini, algoritma kruskal lebih unggul daripada algoritma djikstra, karena didalam algoritma kruskal tidak terjadi penginputan yang berulang (prinsipnya misalkan 1,2 = 2,1), sedangkan program algoritma djikstra selalu melakukan penginputan yang berulang (prinsipnya misalkan 1,2 ≠ 2,1). Dengan adanya prinsip seperti ini, tentu sangat mempengaruhi dalam waktu untuk pencarian data berupa jarak yang terdekat

 





Sumber



Fajri, D. (n.d.). TREE. https://www.academia.edu/32724486/LAPORAN_PRAKTIKUM_6_ALGORITMA_STRUKTUR_DATA-TREE.
Ilmu, B. (2015). ALGORITMA TREE (POHON). http://algoritmatree140403020020.blogspot.com/2015/01/algoritma-tree-pohon-minggu-04-januari.html.
Kirana, A. P. (n.d.). GRAPH. https://www.academia.edu/25537594/GRAPH_Matakuliah_Algoritma_dan_Struktur_Data.
Ruri. (2013). graph dan tree. http://informatikaipbruri.blogspot.com/2013/01/graph-dan-tree.html.
Siswantara, H. (2013). ALGORITMA DAN STRUKTUR DATA “TREE”. https://sumbersinau.wordpress.com/2013/04/30/algoritma-dan-struktur-data-tree/.





Rabu, 24 April 2019

SEARCHING



Searching

Pengertian Searching


Pencarian (searching) merupakan proses yang sering digunakan  dalam pengelolaan data. Proses pencarian adalah menemukan nilai (data) tertentu di dalam sekumpulan data yang bertipe sama (baik bertipe dasar atau bertipe bentukan). Search algoritma adalah algoritma yang menerima argument A dan mencoba untuk mencari record yang mana keynya adalah A.
Algoritma bisa mengembalikan nilai record, atau pointer ke record. Record sendiri adalah tipe data yang terdiri atas kumpulan variabel disebut field. Sequential search (penelusuran sequensial) yaitu proses mengunjungi melalui suatu pohon dengan cara setiap simpul di kunjungi hanya satu kali yang disebut dengan tree transversal / kunjungan pohon.
Data dapat disimpan secara temporer dalam memori utama atau disimpan secara permanen di dalam memori sekunder (tape atau disk). Di dalam memori utama, struktur penyimpanan data yang umum adalah berupa larik atau tabel (array), sedangkan di dalam memori sekunder berupa arsip (file).
Aktivitas yang berkaitan dengan pengolahan data ini sering di dahului dengan proses pencarian. Sebagai contoh, untuk mengubah (update) data tertentu, langkah pertama yang harus dilakukan adalah mencari keberadaan data tersebut di dalam kumpulannya. Aktivitas yang awal sama juga dilakukan pada proses penambahan (insert) data yang baru. Proses penambahan data dimulai dengan mencari apakah data yang ditambahkan sudah terdapat di dalam kumpulan. Jika sudah dan mengasumsikan tidak boleh ada duplikasi data,maka data tersebut tidak perlu di tambahkan, tetapi jika belum ada, maka tambahkan.
Algoritma pencarian yang akan dibicarakan 2 cara yaitu
1.     Pencarian Berurutan (Sequential Searching).
2.     Pencarian Biner (Binary Seacrh).

1.   Sequential Shearching
Adalah suatu teknik pencarian data dalam array (1 dimensi) yang akan menelusuri semua elemen-elemen array dari awal sampai akhir, dimana data-data tidak perlu diurutkan terlebih dahulu. Pencarian berurutan menggunakan prinsip sebagai berikut : data yang ada dibandingkan satu per satu secara berurutan dengan yang dicari sampai data tersebut ditemukan atau tidak ditemukan. Algoritma pencarian secara linear digunakan untuk mencari sebuah nilai pada tabel sembarang. Ada dua macam cara pencarian pada tabel. Algoritma ini mempunyai dua jenis metode yaitu dengan boolean dan tanpa boolean. Algoritma pencairan secara linear melakukan pengulangan sebanyak 1 kali untuk kasus terbaik (value sama dengan elemen pertama dalam tabel) dan Nmax kali untuk kasus terburuk. Sehingga algoritma ini mempunyai kompleksitas algoritma O(n).
Proses pencarian data dengan metode ini cukup sederhana dan mudah dipahami. Dalam pencarian ini proses dilakukan dengan cara mencocokan data yang akan dicari dengan semua data yang ada dalam kelompok data. Proses pencarian data dilakukan dengan cara mencocokan data yang akan dicari dengan semua data yang ada dalam kelompok data. Proses pencocokan data dilakukan secara berurut satu demi satu dimulai dari data ke-1 hingga data pada ururtan terakhir. Jika data yang dicari mempunyai harga yang sama dengan data yang ada dalam kelompok data, berarti data telah ditemukan. Tetapi jika data yang dicari tidak ada yang cocok dengan data-data dalam sekelompok data, berarti data tersebut tidak ada dalam sekelompok data.Selanjutnya kita tinggal menampilkan hasil yang diperoleh tersebut.

Ilustrasi Metode Linier Search :

Misalnya terdapat array satu dimensi sebagai berikut:
    0              1            2             3            4              5              6              7            index
8
10
12
6
7
1
50
100
 Value
 
              Kemudian program akan meminta data yang akan dicari, misalnya 6 (x = 6).
Iterasi :
            6 = 8 (tidak!)
            6 = 10 (tidak!)
            6 = 6 (Ya!) => output : “Ada” pada index ke-3
Jika sampai data terakhir tidak ditemukan data yang sama maka output : “ data yang dicari tidak ada”.

Contoh Program :


2. Pencarian Biner (Binary Seacrh).
Binary search adalah algoritma pencarian untuk data yang terurut. Pencarian dilakukan dengan cara menebak apakah data yang dicari berada ditengah-tengah data, kemudian membandingkan data yang dicari dengan data yang ada ditengah. Bila data yang ditengah sama dengan data yang dicari, berarti data ditemukan. Namun, bila data yang ditengah lebih besar dari data yang dicari, maka dapat dipastikan bahwa data yang dicari kemungkinan berada disebelah kiri dari data tengah dan data disebelah kanan data tengah dapat diabai.Upper bound dari bagian data kiri yang baru adalah indeks dari data tengah itu sendiri.Sebaliknya, bila data yang ditengah lebih kecil dari data yang dicari, maka dapat dipastikan bahwa data yang dicari kemungkinan besar berada disebelah kanan dari data tengah. Lower bound dari data disebelah kanan dari data tengah adalah indeks dari data tengah itu sendiri ditambah 1. Demikian seterusnya.
Sebuah algoritma pencarian biner (atau pemilahan biner) adalah sebuah teknik untuk menemukan nilai tertentu dalam sebuah larik (array) linear, dengan menghilangkan setengah data pada setiap langkah, dipakai secara luas tetapi tidak secara ekslusif dalam ilmu komputer.
Sebuah pencarian biner mencari nilai tengah (median), melakukan sebuah pembandingan untuk menentukan apakah nilai yang dicari ada sebelum atau sesudahnya, kemudian mencari setengah sisanya dengan cara yang sama. Pada intinya, algoritma ini menggunakan prinsip divide and conquer, dimana sebuah masalah atau tujuan diselesaikan dengan cara mempartisi masalah menjadi bagian yang lebih kecil. Algoritma ini membagi sebuah tabel menjadi dua dan memproses satu bagian dari tabel itu saja.Algoritma ini bekerja dengan cara memilih record dengan indeks tengah dari tabel dan membandingkannya dengan record yang hendak dicari. Jika record tersebut lebih rendah atau lebih tinggi, maka tabel tersebut dibagi dua dan bagian tabel yang bersesuaian akan diproses kembali secara rekursif.
Penerapan terbanyak dari pencarian biner adalah untuk mencari sebuah nilai tertentu dalam sebuah list terurut.Jika dibayangkan, pencarian biner dapat dilihat sebagai sebuah permainan tebak-tebakan, kita menebak sebuah bilangan, atau nomor tempat, dari daftar (list) nilai.
Pencarian diawali dengan memeriksa nilai yang ada pada posisi tengah list; oleh karena nilai-nilainya terurut, kita mengetahui apakah nilai terletak sebelum atau sesudah nilai yang di tengah tersebut, dan pencarian selanjutnya dilakukan terhadap setengah bagian dengan cara yang sama.

Metoda Pencarian Biner ( Binary Search) hanya bisa diterapkan jika data array sudah terurut.Pengurutan Array bisa menggunakan jenis sorting descending atau asscending.


Keunggulan
Keunggulan utama dari algoritma binary search adalah kompleksitas algoritmanya yang lebih kecil daripada kompleksitas algoritma sequential search. Hal ini menyebabkan waktu yang dibutuhkan algoritma binary search dalam mencari sebuah record dalam sebuah table, lebih kecil daripada waktu yang dibutuhkan algoritma sequential search.
Kelemahan
Data harus disorting dahulu dan algoritma lebih rumit, tidak baik untuk data berantai.algoritma ini hanya bisa digunakan pada tabel yang elemennya sudah terurut baik menaik maupun menurun.
Fungsi
Pencarian Biner (Binary Search) dilakukan untuk :
Memperkecil jumlah operasi pembandingan yang harus dilakukan antara data yang dicari dengan data yang ada di dalam tabel, khususnya untuk jumlah data yang sangat besar ukurannya.
Prinsip dasarnya adalah melakukan proses pembagian ruang pencarian secara berulang-ulang sampai data ditemukan atau sampai ruang pencarian tidak dapat dibagi lagi (berarti ada kemungkinan data tidak ditemukan).
Syarat utama untuk pencarian biner adalah data di dalam tabel harus sudah terurut, misalkan terurut menaik.
Prinsip dari pencarian biner dapat dijelaskan sebagai berikut :
¤  Data diambil dari posisi 1 sampai posisi akhir N
¤  Kemudian cari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2
¤  Kemudian data yang dicari dibandingkan dengan data yang di tengah, apakah sama atau lebih kecil, atau lebih besar
¤  Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah posisi tengah + 1
¤  Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah posisi tengah – 1
¤  Jika data sama, berarti ketemu.

Contoh Program : 




Minggu, 14 April 2019

Nur Anita Humaida (1801301052)

Bubble Sort, Quick Sort, Merge sort.

- Bubble Sort

Bubble sort / pengurutan gelembung ini merupakan suatu metode pengurutan gelembung yang diinspirasi oleh gelembung sabun yang ada di dalam permukaan air, karena berat jenis gelembung sabun lebih ringan daripada berat jenis air maka gelembung sabun akan selalu megapung. Prinsip pengapungan ini juga dipakai pada pengurutan gelembung. Elemen yang berharga paling kecil “diapungkan”, yang artinya diangkat ke atas (atau ke ujung paling kiri) melalui pertukaran. Proses pengapungan ini dilakukan N kali langkah. Pada langkah ke 1, Larik[1….N] akan terdiri dari 2 bagian yaitu :
a. Bagian yang sudah terurut yaitu L[1]…L[i]
b. Bagian yang belum terurut L[i+1]..L[n]
Cntoh program 1 : 

#include <iostream.h>
#include <conio.h>
main(){
int nilai[‘n’];
int temp;
int n;
cout<<“Banyak Data: “;
cin>>n;
cout<<endl;
for (int a=1; a<=n; a++){
cout<<“nilai[“<<a<<“]: “;
cin>>nilai[a];
}
cout<<“\n\n”;
cout<<“Data Sebelum diurutkan”<<endl;
for(int a=1; a<=n; a++){
cout<<nilai[a]<<” “;
}
for(int a=n-1; a>=1; a–){
for(int b=1; b<=a; b++){
if(nilai[b]>nilai[b+1]){
temp=nilai[b+1];
nilai[b+1]=nilai[b];
nilai[b]=temp;
}
}
}
cout<<“\n\nData Setelah Diurutkan (Ascending)”<<endl;
for (int a=1; a<=n; a++){
cout<<nilai[a]<<” “;}
cout<<“\n\n”;
cout<<“\n\nData Setelah Diurutkan (Descending)”<<endl;
for (int a=n; a>=1; a–){
cout<<nilai[a]<<” “;}
getch();
}
Outputnya :

Contoh program 2 : 


Bubble sort adalah salah satu metode sorting atau mengurutkan dari data terkecil ke data terbesar ataupun dengan cara membandingkan elemen kesatu dengan elemen  yang selanjutnya.

Konsep pada metode bubble sort ini adalah

Pada kesempatan kali ini kita akan membuat contoh program bubble sort pada bahasa c++ yaitu mengurutkan nilai terbesar ke nilai terkecil.

keterangan:
- baris 5 -7    = adalah pendeklarasian variabel dan array yang akan digunakan
                         dalam program
- baris 11-14 = Proses inputan yang disimpan dalam array yang dilakukan
                         dalam perulangan
- baris 15-27 = Proses pengurutan antara elemen satu dengan yang lain dan
                         apabila elemen satu lebih kecil daripada elemen berikutnya
                         (mengurtkan besar ke kecil) maka proses pertukaran akan
                         terjadi pada pada baris 23- 25.
- baris 31-35 = Setelah pengurutan berhasil maka nilai akan dicetak/
                         ditampilkan pada baris ini.
Maka apabila di compile maka hasilnya akan menjadi :


- Quick Sort

Salah satu algoritma yang menggunakan paradigma Divide and Conquer adalah Algoritma Quick  Sort. Algoritma ini mengambil salah satu elemen secara acak (biasanya dari tengah) yang disebut dengan pivot  lalu menyimpan semua elemen yang lebih kecil di sebelah kiri pivot  dan semua elemen yang lebih besar di sebelah kanan pivot. Hal ini dilakukan secara rekursif terhadap elemen di sebelah kiri dan kanannya sampai semua elemen sudah terurut.
Ide dari algoritma ini adalah sebagai berikut:
a. Pilih satu elemen secara acak sebagai pivot
b. Pindahkan semua elemen yang lebih kecil ke sebelah kiri pivot dan semua elemen yang lebih besar ke sebelah kanan pivot. Elemen yang nilainya sama bisa disimpan di salah satunya.
c. Lakukan sort secara rekursif terhadap sub-array sebelah kiri dan kanan pivot.

Contoh Program 

Hasil Running :




 - Merge Sort

Algoritma lain yang menggunakan Divide and Conquer dalam pengurutan adalah Merge Sort.
Secara   konseptual,  untuk  sebuah array  berukuran  n,
Merge Sort bekerja sebagai berikut:
1.  Jika  bernilai  0   atau   1,   maka  array  sudah   terurut.

2.   Jika Array tidak terurut, bagi menjadi 2 sub-array dengan ukuran n/2
3. Urutkan setiap sub array. Jika sub array tidak cukup kecil lakukan langkah kedua dengan rekursif
4. Menggabungkan sub array menjadi satu array
 Contoh Program : 

Hasil Running : 



SUMBER :





Kamis, 14 Maret 2019

sistem operasi (shortcut windows )

1. Windows + A
   Open Action Center

 2. Windows + D
    Display and Hide the desktop 
   
3. Windows + E 
   Open File Explorer 
4. Windows + H
   Open the share charm 

 5. Windows + I
    Open  settings 
6. Windows + K 
   Open the connect quick action

 7. Windows + L
    Lock your PC or switch accounts
 
 8. Windows + M
    Minimize all windows 

 9. Windows + R
    Open run dialog box

 10. Windows + S
     Open search 

 11. Windows + U

 12. Windows + X
     Open quick link menu 
 13. Windows + up and down arrow 

14. Windows + left and right arrow

 15. Windows + number 1

 16. Windows + number 2

 17. Windows + number 3

 18. WIndows + number 4


19. Windows + number 5
 20. Windows + comma 
     Untuk menyembunyikan jendela sementara 
21. Windows + Ctrl + D
    Membuat virtual desktop
22. Windows + Ctrl + F4
    Untuk mengeluarkan virtual desktop
23. Windows + enter
    Untuk membuka narator 
24. Windows + prtScSysRq
    untuk print screen yang tersimpan langsung di folder 
25. Windows + Tab
    Untuk membuka task view 
26. Windows + +
    Untuk memperbesar 
27. Ctrl + Shift + Esc 
    Untuk membuka task manager 
28. Shift + F10
    Sama dengan klik kanan 

TUGAS BESAR PPEMROGRAMAN VISUAL