540 likes | 919 Views
Algoritma dan Struktur Data. Materi. Algoritma Struktur Data Abstract Data Type Rekursif. Siklus Hidup Perangkat Lunak. Algoritma. Urutan langkah logis untuk menyelesaikan suatu masalah yang dituangkan secara tertulis berdasarkan alur pemikiran seseorang. Contoh Kasus.
E N D
Materi • Algoritma • Struktur Data • Abstract Data Type • Rekursif
Algoritma • Urutan langkah logis untuk menyelesaikan suatu masalah yang dituangkan secara tertulis berdasarkan alur pemikiran seseorang.
Contoh Kasus • Buatlah algoritma untuk menentukan apakah suatu bilangan merupakan bilangan genap atau bilangan ganjil.
Start Input n Hitung sisa bagi antara bilangan dengan 2 Apakah Sisa = 0 Tidak Ya Cetak Genap Cetak Ganjil End Flowchart
Pseudocode • Masukkan bilangan • Bagi bilangan dengan 2 • Cek sisa bagi • Jika sisa=0 cetak “bilangan genap” • Jika sisa tidak 0 cetak “bilangan ganjil”
Latihan • Buatlah algoritma untuk menghitung konversi suhu.dari Celcius menjadi Reamur dan Farenheit. Input: suhu dalam Celcius Proses: R = 4/5 * C dan F = 9/5 * C + 32 Output: suhu dalam Reamur dan Farenheit 2. Buatlah algoritma untuk mencari sisi miring dari suatu segitiga siku-siku, jika diketahui panjang sisi yang membentuk sudut siku-siku. Input: a dan b, yaitu panjang sisi pembentuk sudut siku-siku Proses: Ouput: sisi miring (c) 3. Buatlah algoritma untuk menentukan suatu bilangan adalah bilangan prima atau bukan.
Struktur Data • Cara representasi dan manipulasi data. • Representasi data : array, linkedlist, stack, queue, tree, graph. • Manipulasi data menggunakan algoritma. • Manipulasi data : add, remove, update, access, searching.
Array (1-Dimensi)
Definisi • Sebuah tipe data yang mampu meyimpan data/variabel dengan nama dan tipe yang sama. • Contoh : nilai grade dari 6 mahasiswa • Keterangan • Terdiri dari 6 elemen • Elemen pertama pada index ke-0 elemen terakhir pada index ke-5 • Array pada java selalu diawali dengan index ke-0!!!!! 0 1 2 3 4 5 Index Elemen
Deklarasi • Contoh : int grade[] = new int[6]; atau int []grade = new int[6];
Inisialisasi • Contoh : int grade[] = {5,8,9,7,6,7}; atau : int grade[] = new int[6]; grade[0] = 5; grade[1] = 8; grade[2] = 9; grade[3] = 7; grade[4] = 6; grade[5] = 7; • Untuk mendapatkan panjang array : panggil method length()
Pengaksesan Elemen • x = grade[5]; mengakses elemen grade pada index ke-5 yang akan diisikan ke variabel x. • System.out.print(grade[0]); mengakses sekaligus menampilkan elemen grade pada index ke-0. • Elemen array yang dapat diakses dimulai dari index 0 sampai elemen.length()-1
Contoh Program • public class ArraySample • { • public static void main( String[] args ){ • int[] ages = new int[100]; • for( inti=0; i<ages.length; i++ ){ • System.out.print( ages[i] ); • } • } • }
Array (Multi Dimensi)
Array Multi Dimensi • Digunakan untuk merepresentasikan tabel data.
Deklarasi 2D • Pendeklarasian array 2 dimensi. • Contoh : int [][]a = new int[3][4]; (terdiri dari 3 baris 4 kolom) • Dapat digambarkan sebagai berikut : a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
Penjelasan Baris a[0][0] a[0][1] a[0][2] a[0][3] baris0 a[1][0] a[1][1] a[1][2] a[1][3] baris1 a[2][0] a[2][1] a[2][2] a[2][3] baris2
Penjelasan Kolom a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] Kolom 0 Kolom 1 Kolom 2 Kolom 3
Pengaksesan Elemen • Pengaksesan elemen untuk array 2 dimensi hampir sama dengan pengaksesan array 1 dimensi. Yaitu dengan cara menyebutkan index dari elemen yang ingin diakses. • Contoh : x = dogs[i][j]; //mengakses elemen dogs pada baris i kolom j. atau System.out.print(dogs[i][j]);
Contoh Program • Class MultiDimensiArray • { • Public static void main(String args[]) • { • // String array 4 baris x 2 kolom • String[][] dogs = {{ "terry", "brown" }, • { "Kristin", "white" }, • { "toby", "gray"}, • { "fido", "black"} • }; • For(int i=0;i<dogs.length;i++) • { • For(int j=0;j<dogs.length[0];j++) • { • System.out.print(dogs[i][j] ); • }System.out.println(); • } • } • }
Abstract Data Type • Sekumpulan data dan operasi terhadap data tersebut yang definisi-nya tidak bergantung pada implementasi tertentu. (/www.nist.gov/dads/)
Interface • Spesifikasi Abstract Data Type biasa disebut sebagai interface. • Interface menyatakan apa yang dapat dilihat dan digunakan oleh programmer. • Dalam Java, hal tersebut dinyatakan sebagai public method. • Operasi-operasi yang dapat dilakukan pada abstract data type dituliskan dalam interface dan dinyatakan public.
Pemisahan interface dengan implementasi Pengguna dari sebuah abstract data type hanya perlu memikirkan dan mempelajari interface yang diberikan tanpa perlu mengetahui banyak bagaimana implementasi dilakukan. (prinsip: enkapsulasi) Implementasi dapat saja berubah namun interface tetap. Dengan kata lain, implementasi dari sebuah abstract data type dapat saja berbeda-beda namun selama masih mengikuti interface yang diberikan maka program yang menggunakan abstract data type tersebut tidak akan terpengaruh.
Deklarasi Interface • Syntax : • Contoh : (interface kosong) public interface [InterfaceName] { //beberapa method tanpa body } public interface Facsimile{ }
Contoh Interface • Interface facsimile memiliki member : 1 konstanta, 4 method abstract. public interface Facsimile{ intdotPerInches = 90; booleandialPhone (String number); void getDocument(intnDoc); booleansendDocument(intnDoc); void closePhone(); }
Komponen Pembentuk Interface • Modifier • Keyword “interface”. • Identifier Merupakannama interface yang ditentukanoleh programmer. • Body interface Berisi method abstract. Ataubisajugaditambahkankonstanta.
Implementasi • Interface dapat diimplementasikan oleh sebuah class. • Implementasi interface menggunakan keyword “implements”. • Syarat : seluruh method abstract yang ada pada interface harus dideklarasi ulang didalam class yang mengimplementasikannya. • Syntax : public class [className] implements [interfaceName] { //beberapakodedisini }
Contoh : Implementasi Interface public class Printer implements Facsimile{ booleandialPhone (String number){ return true; } void getDocument(intnDoc){ } booleansendDocument(intnDoc){ return true; } void closePhone(){ } } • Class Printer melakukan implements terhadap Facsimile sehingga didalamnya dideklarasi ulang seluruh method abstract yang dimiliki oleh Facsimile.
Multi-implements • Sebuah class dapat melakukan implements lebih dari satu interface. • Contoh : Class Person implements terhadap 3 interface sekaligus, yaitu : PersonInterface, LivingThing dan WhateverInterface. class Person implements PersonInterface,LivingThing, WhateverInterface { //beberapa kode disini }
Multi-implements • Multi-implements dapat menyelesaikan permasalahan multiple inheritance yang tidak diperbolehkan terjadi pada extends class. • Gambaran multi-implements : Interface 1 Interface 2 Interface n class
Hirarki Interface • Superinterface interface yang letaknya diatas interface lain. • Subinterface interface yang letaknya dibawah interface lain. Super interface Sub interface
Inheritance pada Interface • Interface dapat memiliki hubungan inheritance antar mereka sendiri. • Menggunakan keyword “extends”. • Contoh : interface PersonInterface merupakan superinterface dari student interface. public interface PersonInterface { . . . } public interface StudentInterface extends PersonInterface { . . . }
Implements SubInterface • Sebuah class yang mengimplementasikan subinterface wajib mendeklarasi ulang seluruh method yang ada pada subinterface tersebut dan juga method yang ada pada superinterface-nya. • Contoh : • Karena StudentInterface merupakan subclass dari PersonInterface maka class Mahasiswa harus mendeklarasi ulang semua method abstract yang dimiliki oleh kedua interface tersebut. Class Mahasiswa implements StudentInterface { . . . }
Interface & Class • Persamaan : • Berupa type data, sehingga interface dapat digunakan ditempat dimana sebuah class dapat digunakan (berhubungan dengan akses modifier) • Perbedaan : • Tidak dapat membuat object dari interface • Tidak memiliki segala implementasi dari method
Interface & Abstract Class • Persamaan : • Bertipe abstract • Memiliki method abstract • Perbedaan : • Interface hanya berisi method abstract • Variabel yang dideklarasikan didalam interface merupakan constanta • Interface dapat diimplemetasikan secara multi-inheritance
Apa itu Rekursif? Method yang memanggil dirinya sendiri baik secara langsung maupun secara tidak langsung. f(0) = 0; f(x) = 2 f(x-1) + x2 f(1) = 1; f(2) = 6; f(3) = 21; f(4) = 58 fib(n) = fib(n - 1) + fib(n - 2) public static int f (int x) { if (x == 0) return 0; return 2 * f (x - 1) + x * x; }
/** Menghitung pangkat sebuah bilangan real (versi rekursif). @param x bilangan yang dipangkatkan (x != 0) @param n pangkatnya */ public static double pangkatRekursif (double x, int n) { if (n == 0) { return 1.0; } else if (n > 0) { return (x * pangkatRekursif (x, n - 1)); } else { return (1 / pangkatRekursif (x, -n)); } } /** Menghitungpangkatsebuahbilangan real (versirekursif). @param x bilangan yang dipangkatkan (x != 0) @param n pangkatnya */ public static double pangkatRekursif (double x, int n) { if (n == 0) { return 1.0; } else if (n > 0) { return (x * pangkatRekursif (x, n - 1)); } else { return (1 / pangkatRekursif (x, -n)); } }
Berapa nilai pangkat 4-2? 0.0625 0.0625 pangkatRekursif (4.0, -2) return (1 / pangkatRekursif (4.0, 2)); pangkatRekursif (4.0, -2) return (1 / pangkatRekursif (4.0, 2)); 16.0 16.0 pangkatRekursif (4.0, 2) return (4.0 * pangkatRekursif (4.0, 1)); pangkatRekursif (4.0, 2) return (4.0 * pangkatRekursif (4.0, 1)); Returning values Returning values Recursive calls Recursive calls 4.0 4.0 pangkatRekursif (4.0, 1) return (4.0 * pangkatRekursif (4.0, 0)); pangkatRekursif (4.0, 1) return (4.0 * pangkatRekursif (4.0, 0)); 1.0 1.0 pangkatRekursif (4.0, 0) return 1.0; pangkatRekursif (4.0, 0) return 1.0;
Algoritme Rekursif Ciri masalah yang dapat diselesaikan secara rekursif adalah masalah itu dapat di-reduksi menjadi satu atau lebih masalah-masalah serupayanglebih kecil Secara umum, algoritme rekursif selalu mengandung dua macam kasus: kasus induksi: satu atau lebih kasus yang pemecahan masalahnya dilakukan dengan menyelesaikan masalah serupa yang lebih sederhana (yaitu menggunakan recursive calls) kasus dasarataukasus penyetop (base case): satu atau lebih kasus yang sudah sederhana sehingga pemecahan masalahnya tidak perlu lagi menggunakan recursive-calls. Supaya tidak terjadi rekursi yang tak berhingga, setiap langkah rekursif haruslah mengarah ke kasus penyetop (base case).
Aturan Rekursif Punya kasus dasar Kasus yang sangat sederhana yang dapat memproses input tanpa perlu melakukan rekursif (memanggil method) lagi Rekursif mengarah ke kasus dasar Percaya. Pada proses pemanggilan rekursif, asumsikan bahwa pemanggilan rekursif (untuk problem yang lebih kecil) adalah benar. Contoh: pangkatRekursif (x, n) Asumsikan: pangkatRekursif (x, n - 1) menghasilkan nilai yang benar. Nilai tersebut harus diapakan sehingga menghasilkan nilai pangkatRekursif (x, n) yang benar? Jawabannya: dikalikan dengan x Aturan penggabungan: Hindari duplikasi pemanggilan rekursif untuk sub-problem yang sama.
Infinite Recursion public static int bad (int n) { if (n == 0) return 0; return bad (n * 3 - 1) + n - 1; }
How it works? Java VM menggunakan internal stack of activation records Activation record dapat dilihat sebagai kertas yang berisi informasi tentang method nilai parameter variabel lokal program counter (PC)
How it works? Ketika suatu method G dipanggil, sebuah activation record untuk G dibuat dan di-push ke dalam stack; saat ini G adalah method yang sedang aktif Ketika method G selesai (return), stack di-pop; method dibawah G yang dipanggil.
Too Much Recursion Di sebuah system, n >= 9410 tidak dapat dieksekusi public static long s (int n){ if (n == 1) { return 1; } else { return s (n - 1) + n; } }
Bilangan Fibonacci F0 = 0, F1 = 1, FN = FN-1 + FN-2 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... public static int fib1 (int n) { if (n <= 1) return n; return fib1 (n – 1) + fib1 (n – 2); }
Bilangan Fibonacci Dynamic Programming menyelesaikan sub-permasalahan dengan menyimpan hasil sebelumnya. public static int fib2 (int n){ if (n <= 1) return n; int result[] = new int[n + 1]; result[0] = 0; result[1] = 1; for (int ii = 2; ii <= n; ii++) { result[ii] = result[ii - 2] + result[ii - 1]; } return result[n]; }
Bilangan Fibonacci Hanya menyimpan dua hasil sebelumnya saja. public static int fib3 (int n){ if (n <= 1) return n; int fib1 = 0; int fib2 = 1; int result; for (int ii = 2; ii <= n; ii++) { result = fib2 + fib1; fib1 = fib2; fib2 = result; } return result; }