Posted by: Shabrina Nur Ilmi | May 3, 2009

Object-Oriented Programming dan Procedural Programming

Object-Oriented Programming (OOP – Pemrograman Berorientasi Objek) adalah paradigma pemrograman yang berorientasikan kepada objek. Semua data dan fungsi di dalam paradigma ini dikelompokkan dalam kelas-kelas atau objek-objek. Tiap objek dapat menerima pesan, memproses data, dan mengirim pesan ke objek lainnya.

Dalam OOP, penyelesaian suatu masalah ditekankan pada objek-objek apa saja yang dapat melakukan pemecahan masalah tersebut.Setiap objek pada OOP memiliki deskripsi tugasnya sendiri sehingga untuk memecahkan masalah dibutuhkan kolaborasi antar objek-objek yang bersangkutan.

Procedural Programming (Pemrograman Prosedural) adalah paradigma pemrograman di mana sebuah program dibedakan antara bagian data dengan bagian instruksi. Bagian instruksi terdiri atas runtutan (sequence) instruksi yang dilaksanakan satu per satu secara berurutan oleh pemroses. Alur pelaksanaan instruksi dapat berubah karena adanya pencabangan kondisional. Data yang disimpan di dalam memori dimanipulasi oleh instrusi secara beruntun atau prosedural.

Dalam PP, penyelesaian suatu masalah ditekankan kepada langkah-langkah atau instruksi apa saja yang digunakan dalam menyelesaikan suatu masalah tersebut. Data pada PP bersifat pasif, dengan fungsi dan prosedur digunakan untuk memanipulasi data tersebut.

Fokus dari OOP adalah memecah sebuah program menjadi objek-objek, sedangkan pada PP, sebuah program dipecah menjadi kumpulan variabel, struktur data, dan sub-program yang lebih sederhana.

Perbedaan yang paling mendasar antara OOP dan PP adalah PP menggunakan fungsi dan prosedur untuk memanipulasi sebuah struktur data yang pasif, sedangkan OOP menggabungkan keduanya (fungsi/prosedur dan data) menjadi sebuah objek yang dapat mengoperasikan struktur datanya sendiri.

OOP baik digunakan karena fleksibilitasnya dan kemudahan mengubah program tanpa harus mempengaruhi keseluruhan struktur program. Pemrogram tidak harus benar-benar mengetahui langkah-langkah untuk memroses suatu data, melainkan mengetahui dan memahami objek apa saja yang berkaitan dengan data tersebut. PP memiliki kelebihan dalam pendefinisian langkah-langkah atau instruksi (untuk mencapai status akhir yang diinginkan) dengan jelas. Pendefinisian langkah-langkah yang jelas dapat mempertahankan alur dari program (dari status awal ke status akhir) tetap terstruktur dan teratur, dengan demikian mencegah kemungkinan kode program berubah menjadi spaghetti code.

Posted by: Shabrina Nur Ilmi | March 30, 2009

Breadth First Search dan Depth First Seach

Breadth First Seach

Breadth-first search adalah algoritma yang melakukan pencarian secara melebar yang mengunjungi simpul secara preorder yaitu mengunjungi suatu simpul kemudian mengunjungi semua simpul yang bertetangga dengan simpul tersebut terlebih dahulu. Selanjutnya, simpul yang belum dikunjungi dan bertetangga dengan simpul-simpul yang tadi dikunjungi , demikian seterusnya. Jika graf berbentuk pohon berakar, maka semua simpul pada aras d dikunjungi lebih dahulu sebelum simpul-simpul pad aras d+1.

Algoritma ini memerluka-n sebuah antrian q untuk menyimpan simpul yang telah dikunjungi. Simpul-simpul ini diperlukan sebagai acuan untuk mengunjungi simpul-simpul yang bertetanggaan dengannya. Tiap simpul yang telah dikunjungi masuk ke dalam antrian hanya satu kali. Algoritma ini juga membutuhkan table Boolean untuk menyimpan simpul yang te lah dikunjungi sehingga tidak ada simpul yang dikunjungi lebih dari satu kali.

Pencarian pada BFS dilakukan pada semua node dalam setiap level secara berurutan dari kiri ke kanan. Jika pada satu level belum ditemukan solusi, maka pencarian dilanjutkan pada level berikutnya. Demikian seterusnya sampai ditemukan solusi. Dengan strategi ini, maka dapat dijamin bahwa solusi yang ditemukan adalah yang paling baik ( Optimal). Tetapi BFS harus menyimpan semua node yang pernah dibangkitkan. Hal ini harus dilakukan untuk penelusuran balik jika solusi sudah ditemukan.

Inisialisasi : 0 = {S}
While 0 ? empty
Tarik 1, elemen pertama di 0
If 1 = Goal
Sukses dan keluar
Else
Node_anak = ekspansi (1)
Eliminasi node anak yang loop
Anak yang tersisa di belakang 0
End
Continue

Analisis Breadth First Search :
> Completeness – Iya jika cabang maximum terhingga
> Time Complexity – 1+b1+b2+b3+…..+bd+b(bd-1) = O(bd) dengan d eksponensial
> Space Complexity O(bd) menyimpan semua node di memori
> Optimalty – Iya jika cost per langkah = 1

Depth First Seach

Depth-first search (DFS) melakukan pencarian secara preorder. Mengunjungi anak suatu simpul sebelum simpul tetangganya. Pencarian dilakukan pada satu node dalam setiap level dari yang paling kiri. Jika pada level yang paling dalam, solusi belum ditemukan, maka pencarian dilanjutkan pada node sebelah kanan. Node yang kiri dapat dihapus dari memori. Jika pada level yang paling dalam tidak ditemukan solusi, maka pencarian dilanjutkan pada level sebelumnya. Demikian seterusnya sampai ditemukan solusi. Jika solusi ditemukan maka tidak diperlukan proses backtracking (penelusuran balik untuk mendapatkan jalur yang dinginkan).

Kelebihan DFS – pemakaian memori hanya sedikit, berbeda jauh dengan BFS yang harus menyimpan semua node yang pernah dibangkitkan. Jika solusi yang dicari berada pada level yang dalam dan paling kiri, maka DFS akan menemukannya secara cepat.

Kelemahan DFS – jika pohon yang dibangkitkan mempunyai level yang dalam (tak terhingga), maka tidak ada jaminan untuk menemukan solusi (Tidak Complete). Jika terdapat lebih dari satu solusi yang sama tetapi berada pada level yang berbeda, maka pada DFS tidak ada jaminan untuk menemukan solusi yang paling baik (Tidak Optimal).

Inisialisasi : 0 = {S}
While 0 ? empty
Tarik 1, elemen pertama di 0
If 1 = Goal
Sukses dan keluar
Else
Node_anak = ekspansi (1)
Eliminasi node anak yang loop
Anak yang tersisa depan 0
End
Continue

Analisis Breadth First Search :
> Completeness – Tidak jika cabang tak terhingga, iya jika ada pembatasan
> Time Complexity – O(bm), akan sangat buruk jikan m jauh lebih besar dari d.
> Space Complexity – O(bm) linear
> Optimalty – Tidak

Sumber:
- Laporan ‘Pencarian Jalur Dengan Breadth First Search dan Depth First Search’, STT Telkom 2002 -
- Makalah ‘Penerapan Algoritma Breadth-First Search dan Depth-First Search pada FTP Search Engine for ITB Network’, ITB -

Posted by: Shabrina Nur Ilmi | March 30, 2009

Floyd-Warshall Algorithm

Algoritma Floyd-Warshall adalah salah satu varian dari pemrograman dinamis, yaitu suatu metode yang melakukan pemecahan masalah dengan memandang solusi yang akan diperoleh sebagai suatu keputusan yang saling terkait. Artinya solusi-solusi tersebut dibentuk dari solusi yang berasal dari tahap sebelumnya dan ada kemungkinan solusi lebih dari satu.

Hal yang membedakan pencarian solusi menggunakan pemrograman dinamis dengan algoritma greedy adalah bahwa keputusan yang diambil pada tiap tahap pada algoritma greedy hanya berdasarkan pada informasi yang terbatas sehingga nilai optimum yang diperoleh pada saat itu Jadi pada algoritma greedy, kita tidak memikirkan konsekuensi yang akan terjadi seandainya kita memilih suatu keputusan pada suatu tahap.

Algoritma ini memiliki input graf berarah dan berbobot (V,E), yang berupa daftar titik (node/vertex V) dan daftar sisi (edge E). Jumlah bobot sisi-sisi pada sebuah jalur adalah bobot jalur tersebut. Sisi pada E diperbolehkan memiliki bobot negatif, akan tetapi tidak diperbolehkan bagi graf ini untuk memiliki siklus dengan bobot negatif. Algoritma ini menghitung bobot terkecil dari semua jalur yang menghubungkan sebuah pasangan titik, dan melakukannya sekaligus untuk semua pasangan titik. Algoritma ini berjalan dengan waktu Θ(|V|3).

Implementasi dalam pseudo-code:

function fw(int[1..n,1..n] graph) {
// Inisialisasi

var int[1..n,1..n] jarak := graph
var int[1..n,1..n] sebelum
for i from 1 to n
for j from 1 to n
if jarak[i,j] < Tak-hingga
sebelum[i,j] := i
// Perulangan utama pada algoritma

for k from 1 to n
for i from 1 to n
for j from 1 to n
if jarak[i,j] > jarak[i,k] + jarak[k,j]
jarak[i,j] = jarak[i,k] + jarak[k,j]
sebelum[i,j] = sebelum[k,j]
return jarak
}

- Wikipedia Indonesia dan sumber lain -

Posted by: Shabrina Nur Ilmi | March 30, 2009

Dijkstra Algorithm

Algoritma Dijkstra, dinamai menurut penemunya, Edsger Dijkstra, adalah sebuah algoritma greedy dalam memecahkan permasalahan jarak terpendek (shortest path problem) untuk sebuah graf berarah (directed graph) dengan bobot-bobot sisi (edge weights) yang bernilai tak-negatif. Misalnya, bila verteks-verteks dari sebuah graf melambangkan kota-kota dan bobot sisi (edge weights) melambangkan jarak antara kota-kota tersebut, maka algoritma Dijkstra dapat digunakan untuk menemukan jarak terpendek antara dua kota.

Input algoritma ini adalah sebuah graf berarah yang berbobot (weighted directed graph) G dan sebuah sumber verteks s dalam G dan V adalah himpunan semua verteks-verteks dalam graph G. Setiap sisi dari graf ini adalah pasangan verteks-verteks (u,v) yang melambangkan hubungan dari verteks u ke verteks v. Himpunan semua tepi disebut E.

Bobot (weights) dari semua sisi dihitung dengan fungsi:

w: E → [0, ∞)

Ongkos (cost) dari sebuah sisi dapat dianggap sebagai jarak antara dua verteks, yaitu jumlah jarak semua sisi dalam jalur tersebut. Untuk sepasang verteks s dan t dalam V, algoritma ini menghitung jarak terpendek dari s ke t.

Pseudocode:

1 function Dijkstra(G, w, s)
2 for each vertex v in V[G] // Initializations
3 d[v] := infinity
4 previous[v] := undefined
5 d[s] := 0 // Distance from s to s
6 S := empty set
7 Q := V[G] // Set of all vertices

8 while Q is not an empty set // The algorithm itself
9 u := Extract_Min(Q)
10 S := S union {u}
11 for each edge (u,v) outgoing from u
12 if d[u] + w(u,v) < d[v] // Relax (u,v)

13 d[v] := d[u] + w(u,v)
14 previous[v] := u

- Wikipedia Indonesia -

Posted by: Shabrina Nur Ilmi | March 30, 2009

Bellman-Ford Algorithm

Algoritma Bellman-Ford menghitung jarak terpendek (dari satu sumber) pada sebuah digraf berbobot. Maksudnya dari satu sumber ialah bahwa ia menghitung semua jarak terpendek yang berawal dari satu titik node. Algoritma Dijkstra dapat lebih cepat mencari hal yang sama dengan syarat tidak ada sisi (edge) yang berbobot negatif. Maka Algoritma Bellman-Ford hanya digunakan jika ada sisi berbobot negatif.

Algoritma Bellman-Ford menggunakan waktu sebesar O(V.E), di mana V dan E adalah banyaknya sisi dan titik.

Dalam konteks ini, bobot ekivalen dengan jarak dalam sebuah sisi.

Contoh algoritma:

// Definisi tipe data dalam graf
record titik {
list sisi2
real jarak
titik sebelum
}

record sisi {
titik dari
titik ke
real bobot
}

function BellmanFord(list semuatitik, list semuasisi, titik dari)
// Argumennya ialah graf, dengan bentuk daftar titik

// and sisi. Algoritma ini mengubah titik-titik dalam
// semuatitik sehingga atribut jarak dan sebelum
// menyimpan jarak terpendek.

// Persiapan

for each titik v in semuatitik:
if v is dari then v.jarak = 0
else v.jarak := tak-hingga

v.sebelum := null

// Perulangan relaksasi sisi
for i from 1 to size(semuatitik):
for each sisi uv in semuasisi:
u := uv.dari
v := uv.ke // uv adalah sisi dari u ke v

if v.jarak > u.jarak + uv.bobot
v.jarak := u.jarak + uv.bobot
v.sebelum := u

// Cari sirkuit berbobot(jarak) negatif
for each sisi uv in semuasisi:
u := uv.dari
v := uv.ke
if v.jarak > u.jarak + uv.bobot
error “Graph mengandung siklus berbobot total negatif”

- Wikipedia Indonesia -

Posted by: Shabrina Nur Ilmi | March 15, 2009

Permasalahan 2 : Eight Queens Puzzle

Persoalan:
8 ratu diletakkan di papan catur. Letak masing-masing ratu harus sedemikian rupa sehingga tidak ada ratu yang saling menyerang.

Penyelesaian:
1 – Tentukan sisa hasil bagi dari n ratu dengan 8 (sisa dilambangkan dengan s); n ratu = 8; 8 mod 12 = 8, maka s = 8.
2 – Tuliskan angka-angka genap dimulai dari 2 sampai n, dengan syarat jika s = 3 atau s = 8, maka 2 pindah ke akhir barisan; s = 8, maka 2 tidak pindah, sehingga barisan : 2 4 6 8.
3 – Tuliskan angka ganjil dimulai dari 1 sampai n, dengan syarat jika s = 8 maka posisi tiap angka ganjil berindeks ganjil ditukar dengan tiap angka ganjil berindeks genap di belakangnya; barisan : 1 3 5 7. Karena s = 8, maka barisan : 3 1 7 5.
4 – Gabungkan barisan genap dan barisan ganjil; barisan akhir : 2 4 6 8 3 1 7 5.
5 – Barisan di atas merupakan indeks baris untuk tiap ratu. Pasangkan indeks baris tersebut dengan indeks kolom : A B C D E F G H, sehingga didapatkan koordinat tiap ratu:
- Ratu 1 : [2,A]
- Ratu 2 : [4,B]
- Ratu 3 : [6,C]
- Ratu 4 : [8,D]
- Ratu 5 : [3,E]
- Ratu 6 : [1,F]
- Ratu 7 : [7,G]
- Ratu 8 : [5,H]

6 – Letakkan kedelapan ratu pada koordinat masing-masing:

eight-queens-solution1

Catatan: Solusi berlaku untuk n>=4 atau n=1.

-sumber: Wikipedia.Org-

Posted by: Shabrina Nur Ilmi | March 15, 2009

Permasalahan 3 : Mengurutkan Kartu

Persoalan:
52 kartu (13 heart, 13 diamond, 13 club, 13 spade) tidak berurutan.

Penyelesaian:
1 – Sediakan 4 kolom untuk masing-masing gambar (heart, diamond, club, spade),
2 – Bagi 52 kartu ke keempat kolom tersebut, dengan ketentuan:
- Jika gambar kartu = ‘heart’, maka kartu masuk ke kolom ‘heart’.
- Jika gambar kartu = ‘diamond’, maka kartu masuk ke kolom ‘diamond’.
- Jika gambar kartu = ‘club’, maka kartu masuk ke kolom ‘club’.
- Jika gambar kartu = ’spade’, maka kartu masuk ke kolom ’spade’.

3 – Ulangi pembagian sampai 52 kartu terbagi rata di 4 kolom; 52 div 4 = 13; maka masing-masing kolom berisi 13 kartu bergambar sama.
4 – Sebelum pengurutan, berikan nomor untuk 4 jenis kartu berikut:
- ‘As’ <– 1
- ‘Jack’ <– 11
- ‘Queen’ <– 12
- ‘King’ <– 13

5 – Urutkan 13 kartu pada kolom dari nomor terkecil sampai nomor terbesar,
6 – Lakukan pengurutan sampai keempat kolom masing-masing berisi kartu dengan nomor terurut,
7 – Satukan kembali keempat kolom dalam satu tumpukan.

Posted by: Shabrina Nur Ilmi | March 15, 2009

Permasalahan 1 : 3 Iblis 3 Pendeta

Persoalan:
3 iblis dan 3 pendeta hendak menyeberang dari pulau 1 ke pulau 2 dengan perahu. Perahu maksimal hanya bisa dinaiki 2 orang. Jumlah pendeta di satu tempat tidak boleh lebih kecil dari jumlah iblis.

Penyelesaian:
Solusi dari persoalan di atas dapat dilihat dalam diagram berikut (perhatikan bahwa jumlah pendeta (o) di satu tempat selalu lebih besar daripada jumlah iblis (x)):

iblis-pendeta-solusi

Posted by: Shabrina Nur Ilmi | February 28, 2009

Tugas PTI 2 (Maaf, Ga Bisa Nyari Judul yang Lebih Bagus)

Teknologi di Indonesia?

Menurut saya, teknologi di Indonesia masih sangat rendah. Indonesia masih lebih banyak mengimpor daripada mengekspor ciptaan sendiri. Produk lokal pun kualitasnya masih sangat jauh dibanding produk luar. Selain itu, tenaga ahli di Indonesia masih sangat sedikit sekali (hehe). Jadi mungkin istilahnya, yang lain sudah berjalan setengah berlari, Indonesia masih merangkak setengah berjalan.

Jalur karir yang menjanjikan untuk 5-10 tahun mendatang?

Dari yang saya dengar dari sepupu-sepupu dan paman-paman saya yang sudah bekerja, sebagian besar perusahaan-perusahaan sudah mulai melirik bidang IT, soalnya perkembangan teknologi sedang pesat-pesatnya dan jelas Indonesia tidak mau kalah. Makanya Saudara-Saudara! Tetaplah berpegang teguh pada jalur IT Anda! (halah) Tapi untuk itu semua tentunya skill dan pengetahuan harus mengimbangi, agar para orang IT di Indonesia tidak berakhir mengenaskan sebagai end-user saja.

Apa SWOT Anda?

Kelebihan saya mungkin kreativitas. Saya orangnya sangat kreatif… pandai mengarang jawaban dan merangkai kata-kata (memangnya lomba puisi?). Selain itu saya juga serius dalam mendalami bidang-bidang yang saya minati (kalau nggak minat sih lain lagi ceritanya). Saya juga cepat belajar, terutama dalam bidang bahasa (meskipun rada-rada nggak nyambung sama bidang IT).

Kekurangan saya… saya orangnya tidak sabaran, dan juga suka menunda-nunda pekerjaan. Mungkin masih sangat banyak sekali -_- , tapi yang paling kelihatan ya yang dua itu.

Mengenai kesempatan, hmm… kalau mengenai kesempatan kerja, saya belum terlalu berpikir ke sana, karena pola pikir saya tidak berorientasi pada karir. Yang penting sekarang banyak memperdalam keahlian dan wawasan dulu.

Kalau mengenai T (Threat – ancaman?), saya tidak merasa terancam oleh siapapun tuh, hehe. Masing-masing orang sudah punya jatah rezekinya masing-masing, tinggal bagaimana cara mereka menemukan dan mengolah lahan rezekinya tersebut. Lagipula kalau memang yakin mampu, kenapa harus merasa terancam?

Strategi besar?

Mungkin niat, hehehe… niat itu sudah menjadi senjata utama. Trus mencoba dan berusaha semampunya, lalu tawakal. Tipikal, memang, tapi manjur buat saya.

Posted by: Shabrina Nur Ilmi | February 22, 2009

Takedown; Gambaran Mengenai Dampak Cyber Crime

Film layar lebar ‘Takedown’ (2006) diangkat dari sebuah novel karangan Tsutomu Shimomura, yang didasarkan dari kisah nyata mengenai sepak terjang seorang cracker bernama Kevin Mitnick. Film ini mencantumkan beberapa gambaran akan dampak cyber crime terhadap kehidupan.

Dampak yang dapat dilihat antara lain adalah bahwa kegiatan cyber crime dapat menimbulkan kerugian finansial besar bagi perusahaan-perusahaan yang menjadi sasaran. Data-data penting dapat dengan mudahnya dicuri oleh orang-orang yang tidak bertanggung jawab.

Dari film tersebut, kita juga dapat melihat perbedaan besar antara hacker dan cracker. Hacker umumnya menerobos suatu pertahanan jaringan hanya untuk membuktikan kemampuannya, sedangkan cracker menerobos suatu pertahanan jaringan untuk mencuri data atau merusak sistem tersebut.

Film lain mengenai cyber crime adalah ‘Untraceable’ (2008), yang mengisahkan tentang seorang agen yang berusaha melacak seorang pembunuh berantai merangkap psikopat yang memanfaatkan internet untuk menampilkan sesi penyiksaan korban-korbannya.

Categories