Data untuk searching sor:ng

  Penger6an  struct  

  • struct  adalah  kumpulan  variabel  (masing-­‐ masing  dapat  berbeda  6pe)  yang   dikelompokkan  dan  dikemas  ke  dalam  satu  

  Algoritme  dan  Pemrograman  

  nama  variabel.  

  • Tipe  struct  

    Untuk  mendefinisikan  suatu  record.   •

  • Searching  (Pencarian)  
  • Termasuk  6pe  data  turunan  (derived  data  Bubble  Sort  (Pengurutan)   •

  type).   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR Cara  membuat  struct   Deklarasi  struct  

  • Contoh  deklarasi  variabel  menggunakan  6pe &n
  • Contoh:  

  struct:  

  struct dataMhs {

     struct dataMhs mhs;

  char *nama;

  struct dataMhs arrMhs[100];

  int usia;

  • };

    Dapat  juga  dilakukan  langsung  (definisi  dan   deklarasi):  

  • Tipe  struct  ini  diberi  nama  dataMhs  

  struct dataMhs {

  • Terdiri  atas  dua  variabel:  nama  dan  usia  

  char *nama;

  • Pernyataan  tersebut  hanya  membuat  6pe  data  struct  

  int usia;

  baru,  TIDAK  mendeklarasikan  variabel  apapun

  } mhs, arrMhs[100];

  • –  Belum  ada  alokasi  memori   DEPARTEMEN ILMU KOMPUTER
  • INSTITUT PERTANIAN BOGOR DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR Contoh  program  ::  

      Pointer  pada  struct   Merekam  data  nama  dan  usia  mhs.  

      #include <stdio.h> #include <stdio.h>

      Elok Nian 20 Indah Sekali 19

      struct dataMhs { struct dataMhs {

      Indah Sekali 19 Indah Sekali 19

      char *nama; char *nama; int usia; int usia;

      } mhs1; }; int main() { int main() { struct dataMhs mhs2={"Indah Sekali", 19}; struct dataMhs mhs={"Indah Sekali", 19}; mhs1.nama = "Elok Nian"; struct dataMhs *p; mhs1.usia = 20; p = &mhs; printf("%s %d\n", mhs1.nama, mhs1.usia); printf("%s %d\n", mhs.nama, mhs.usia); printf("%s %d\n", mhs2.nama, mhs2.usia); printf("%s %d\n", p->nama, p->usia); return 0; return 0;

      } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

    • Typedef  merupakan  mekanisme  untuk  membuat   sinonim  atau  alias  dari  6pe  data  yang  telah   didefinisikan  sebelumnya.  
    • Contoh:     typedef struct dataMhs MHS;
    • Menggunakan  salah  satu  dari  dua  operator:  
      • –  operator  66k  (.)  
        • –   operator  panah  (-­‐>)    
          • Akses  variabel  biasa  (selain  pointer)   menggunakan  operator  66k,  sedangkan  akses   variabel  pointer  menggunakan  operator   panah.   DEPARTEMEN ILMU KOMPUTER
          • INSTITUT PERTANIAN BOGOR

      • Dengan  demikian,  pernyataan  struct  dataMhs   untuk  selanjutnya  dapat  digan6  dengan  MHS  saja.   DEPARTEMEN ILMU KOMPUTER
      • INSTITUT PERTANIAN BOGOR

          #include <stdio.h> #define SIZE 100 struct nilaiMhs { char nim[9]; int uts, uas; float rataan; }; typedef struct nilaiMhs NILAI; void substring (char *dest, const char *source, int a, int n) { int i=a; for (; i<a+n; i++) dest[i-a]=source[i]; dest[i-a]='\0'; } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

          ) ( ) ( ,

          2

          2

          ( )

          La6han  #1   Ti6k  2D  

          3 G64010234 60 80 G64010235 50 45 G64010236 90 76

          Array  of  struct   int main() { int n, i; NILAI list[SIZE]; char brs[256], st[4]; scanf("%d\n", &n); for (i = 0; i<n; i++) { gets(brs); // baca per baris data substring(list[i].nim, brs, 0, 9); } substring(st, brs, 10, 2); list[i].uts = atoi(st); substring(st, brs, 13, 2); list[i].uas = atoi(st); for (i = 0; i<n; i++) // hitung rataan tiap mhs list[i].rataan = (float) (list[i].uts+list[i].uas)/2.0; for (i = 0; i<n; i++) { printf("%s %.2f\n", list[i].nim, list[i].rataan); } } return 0; DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

          Indah Sekali 19 Indah Sekali 19 Array  of  struct  

          }; typedef struct dataMhs MHS; int main() { MHS mhs={"Indah Sekali", 19}; MHS *p; p = &mhs; printf("%s %d\n", mhs.nama, mhs.usia); printf("%s %d\n", p->nama, p->usia); return 0; } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

          #include <stdio.h> struct dataMhs { char *nama; int usia;

          Contoh  ::   Menggunakan  typedef  

           berar6  mendefinisikan  6pe  data  baru  bernama   MHS  sebagai  sinonim  untuk  “struct  dataMhs”.    

          Typedef  

           tergantung  6pe  variabel  yang  dideklarasikan.    

          Akses  anggota  struct  

        • Suatu  66k  dalam  bidang  2D  diwakili  oleh  dua  nilai  yang   masing-­‐masingnya  menunjukkan  nilai  untuk  masing-­‐ masing  dimensi  dan  dicetak  dengan  notasi  (x,  y)   dengan  x  dan  y  adalah  bilangan  riil  
          • Buat  program  untuk  membaca  dua  buah  66k  dan   menampilkan  jarak  Euclid  keduanya  dengan  dua  angka   di  belakang  66k  desimal.  Gunakan  6pe  data  struct  

        • Contoh  masukan:     2.5 2 5 2  
        • Contoh  keluaran:    2.50 DEPARTEMEN ILMU KOMPUTER
        • INSTITUT PERTANIAN BOGOR

            y y x xq p q p d + − = q p

            La6han  #2   La6han  #3  

            Waktu     Buat  fungsi  untuk  menentukan  selisih  antara  dua   •

          • Diketahui  suatu  struct  mhs  untuk  data  

            waktu  6me1  dan  6me2  dalam  satuan  menit.  Masing-­‐

            mahasiswa:  

            masing  waktu  terdiri  atas  6ga  komponen  nilai,  yaitu  

            struct mhs {

            hour  (jam),  minute  (menit),  dan  second  (de6k).  

            char nim[10];

          • Contoh  penggunaan  fungsi:  

            char nama[30];

            int main() { TIME time1 = {10, 30, 0.0}; float nilai; TIME time2 = {11, 31, 30.0};

            };  

            float beda; beda = selisih(time1, time2);

              Buat  suatu  program  untuk  menerima  n  buah  data   •

            printf(".2f\n", beda); // output: 61.50

            mahasiswa  dan  menampilkan  daXar  mahasiswa  

            return 0; } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR yang  terurut  berdasarkan  nilai  secara  descending   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR Data  untuk  searching  &  sor:ng   Searching  (pencarian)  

          • Mencari  data  berdasarkan  nilai  tertentu,  x.  
          • Anggaplah  kita  mempunya  array  data  yang   terdiri  dari  beberapa  kolom,  salah  satunya   •  Beberapa  contoh  algoritme  pencarian:  
            • – struct list {

              Sequen:al  search  

            adalah  key  dengan  6pe  int  sbb:  

          • –  Sorted  array  search  

            int key;

          • –  Hashing  

            int val; // contoh elemen lainnya

          • –  Recursive  structures  search    

            ... // dan seterusnya

          • –  Mul:dimensional  search    

            }; typedef struct list LIST; •  Yang  dibahas  pada  mata  kuliah  ini  adalah  

            sequen:al  search  dan  sorted  array  search  

          • Akan  dilakukan  sor6ng  berdasarkan  nilai  key  
          • Pencarian  pen6ng  dalam  struktur  data   secara  ascending.   DEPARTEMEN ILMU KOMPUTER
          • INSTITUT PERTANIAN BOGOR DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

              Sequen:al  search  

            • Ada  atau  6dak  ada?  Keluaran:  TRUE/FALSE &n>Se6ap  elemen  dalam  array  dibandingkan  satu &n
            • Indeks  kemunculan  pertama?  Keluaran:  suatu  nilai  antara  0  

              per  satu  dari  awal  (kiri)  hingga  x  ditemukan  

              dan  n-­‐1  jika  ada  atau  suatu  nilai  khusus  (mis.  -­‐1)  jika  6dak  ada  

              atau  semua  elemen  telah  diperiksa.  

                Frekuensi  kemunculan  x?  Keluaran:  antara  0  hingga  n   •

                Mudah  diimplementasikan.   •

            • Indeks  seluruh  kemunculan  jika  ada  

                Waktu  proses  rela6f  lambat  untuk  ukuran   •

            • Indeks  kemunculan  terakhir  atau  ke-­‐i  

              data  sangat  besar.  

            • –  Pencarian  nilai  yang  lebih  kecil  atau  lebih  besar  dari  x  

                Dapat  divariasikan  juga  dengan  

            • –  Jika  suatu  array  memiliki  n  buah  elemen,  
            • –  Pencarian  nilai  tertentu  untuk  fungsi  dari  x  (mis.  nilai  yang  selisihnya  dengan  x  

              sebanyak-­‐banyaknya  berapa  perbandingan  yang   kurang  dari  suatu  nilai  ambang)   harus  dilakukan  untuk  mencari?  O(n)  

                Penggunaan  dua  nilai  x  dan  y  untuk  mencari  data  yang  nilainya  di  antara   – keduanya   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

              Sequen:al  search  (kemunculan   Sequen:al  search  (ada/6dak?)   pertama)  

              // Keluaran: indeks kemunculan   Ubah  fungsi   pertama jika ada

            • // Keluaran: 1 jika ada

              // atau 0 jika tidak ada

              sequentialSearch   // atau bernilai -1 jika tidak ada untuk  melakukan  variasi  

              int sequentialSearch(LIST t[], int n, int val) {

              pencarian  berikut:   int sequentialSearch(LIST t[], int

              int i, last=0;

              n, int val) { 1.

                Indeks  kemunculan   int i;

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

              terakhir  

              if(val==t[i].val) return 1; /* ditemukan */ 2.

                Indeks  seluruh   for(i=0; i<n; i++) kemunculan   if(val==t[i].val) return

              return 0; /* tidak ditemukan */

              i; /* ditemukan */ 3.

              }

                Frekuensi  kemunculan  x  

              4.  Frekuensi  nilai  yang   return -1; /* tidak ditemukan lebih  kecil  dari  x  

            • / DEPARTEMEN ILMU KOMPUTER
            • INSTITUT PERTANIAN BOGOR } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR La6han   Sequen6al  sorted  array  search &
              • Ubah  fungsi  sequentialSearch  untuk &n
              • Data  harus  terurut  

              melakukan  variasi  pencarian  berikut:  

            • Se6ap  elemen  dalam  array  ditelusuri  satu  per  satu   dari  awal  (kiri)  hingga  ketemu  atau  nilai  yang  dibaca  
              • –  Frekuensi  kemunculan  x   lebih  besar  dari  nilai  yang  dicari  atau  semua  elemen   telah  dibandingkan.  
              • –  Indeks  seluruh  kemunculan  

                Asumsi:  terurut  ascending   –

            • –  Indeks  kemunculan  terakhir  
            • –  Jika  terurut  descending,  sesuaikan  algoritme &n
            • –  Frekuensi  nilai  yang  lebih  kecil  dari  x  
              • Mudah  diimplementasikan.     Waktu  proses  rela6f  cepat  untuk  kasus  data  yang   • dicari  terletak  di  bagian  depan.   DEPARTEMEN ILMU KOMPUTER
              • INSTITUT PERTANIAN BOGOR   Masih  masuk  lingkup  O(n)   – DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR Binary  search  

                • // Keluaran: indeks kemunculan pertama jika ada

                Data  harus  terurut  

              // atau bernilai -1 jika tidak ada

            • Pencarian  dimulai  dengan  memeriksa  elemen  yang  

              // Asumsi: array t terurut secara ascending (menaik)

              terletak  di  indeks  tengah-­‐tengah  (mis.  mid)     Jika  nilai  yang  di  tengah  lebih  besar  dari  x,  pencarian   •

              int sortedSearch(LIST t[], int n, int val) {

              diarahkan  ke  data  yang  ada  di  kiri  mid.  Sebaliknya,  

              int i=0, hsl=-1;

              diarahkan  ke  sebelah  kanan.  

            • – while ((t[i].val<=val) && (i<n) && (-1==hsl)) {

                Asumsi:  terurut  ascending  

              if(t[i].val==val) hsl=i;

            • –  Jika  terurut  descending,  sesuaikan  algoritme  

              i++;

            • Periksa  elemen  yang  di  tengah  bagian  tersebut  

              }

                Ulangi  hingga  x  ditemukan  atau  data  sudah  habis   • return hsl; /* tidak ditemukan */

              } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR   Efisien:  O(log  n)   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

              Binary  search   Sor:ng  (Pengurutan)  

            • Mengurutkan  data  berdasarkan  kunci  tertentu.  

              int binarySearch(LIST t[], int n, int val) { int left, right, mid;

            • Jenis  sor:ng:  

              left = 0; right = n-1; //indeks paling kiri dan kanan –  Ascending  (menaik)   while(left<=right) {

            • –   Descending  (menurun)  

              mid = (left+right)/2; if (val<t[mid].val) //kanan tidak perlu dicek

            • Manfaat:  mempercepat  dan  memudahkan  akses  

              right = mid-1;

              data  

              else if (val>t[mid].val) //kiri tidak perlu dicek left = mid + 1;

            • Banyak  algoritme  sor:ng  dikembangkan  untuk:  

              else return mid; /* ditemukan */

            • –  Mempercepat  proses  

              }

            • –  Mengefisienkan  penggunaan  sumberdaya  

              return -1; /* tidak ditemukan */ } DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR •  Ingat  syarat  terurut  pada  binary  search   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR Contoh   Data  untuk  sor:ng  

            • Masukan:  
            • Anggaplah  kita  mempunyai  suatu  array   integer

                 5 2 4 6 1 3

            • Akan  dilakukan  sor:ng  secara  ascending  

                Sor:ng  secara  descending  dapat  dilakukan   •

            • Keluaran:  

              dengan  penyesuaian  pada  algoritme      1 2 3 4 5 6  

               (ascending)      6 5 4 3 2 1  

               (descending)   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR

              BUBBLE  SORT  

                Mempertukarkan  nilai    t1  dan  t2:  

            • Ide:  nilai  yang  besar  seper6  “gelembung”  yang  

              void tukar(LIST *t1, LIST *t2) { akan  “naik”  

              LIST t = *t1;

            • t1 = *t2;
              • Keuntungan:  

            • t2 = t; }
              • –   Menampilkan  n  buah  data  

                Sederhana  dan  mudah  diimplementasikan  

            • Cepat  jika  data  masukan  sudah  terurut   –

              void printlist(LIST t[], int n) { int i;

            • Kelemahan:  

              for (i=0; i<n; i++) printf("%d ", t[i].val);

                Secara  umum  membutuhkan  waktu  proses  lebih  lama   –

              printf("\n");

                Biasa  dijadikan  contoh  algoritme  pengurutan  yang  

              }  

              2 DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR ;dak  efisien  (O(n ))   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR Cara  kerja   BUBBLE  SORT  

              void bubbleSort(LIST x[], int n) {

            • Baca  elemen  array  dari  kiri  ke  kanan,  bandingkan   int i,j; nilai  key  yang  bersebelahan.  Jika  dua  nilai   for(i=0;i<n-1;i++){ posisinya  6dak  sesuai,  tukar  tempatnya.  Ulangi   for(j=0;j<n-(i+1);j++){ prosedur  ini  sampai  semua  elemen  terurut.   if (x[j].val > x[j+1].val)

                Pada  putaran  ke-­‐i,  nilai  ke-­‐i  terbesar  akan  berada   • tukar(&x[j],&x[j+1]); di  posisi  yang  benar   printf("%d %d |", i, j); printlist(x, n);

            • –  Putaran  pertama  akan  menempatkan  nilai  paling  

              }

              besar  di  akhir  array   Bagian yang ditebalkan adalah optimasi inner loop

              }

            • –  Dimanfaatkan  untuk  op6masi  inner  loop  agar  6dak  

              }

              Bagian berwarna biru hanya lagi  memeriksa  nilai  yang  telah  benar  posisinya   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR untuk tracing

              Algoritme  sor:ng  lainnya   Review  

            • Inser:on  sort   •  Untuk  menampung  data  nama  dan  usia,   dibuat  dua  variabel  array:  
            • Selec:on  sort  

               char nama[SIZE][50];   Quicksort   • int usia[SIZE];

            • Mergesort  

                Bisakah  disimpan  dalam  satu  variabel  array   • biasa?   à  TIDAK  BISA,  karena  berbeda  6pe.  

                Beberapa  variabel  dapat  dikemas  dalam  satu   • DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR “paket”  dengan  struct.   DEPARTEMEN ILMU KOMPUTER INSTITUT PERTANIAN BOGOR