Senin, 01 Februari 2010

algoritma dan struktur data

Algoritma merupakan kumpulan perintah untuk menyelesaikan suatu masalah. Perintah-perintah ini dapat diterjemahkan secara bertahap dari awal hingga akhir. Masalah tersebut dapat berupa apa saja, dengan catatan untuk setiap masalah, ada kriteria kondisi awal yang harus dipenuhi sebelum menjalankan algoritma. Algoritma akan dapat selalu berakhir untuk semua kondisi awal yang memenuhi kriteria, dalam hal ini berbeda dengan heuristik. Algoritma sering mempunyai langkah pengulangan (iterasi) atau memerlukan keputusan (logika Boolean dan perbandingan) sampai tugasnya selesai.
Desain dan analisis algoritma adalah suatu cabang khusus dalam ilmu komputer yang mempelajari karakteristik dan performa dari suatu algoritma dalam menyelesaikan masalah, terlepas dari implementasi algoritma tersebut. Dalam cabang disiplin ini algoritma dipelajari secara abstrak, terlepas dari sistem komputer atau bahasa pemrograman yang digunakan. Algoritma yang berbeda dapat diterapkan pada suatu masalah dengan kriteria yang sama.
Kompleksitas dari suatu algoritma merupakan ukuran seberapa banyak komputasi yang dibutuhkan algoritma tersebut untuk menyelesaikan masalah. Secara informal, algoritma yang dapat menyelesaikan suatu permasalahan dalam waktu yang singkat memiliki kompleksitas yang rendah, sementara algoritma yang membutuhkan waktu lama untuk menyelesaikan masalahnya mempunyai kompleksitas yang tinggi.
Sejarah algoritma
Kata algoritma berasal dari latinisasi nama seorang ahli matematika dari Uzbekistan Al Khawārizmi (hidup sekitar abad ke-9), sebagaimana tercantum pada terjemahan karyanya dalam bahasa latin dari abad ke-12 "Algorithmi de numero Indorum". Pada awalnya kata algorisma adalah istilah yang merujuk kepada aturan-aturan aritmetis untuk menyelesaikan persoalan dengan menggunakan bilangan numerik arab (sebenarnya dari India, seperti tertulis pada judul di atas). Algortima adalah jantung ilmu computer atau informatika. Banyak cabang dari ilmu komputer yang diacu dalan terminologi algoritma,misalnya algoritma perutean (routing) pesan di dalam jaringan komputer, algoritma berensenham untuk menggambar garis lurus (bidang grafik kumputer), algoritma Knuth-Morris-Pratt untuk mencari suatu pola di dalam teks (bidang information retrievel), dan sebagainya.
Ditinjau dari asal usul kata, kata “algoritma” sendiri mempunyai sejarah yang cukup aneh. Kata ini tidak muncul di dalam kamus Webster sampai akhir tahun 1957. Orang hanya menemukan kata algorism yang berarti proses menghitung dengan angka Arab. Anda dikatakan algorist jika Anda menggunakan angka Arab. Para ahli bahasa berusaha menemukan asal kata algorism ini, namun hasilnya kurang memuaskan. Akhirnya para ahli sejarah matematika menemukan asal mula kata tersebut. Kata algorism berasal dari nama penulis buku arab yang terkenal, yaitu Abu Ja’afarMuhammad Ibnu Musa al-Khuwarizmi (al-Khuwarizmi dibaca orang barat menjadi algorism).Al-Khuwarizmi menulis buku yang berjudul Kital al jabar wal-muqabala, yang artinya “Buku pemugaran dan pengurangan” (The book of restoration and reduction). Dari judul buku ini kita juga memperoleh akar kata “aljabar” (algebra). Perubahan dari kata algorism menjadi algoritm muncul karena kata algorism sering dikelirukan dengan arithmetic, sehingga akhiran –sm beubah menjadi –thm. Karena perhitungan dengan angka Arab sudah menjadi hal yang biasa/lumrah, maka lambat laun kata algorithm berangsur-angsur dipakai sebagai metode perhitungan (komputasi) secara umum, sehingga kehilangan makna aslinya. Dalam bahasa Indonesia, kata algorithm diserap menjadi “algoritma”.
Pada tahun 1950, kata algoritma perama kali digunakan pada “algoritma Euclidean” (Euclid’s algorithm). Euclid, seorang matematikawan Yunani (lahir pada tahun 350 M), dalam bukunya yang berjudul Element menuliskan langkah-langkah untuk menemukan pembagi bersama terbesar (common greatest divisor atau gcd), dari dua buah bilangan bulat, m dan n (tapi Euclid tidak menyebut metodenya itu sebagai algoritma, baru abad modernlah ornag-orang menybut metodenya itu sebagai “algoritma Euclidean”), Pembagi terbesar dari dua buah bilangan bulat tak-negatif adalah bilangan bulat positif terbesar yang habis membagi kedua bilangan tersebut.
Misalnya, m=80 dan n=12.
Semua factor pembagi adalah
1, 2, 4, 5, 8, 10, 16, 20, 40, 80
Dan semua factor pembagi 12 adalah
1, 2, 3, 4, 6, 12
Maka gcd(80,12)=4
Langkah-langkah mencari gcd(80,12) dengan algoritma Euclidean sebagai berikut :
80 dibagi 12 hasilnya = 6, sisa = 8 (atau: 80 = 6.12 +
12 dibagi 8 hasilnya = 1, sisa = 4 (atau: 12 = 1.8 + 4)
8 dibagi 4 hasilnya = 2, sisa = 0 (atau: 8 = 4.2 + 0)
Karena pembagian yang terakhir menghasilkan 0, maka sisa pembagian terakhir sebelum 0, yaitu 4, menjadi gcd(80,12). Jadi, gcd(80,12) = gcd(12,8) = gcd(4,0) = 4.
Contoh-contoh algoritma yang sudah dijelaskan di atas memberi dua pesan penting. Pertama, sebuah algoritma harus benar. Kedua, algoritma harus berhenti, dan setelah berhenti,algoritma membri hasil yang benar. Menurut Donald E. Knuth dalam bukunya yang berjudul The art of Computer Programming, sebuah algoritma harus mempunyai lima ciri penting:
1. Algoritma harus berhenti setelah mengerjakan sejumlah langkah trbatas.
2. Setiap langkah harus didefinisikan dengan tepat dan tidak brarti-dua (ambiguous). Misalnya, pernyataan “bagilah p dengan sejumlah beberapa bilangan bulat positif”,pernyataan ini dapat bermakna ganda. Berapakah yang dimaksud dengan “beberapa”? Algoritma menjadi jelas jika langkah tersebut ditulis “bagilah p dengan 10 buah bilangan bulat positif”.
3. Algoritma memiliki nol atau lebih masukan (input). Maukan ialah besaran yang diberikan kepada algoritma untuk diproses. Algoritma Euclidean mempunyai dua buah masukan, m dan n.
4. Algortima mempunyai nol atau lebih keluaran (output). Keluaran dapat berupa pesan atau besaran yang memiliki hubungan dengan masukan.
5. Algoritma harus sangkil (effective). Setiap langkah harus sederhana shingga dapat dikerjakan dalam sejumlah waktu yang masuk akal.
Pada abad ke-18, istilah ini berkembang menjadi algoritma, yang mencakup semua prosedur atau urutan langkah yang jelas dan diperlukan untuk menyelesaikan suatu permasalahan.

Jenis-jenis Algoritma
Terdapat beragam klasifikasi algoritma dan setiap klasifikasi mempunyai alasan tersendiri. Salah satu cara untuk melakukan klasifikasi jenis-jenis algoritma adalah dengan memperhatikan paradigma dan metode yang digunakan untuk mendesain algoritma tersebut. Beberapa paradigma yang digunakan dalam menyusun suatu algoritma akan dipaparkan dibagian ini. Masing-masing paradigma dapat digunakan dalam banyak algoritma yang berbeda.
Divide and Conquer, paradigma untuk membagi suatu permasalahan besar menjadi permasalahan-permasalahan yang lebih kecil. Pembagian masalah ini dilakukan terus menerus sampai ditemukan bagian masalah kecil yang mudah untuk dipecahkan. Singkatnya menyelesaikan keseluruhan masalah dengan membagi masalah besar dan kemudian memecahkan permasalahan-permasalahan kecil yang terbentuk.
Dynamic programming, paradigma pemrograman dinamik akan sesuai jika digunakan pada suatu masalah yang mengandung sub-struktur yang optimal (, dan mengandung beberapa bagian permasalahan yang tumpang tindih . Paradigma ini sekilas terlihat mirip dengan paradigma Divide and Conquer, sama-sama mencoba untuk membagi permasalahan menjadi sub permasalahan yang lebih kecil, tapi secara intrinsik ada perbedaan dari karakter permasalahan yang dihadapi.
Metode serakah. Sebuah algoritma serakah mirip dengan sebuah Pemrograman dinamik, bedanya jawaban dari submasalah tidak perlu diketahui dalam setiap tahap; dan menggunakan pilihan "serakah" apa yang dilihat terbaik pada saat itu.


FUNGSI
Program komputer yang dibuat untuk menjawab permasalahan umumnya berukuran sangat besar. Pengalaman telah menunujukkan bahwa cara terbaik untuk mengembangkan dan menangani program besar adalah menyusunnya dari potongan-potongan program yang berukuran kecil-kecil (atau disebut modul) yang lebih mudah untuk ditangani dibandingkan dengan program yang terdiri dari banyak sekali baris.
Modul program di dalam C++ disebut fungsi (function). Program C++ ditulis dengan mengkombinasikan fungsi baru yang ditulis oleh pemprogram (disebut programmer-defined function) dengan fungsi yang telah tersedia di dalam pustakanya (disebut standard library).
Fungsi merupakan blok dari kode yang dirancang untuk melakukan tugas khusus. Adapun tujuan dari pembuatan fungsi ini adalah :
Program menjadi terstruktur. Program yang besar dapat dipecah menjadi beberapa program yang lebih kecil, yang setiap satu program kecil tersebut mempunyai tugas tertentu.
Dapat mengurangi duplikasi kode.
Fungsi dapat dipanggil dari program atau fungsi yang lain.
Dasar Fungsi
Pada umumnya fungsi memerlukan masukan yang dinamakan argumen atau parameter. Hasil akhir fungsi akan berupa sebuah nilai (nilai balik fungsi).
Adapun bentuk umum definisi sebuah fungsi adalah :
Penentu-tipe nama_fungsi (daftar parameter)
Deklarasi parameter
{
Tubuh fungsi
}
Penentu tipe berfungsi untuk menentukan tipe keluaran fungsi yang dapat berupa salah satu tipe data C++ yang berlaku, misalnya char atau int. Default tipe fungsi yang tidak disebutkan dianggap sebagai int.
Sebuah fungsi dapat saja tidak mengandung parameter. Tentu saja untuk kondisi ini deklarasi parameter juga tidak ada.
Contoh:
Inisialisasi ()
{
Return (0)
}
Pada fungsi diatas dapat dijelaskan sebagai berikut:
Penentu tipe fungsi tidak disebutkan, berarti keluaran bertipe int.
Inisialisasi adalah nama fungsi.
Tanda () menyatakan bahwa fungsi tidak memiliki parameter.
Tanda { dan } merupakan awal dan akhir fungsi.
Return (0) merupakan pernyataan dalam tubuh fungsi.
Suatu fungsi cukup didefinisikan sekali tetapi dapat digunakan beberapa kali. Seandainya tubuh fungsi banyak mengandung pernyataan maka pemakaian fungsi dapat menghindari dupliukasi kode dan menghemat penulisan program maupun kode dalam memori. Jadi fungsi merupakan semacam subprogram.
Adapun bentuk umumnya adalah sebagai berikut:
Inisialisasi ()
{
Return (0);
}
main()
{
Int x,y;
.... . .
x=inisialisasi();
............. . .
y=inisialisasi()
}
Misalkan anda diminta membuat algoritma dan program untuk menentukan bilangan terbesar dari 2 buah bilangan yang diketahui dengan menggunakan fungsi . Anda terlebih dahulu harus mendeklarasikan fungsi untuk menampung dan membandingkan 2 buah bilangan tersebut .
Adapun alogaritma dari permasalahan diatas adalah sebagai berikut:
1. Deklarasikan fungsi untuk menampung 2 buah bilangan (bilangan pertama dan bilangan kedua).
2. Deklarasikan fungsi untuk mencari bilangan terbesar.
3. Tentukan 2 buah bilangan tersebut.
4. Tentukan sebuah variabel untuk menampung fungsi dari bilangan terbesar.
5. Sesuai dengan langkah 1, lakukan pengujian untuk 2 buah bilangan tersebut.
6. Jika bilangan pertama lebih besar dari bilangan kedua, dan jawabannya ya maka bilangan pertama yang menjadi bilangan terbesar.
7. Dari langkah 6, jika jawabannya tidak maka bilangan kedua yang menjadi bilangan terbesar.
8. Sesuai langkah 2, cetak bilangan terbesar.
Adapun inplementasi dari algoritma diatas pada program adalah sebagai berikut:
Program contoh implementasi fungsi
/*program:fungsi1.cpp */
#include
/*deklarasi fungsi*/
Int findMax(int n1, int n2);
Void PrintMax (int m);
Main ()
{
Int i = 5;
Int j = 7;
Int k;
k = FindMax (i,j);
PrintMax(k);
Return 0;
}
/* definisi fungsi */
Int FindMax (int n1, int n2)
{
If (n1 >n2)
{
Return n1;
}
Else
{
Return n2
}
}
Void PrintMax (int m)
{
Printf (“Bilangan yang terbesar adalah :%d\n”,m);
}
Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut:
Bilangan yang terbesar adalah : 7
Penjelasan:
Program diatas adalh contoh fungsi untuk menampilkan bilangan terbesar diantara 2 buah bilangan. Dimana sebelum bilangan pertama dengan bilangan kedua dibandingkan, terlebih dahulu didefinisikan fungsi yaitu:
Int FindMax (int n1, n2)
{
If (n1>n2)
{
Return n1;
}
Else
{
Return n2;
}
Jika nantinya bilangan pertama waktu dibandingkan dengan bilangan kedua menghasilkan hasil terbesar atau angkanya lebih besar maka bilangan pertama yang terbesar. Sedangkan sebaliknya, kalau waktu dibandingkan bilangan pertama lebih kecil, maka bilangan kedualah yang di cetak. Untuk bilangan pertama diwakili i yang nilainya 5 dan nantinya akan mengisi n1 dan bilangan kedua yang diwakili j yang nilainya 7 dan nantinya akan mengisi n2.
Parameter Formal dan Parameter Aktual
Parameter formal adalah variabel yang ada pada daftar parameter dalam fungsi. Parameter aktual adalah parameter yang dapat berupa variabel atau konstanta maupun ungkapan yang dipakai dalam pemanggilan fungsi.
Adapun cara melewatkan parameter adalah :
Pemanggilan dengan nilai
Pemanggilan dengan referensi
Sebagai contoh perhatikan keterangan berikut ini:
A...x
B...y
Dengan cara ini nilai parameter aktual tidak dapat berubah sekalipun nilai parameter formal berubah-ubah sebab x merupakan salinan dari A dan y salinan dari B.
Pada saat pemanggilan suatu fungsi, misalnya:
A bernilai 20 → x juga bernilai 20
B bernilai 30 → y juga bernilai 30
Selanjutnya nilai x dan y diproses tetapi nilai A dan B akan tetap.
Pemanggilan dengan referensi merupakan usaha melewatkan alamat dari suatu variabel ke dalam fungsi. Dengan pengubahan dilakukan di dalam fungsi untuk mengubah variabel di luar fungsi.
Perhatikan penggalan program berikut ini:
Tukar (int *px, int *py)
{
Int z;
Z=*px;
*px=*py;
*py=z;
. . . . . . . . .
}
Parameter aktualnya:
Tukar (&a, &b);
Dalam deklarasi parameternya:
Int *px, int *py
Dalam hal ini, px menunjukkan variabel a dan py menunjukkan variabel b.
(*adalah tanda pointer)
Dapat digambarkan sebagai berikut:
px py
alamat a alamat b
a b
Apabila penggalan program tersebut, kita implementasikan pada program, hasilnya adalah sebagai berikut:
Program contoh parameter formal dan aktual
/* program: fungsi2.cpp*/
#include
Void tukar (int x, int y);
Main()
Int a, b;
a=99;
b=11;
printf (“nilai sebelum pemanggilan fungsi:\n”);
printf (“nilai a=%d nilai b=%d\n\n”,a,b);
tukar (a, b);
printf (“nilai sesudah pemanggilan fungsi: \n”);
printf (“nilai a=%d nilai b=%d\n\n”,a,b);
}
Void tukar (int px, int py)
{
Int z;
z=px;
px=py;
py=z;
printf (“nilai diakhir fungsi : \n”);
printf (“nilai px=%d niali py=%d\n\n”,px,py);
Bila program diatas dijalankan, hasilnya adalah sebagai berikut:
Nilai sebelum pemanggilan fungsi:
nilai a=99 nilai b=11
nilai diakhir fungsi:
nilai px=11 nilai py=99
Nilai sesudah pemanggilan fungsi:
nilai a=99 nilai b=11
penjelasan:
Setelah px menunjukkan a dan py menunjukkan b, proses penukaran isi a dan b dilakukan dengan cara sebagai berikut:
z=px;
px=py;
py=z;
Dengan melalui tiga pernyataan diatas, nilai a dan nilai b dapat diubah dalam fungsi.
File Header
Setiap pustaka baku mempunyai file header yang mengandung prototipe fungsi untuk semua fungsi yang ad di dalam pustaka dan definisi dari tipe-tipe data maupun konstanta yang diperlukan oleh fungsi tersebut. Berikut dicantumkan daftar file header yang dapat di include ke dalam program.
berisi makro dan informasi untuk diagnosis yang membantu pemeriksaan kesalahan proses dalam program.
mengandung prototipe fungsi untuk menguji properti dari karakter, dan dapat digunakan untuk mengubah karakter huruf kecil ke besar.
berisi batasan di dalam sistem bilangan bertipe float.
berisi batasan sistem integral.
berisi prototipe fungsi dan informasi lainnya yang dapat memodifikasi sistem data pada saat program diproses.
berisi prototipe fungsi untuk pustaka matematika.
berisi prototipe fungsi yang menuntun urutan pemanggilan fungsi.
berisi prototipe fungsi dan makro untuk menangani kondisi yang bermacam-macam saat program diproses
mendefinisikan makro untuk menangani daftar argumen fungsi yang nilai dan tipenya tidak diketahui.
berisi definisi umum dari tipe yang digunakan C untuk membentuk perhitungan tertentu.
berisi prototipe fungsi untuk fungsi pustaka baku input/output.
berisi prototipe fungsi untuk konversi nilai ke text atau sebaliknya, alokasi memori, bilangan acak, dan utilitas lainnya.
berisi prototipe fungsi untuk pemrosesan string.
berisi prototipe fungsi dan tipe untuk memanipulasi data waktu (jam dan tanggal)
Rekursi
Fungsi yang telah dibahas sebelumnya dipanggil dari bagian lain di luar tubuh fungsi yang bersangkutan. Fungsi rekursif adalah suatu fungsi yang memanggil dirinya sendiri, artinya fungsi tersebut dipanggil di dalam tubuh fungsi itu sendiri.
Fungsi faktorial, yang menghitung nilai faktorial dari suatu bilangan bulat positif, merupakan pokok bahasan yang memudahkan pemahaman fungsi rekursif. Berikut adalah fungsi faktorial yang diselesaikan dengan cara biasa:
Int faktorial (int n)
{
Int counter, hasil = 1;
For (counter = n ; counter >= 1 ; counter--)
Hasil *= counter;
Return hasil;
}
Fungsi tersebut menunjukkan bahwa nilai faktorial dihitung menggunakan looping sehingga melakukan proses sebagai berikut:
Hasil = 1;
Hasil = hasil * n; artinya hasil = n;
Hasil =hasil * (n-1) artinya hasil = n x (n-1);
Demikian seterusnya sampai n bernilai 1, atau jika dituliskan sekaligus menjadi:
Faktorial = n! = n x (n-1) x (n-2) .... x 1;
Fungsi ini dapat dituliskan dalam bentuk:
Faktorial (n) = n! = n x (n-1) !;
Yang menunjukan sifat rekursif dari suatu fungsi, yaitu (n-1)!. Oleh karena itu, fungsi faktorial yang telah ditulis dalam program C++ sebelumnya, dapat ditulis kembali dalam bentuk rekursif sebagai berikut:
Int faktorial (int n)
{
If (n == 0)
Return 1;
Else
Return (n * faktorial (n-1));
}
Contoh lain adalah menghitung jumlah dari suatu deret fibonacci, dimana deret tersebut didefinisikan sebagai:
Fibonacci (1) = 1
Fibonacci (2) = 2
Fibonacci (n) = fibonacci (n-1) + fibonacci (n-2)
Sehingga fungsi dalam program C++ dapat dibuat sebagai berikut:
Long fibonacci (long n)
{
If (n == 1 || n == 2)
Return 1;
Else
Return fibonacci (n-1) + fibonacci (n-2);
}
Dari penggalan program rekursi untuk faktorial di bagian atas, hasil selengkapnya dapat dilihat pada keterangan di bawah ini:
Program contoh rekursi untuk faktorial
/*program: fungsi3.cpp*/
#include
Int faktorial (int n)
{
If (n==1)
Return (1);
Else
Return (n*faktorial (n-1));
}
Main ()
{
Int x;
Printf (“mencari nilai faktorial\n”);
Printf (“masukkan nilai x:”) ; scanf (“%d”,&x) ;
Printf (“nilai faktorial dari %d=%d\n”,x,faktorial (x) );
}
Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut:
Mencari nilai faktorial
Masukkan nilai x: 4
Nilai faktorial dari 4=24
Penjelasan:
Fungsi tersebut menunjukkan bahwa nilai faktorial dihitung menggunakan looping sehingga melakukan proses sebagai berikuit:
Faktorial (1) = 1;
Faktorial (2) = 1 * 2=2
Faktorial (3) = 3*faktorial (2)
= 3x2=6
Faktorial (4) = 4*faktorial (3)
=4x6=24
Sedang penggalan program rekursi untuk bilangan fibonacci di bagian atas, hasil selengkapnya dapat dilihat pada keterangan dibawah ini:
Program contoh rekursi untuk fibonacci
/*program: fungsi4 . cpp*/
#include
Long fibonacci (long n)
{
If (n == 1 || n == 2)
Return 1;
Else
Return fibonacii (n-1) + fibonacci (n-2);
}
Main ()
{
Int x;
Printf (“mencari nilai fifonacci\n”);
Printf (“masukkan nilai x:”) ;scanf (“%d”,”&x);
Printf (“nilai fibonacci dari %d=%d\n”,x,fibonacci (x));
}
Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut:
Mencari nilai fibonacci
Masukkan nilai x: 6
Nilai fibonacci dari 6=8
Penjelasan:
Fibonacci (1) = 1
Fibonacci (2) = 1
Fibonacci (3) = fibonacci (3-1) + fibonacci (3-2)
= 1+1 = 2
Fibonacci (4) = fibonacci (4-1) + fibonacci (4-2)
= 2+1 = 3
Fibonacci (5) = fibonacci (5-1) + fibonacci (5-2)
= 3+2 = 5
Fibonacci (6) = fibonacci (6-1) + fibonacci (6-2)
= 5+3= 8

Tidak ada komentar:

Posting Komentar