Senin, 29 Juni 2009

Pengurutan (Sorting)

Pengurutan (Sorting) adalah proses menyusun kembali data yang sebelumnya telah disusun dengan suatu pola tertentu, sehingga tersusun secara teratur menurut aturan tertentu Proses pengurutan data banyak ditemukan di dalam computer. Hal itu karena data yang sudah terurut akan lebih cepat untuk dicari. Untuk membentuk data yang tidak urut menjadi data yang terurut ,terdapat berbagai algoritma yang bisa di gunakan.

Pengurutan data dalam struktur data sangat penting untuk data yang beripe data numerik ataupun karakter. Didalam pengurutan data terdapat istilah dan decending. Accending adalah pengurutan dengan dasar dari nilai kecil menuju ke nilai yang besar “urut naik” sedangkan decending adalah pengurutan yang disusun atas dasar nilai besar ke kecil “urut turun”.

Contoh:

Data Acak : 5 6 8 1 3 25 10

Ascending : 1 3 5 6 8 10 25

Descending : 25 10 8 6 5 3

METODE PENGURUTAN DATA (SORTING)

1. Bubble Sort

Metode bubble sort merupakan metode tersederhana untuk melakukan pengurutan data , tetapi memiliki kinerja yang terburuk untuk data yang besar. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari sebuah gelas bersoda. Bubble Sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya.Penukaran baru dilakukan kalau suatu criteria terpenuhi.

Pengurutan Ascending :Jika elemen sekarang lebih besar dari elemen berikutnya maka kedua elemen tersebut ditukar.Pengurutan Descending: Jika elemen sekarang lebih kecil dari elemen berikutnya, maka kedua elemen tersebut ditukar.Algoritma ini seolah-olah menggeser satu per satu elemen dari kanan ke kiri atau kiri ke kanan, tergantung jenis pengurutannya, asc atau desc.Ketika satu proses telah selesai, maka bubble sort akan mengulangi proses, demikian seterusnya sampai dengan iterasi sebanyak n-1.Bubble sort berhenti jika seluruh array telah diperiksa dan tidak ada pertukaran lagi yang bisa dilakukan, serta tercapai perurutan yang telah diinginkan.

2. Exchange Sort

Metode Exchange Sort merupakan metode pengurutan data yang sangat mirip dengan Bubble Sort bahkan banyak yang mengatakan Bubble Sort sama dengan Exchange Sort. Namun perbedaan antara Exchange Sort dan bubble sort terletak dalam hal bagaimana membandingkan antar elemen-elemennya.

Exchange sort membandingkan suatu elemen dengan elemen-elemen lainnya dalam array tersebut, dan melakukan pertukaran elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen pusat (pivot). Sedangkan Bubble sort akan membandingkan elemen pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian elemen tersebut itu akan menjadi pusat (pivot) untuk dibandingkan dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya.

3. Selection Sort

Metode selection sort merupakan metode pengurutan data kombinasi antara sorting dan searching. Mekanismenya seperti berikut ini : Mula – mula suatu petunjuk (diberi nama posAwal ) yang menunjuk lokasi awal pengurutan data diatur agar berisi indeks pertama dalam larik. Selanjutnya dicari bilangan terkecil ynag terletak antara posisi sesudah yang ditunjuk oleh penunjuk tersebut element yang terakhir dalam larik. Lokasi bilangan ini di tunjuk oleh posMin. Lalu tukarkan nilai bilangan terkecil tersebut dengan nilai yang di tunjukkan posAwal. Proses seperti ini di ulang dari posAwal berniali 0 hingga n-2 , dengan n menyatakan jumlah element larik

4. Insertion Sort

Metode selection sort merupakan metode pengurutan data yang mirip dengan cara orang mengurutkan kartu, selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang seharusnya sehinggan penambhan kartu tersebut akan membuat semua kartu tetap terurutkan.

Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert) diposisi yang seharusnya.Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang

5. Quick Sort

Metode Quick sort merupakan metode pengurutan data yang di kemukakan pertama kali oleh C. AR Hoare pada tahun 1962. Metode ini menggunakan strategi “pecah-belah” dengan mekanisme seperti berikut : Larik L[p..r] dengan indeks terkecil adalah p dan indeks terbesar adalah r disusun ulang (dipartisi) menjadi dua buah larik A[p..p] dan A[q+1…r] sehingga setiap elemen dalam A[p..q] selalu bernilai lebih kecil daripada A[q+1…r]. Selanjutnya kedua larik tersebut di urut secara rekursif. Dengan sendirnya kombinasi kedua larik tersebut membentuk larik dengan data yang telah di urut.

Searching / Pencarian

Nama : I ketut suardana

Nim : 060010165

F081

Prak. Algoritma & Struktur Data II

( Searching / Pencarian )

Algoritma pencarian (searching algorithm) adalah algoritma yang menerima
sebuah argumen kunci dan dengan langkah-langkah tertentu akan mencari rekaman
dengan kunci tersebut. Setelah proses pencarian dilaksanakan, akan diperoleh salah
satu dari dua kemungkinan, yaitu data yang dicari ditemukan (successful) atau tidak
ditemukan (unsuccessful).


Metode pencarian data dapat dilakukan dengan dua cara yaitu pencarian internal
(internal searching) dan pencarian eksternal (external searching). Pada pencarian
internal, semua rekaman yang diketahui berada dalam pengingat komputer sedangakan
pada pencarian eksternal, tidak semua rekaman yang diketahui berada dalam pengingat
komputer, tetapi ada sejumlah rekaman yang tersimpan dalam penyimpan luar misalnya
pita atau cakram magnetis.

Pencaharian (seaching) merupakan tindakan untuk mendapatkan suatu data dalam kumpulan data. Dalam kehidupan sehari-hari sering kita berurusan dengan nomor telepon atau pencaharian suatu istilah dalam kamus. Pada aplikasi computer, pencaharian sering kali dilakukan misalnya untuk mendapat data dari seorang mahasiswa.

Untuk keperluan mencari data, terdapat beragam algoritma pencaharian (search algorithm) . Yang di maksud dengan algoritma percaharian adalah “algoritama yang menerima sebuah arguman ‘a’ dan mencoba untuk menemukan sebuah rekaman yang memiliki kunci ‘a’. Pencaharian dapat dilakukan terhadap data yang secara keseluruhan berada dalam memori computer ataupun yang berada dalam penyimpanan ekternal (hardisk). Pencaharian yang dilakukan terhadapa data yang berada dalam computer di kenal dengan pencaharian internal sedangkan pencaharian yang dilakukan pada media penyimpanan eksternal disebut pencaharian ekternal. Pencaharian internal meliputi Pencaharian sekuensial dan dan pencaharian biner (binary search).



Selain itu metode pencarian data juga dapat dikelompokka menjadi pencarian
statis (static searching) dan pencarian dinamis (dynamic searching). Pada pencarian
statis, banyaknya rekaman yang diketahui dianggap tetap, pada pencarian dinamis,
banyaknya rekaman yang diketahui bisa berubah-ubah yang disebabkan oleh
penambahan atau penghapusan suatu rekaman.


Ada dua macam teknik pencarian yaitu pencarian sekuensial dan pencarian biner.
Perbedaan dari dua teknik ini terletak pada keadaan data. Pencarian sekuensial
digunakan apabila data dalam keadaan acak atau tidak terurut. Sebaliknya, pencarian
biner digunakan pada data yang sudah dalam keadaan urut.




Pencarian Berurutan (Sequential Searching)


Pencarian berurutan sering disebut pencarian linear merupakan metode pencarian
yang paling sederhana. 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.


Pada dasarnya, pencarian ini hanya melakukan pengulangan dari 1 sampai
dengan jumlah data. Pada setiap pengulangan, dibandingkan data ke-i dengan yang
dicari. Apabila sama, berarti data telah ditemukan. Sebaliknya apabila sampai akhir
pengulangan tidak ada data yang sama, berarti data tidak ada. Pada kasus yang paling
buruk, untuk N elemen data harus dilakukan pencarian sebanyak N kali pula.



Algoritma pencarian berurutan dapat dituliskan sebagai berikut :


1 i ← 0
2 ketemu ← false
3 Selama (tidak ketemu) dan (i <= N) kerjakan baris 4 4 Jika (Data[i] = x) maka ketemu ← true,

jika tidak i ← i + 1 5 Jika (ketemu) maka i adalah indeks dari data yang dicari, jika tidak data

tidak ditemukan Di bawah ini merupakan fungsi untuk mencari data menggunakan pencarian

sekuensial. int SequentialSearch(int x) { int i = 0; bool ketemu = false; while ((!ketemu) && (i

< ketemu =" true;" style="font-weight: bold;">Fungsi untuk Mencari Data dengan Metode

Sekuensial
Fungsi diatas akan mengembalikan indeks dari data yang dicari. Apabila data
tidak ditemukan maka fungsi diatas akan mengembalikan nilai –1.




Pencarian Biner (Binary Search)


Salah satu syarat agar pencarian biner dapat dilakukan adalah data sudah dalam
keadaan urut. Dengan kata lain, apabila data belum dalam keadaan urut, pencarian biner
tidak dapat dilakukan. Dalam kehidupan sehari-hari, sebenarnya kita juga sering
menggunakan pencarian biner.

Misalnya saat ingin mencari suatu kata dalam kamus Prinsip dari pencarian biner dapat dijelaskan sebagai berikut :mula-mula diambil posisi awal 0 dan posisi akhir = N - 1, kemudian dicari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2. Kemudian data yang dicari dibandingkan dengan data tengah. Jika lebih kecil, proses dilakukan kembali tetapi posisi akhir dianggap sama dengan posisi tengah –1. Jika lebih besar, porses dilakukan kembali tetapi posisi awal dianggap sama dengan posisi tengah + 1. Demikian seterusnya sampai data tengah
sama dengan yang dicari. Untuk lebih jelasnya perhatikan contoh berikut.

Misalnya ingin mencari data 17 pada sekumpulan data berikut :
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_fsSiHfzu9WpMMaVSM9dUO4iZOYa8jufCnG7nQqO2bqE-IWH5lRHmL3MXxhFQ0QJGOSXx1dG1btLLG_ynhnYKOVitBFuQ39NQc8MQeyRKPblZpQj5SDbRX7R6aaxJJhY4rDIBIqUarzE/s320/1.bmp

Awal tengah akhir
Mula-mula dicari data tengah, dengan rumus (0 + 9) / 2 = 4. Berarti data tengah
adalah data ke-4, yaitu 15. Data yang dicari, yaitu 17, dibandingkan dengan data tengah
ini. Karena 17 > 15, berarti proses dilanjutkan tetapi kali ini posisi awal dianggap sama
dengan posisi tengah + 1 atau 5.



https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0u8Y29mmqgPYamuOLnGOGYhlZhFOY9R74ZJSWrK_hjV5YqhCNGYbrLBzgkI8OPxTN3Mx9D_6iOdHtbIb_Uin9SWZReL8SDKeDHcT2nKGLH3_lTMUNQbjoNxSJo4GulNbJ15QJiVljoyc/s320/2.bmp
Awal tengah akhir
Data tengah yang baru didapat dengan rumus (5 + 9) / 2 = 7. Berarti data tengah
yang baru adalah data ke-7, yaitu 23. Data yang dicari yaitu 17 dibandingkan dengan
data tenah ini. Karena 17 < onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="">

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTg3vc6C3DQyNrdZSmHLWZc5Hh99UPOjIBBGt1heKiAsj-8JhLWrSa8U2kzEdnJvHkb8VQWI1lGSlJY87A5tkcb6B6uARXM29mN8h6N-j0w0OEZaf41R-oZZwb8XdrSt138jjD3PBgpRM/s320/3.bmp

0/s1600-h/3.bmp">

Awal=tengah akhir
Data tengah yang baru didapat dengan rumus (5 + 6) / 2 = 5. Berarti data tengah
yang baru adalah data ke-5, yaitu 17. data yang dicari dibandingkan dengan data tengah
ini dan ternyata sama. Jadi data ditemukan pada indeks ke-5.
Pencarian biner ini akan berakhir jika data ditemukan atau posisi awal lebih besar
daripada posisi akhir. Jika posisi sudah lebih besar daripada posisi akhir berarti data
tidak ditemukan.
Untuk lebih jelasnya perhatikan contoh pencarian data 16 pada data diatas.
Prosesnya hampir sama dengan pencarian data 17. Tetapi setelah posisi awal 5 dan
posisi akhir 6, data tidak ditemukan dan 16 < atau =" 4" awal =" 5."> Data[m]) maka L ← m + 1
9 Jika (ketemu) maka m adalah indeks dari data yang dicari, jika tidak data tidak
ditemukan
Di bawah ini merupakan fungsi untuk mencari data menggunakan pencarian biner.
int BinarySearch(int x)
{
int L = 0, R = Max-1, m;
bool ketemu = false;
while((L <= R) && (!ketemu)) { m = (L + R) / 2; if(Data[m] == x) ketemu = true; else if (x < r =" m" l =" m" style="font-weight: bold;">Fungsi Pencarian Data dengan Metode Biner
Fungsi diatas akan mengembalikan indeks dari data yang dicari. Apabila data
tidak ditemukan maka fungsi diatas akan mengembalikan nilai –1.
Jumlah pembandingan minimum pada pencarian biner adalah 1 kali, yaitu apabila
data yang dicari tepat berada di tengah-tengah. Jumlah pembandingan maksimum yang
dilakukan dengan pencarian biner dapat dicari menggunakan rumus logaritma, yaitu :
C = 2log(N)

Kesimpulan


1. Algoritma pencarian berurutan digunakan untuk mencari data pada sekumpulan data

atau rekaman yang masih acak
2. Algoritma pencarian biner digunakan untuk mencari data pada sekumpulan data atau

rekaman yang sudah dalam keadaan terurut.

Senin, 15 Juni 2009

memahami linked list

Nama : IKetut Suardana
Nim : 060010165
Kls : F081

Linked list (list bertaut) adalah salah satu struktur data dasar yang sangat fundamental dalam bidang ilmu komputer. Dengan menggunakan linked list maka programmer dapat menimpan datanya kapanpun dibutuhkan. Linked list mirip dangan array, kecuali pada linked list data yang ingin disimpan dapat dialokasikan secara dinamis pada saat pengoperasian program (run-time).

Pada array, apabila programmer ingin menyimpan data, programmer diharuskan untuk mendefinisikan besar array terlebih dahulu, seringkali programmer mengalokasikan array yang sangat besar(misal 100). Hal ini tidak efektif karena seringkali yang dipakai tidak sebesar itu. Dan apabila programmer ingin menyimpan data lebih dari seratus data, maka hal itu tidak dapat dimungkinkan karena sifat array yang besarnya statik. Linked list adalah salah satu struktur data yang mampu menutupi kelemahan tersebut.

Secara umum linked list tersusun atas sejumlah bagian-bagian data yang lebih kecil yang terhubung (biasanya melalui pointer). Linked list dapat divisualisasikan seperti kereta, bagian kepala linked list adalah mesin kereta, data yang disimpan adalah gerbong, dan pengait antar gerbong adalah pointer.

Jenis-Jenis Linked List

  • Singly linked list
  • Double linked list
  • Circular Linked List

-------- -------- --------

Mesin Data Data

-------- -------- --------

(kepala) ---> Pointer ---> Pointer --

-------- -------- --------

Cotoh gambar linked list.

  • Linked List adalah salah satu bentuk struktur data, berisi kumpulan data (node) yang tersusun secara sekuensial, saling sambung-menyambung, dinamis dan terbatas.
  • Linked List sering disebut juga Senarai Berantai
  • Linked List saling terhubung dengan bantuan variabel pointer
  • Masing-masing data dalam Linked List disebut dengan node (simpul) yang menempati alokasi memori secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field.

Single Linked List
Merupakan struktur data dinamis yang terdiri dari kumpulan komponen yang disusun secara berurutan dengan menggunakan bantuan pointer. Komponen-komponen tersebut disebut sebagai simpul (node).
Tiap simpul dapat dibagi menjadi dua bagian yaitu
medan informasi/data yang akan diolah dan medan penyambung (link field) yang berisi alamat simpul berikutnya.
Contoh deklarasi
Type
Point = ^RecPoint ;
RecPoint = Record
Nama : string[20] ;
Next : Point ;
End ;
Var
Head, Tail, Now : Point ;

Suatu list harus mempunyai ujung awal (head) dan ujung akhir (tail). Untuk menandai akhir dari suatu list maka diberikan kata cadang NIL pada pointer node terakhir, yang berarti pointer tidak menunjuk kemanapun.

Metode Pembuatan Single Linked List ada dua yaitu secara LIFO (Last In First Out) dan FIFO (First In First Out).

Dengan metode LIFO maka maka node yang pertama dimasukkan akan menjadi node yang terakhir dikeluarkan, atau dengan kata lain terjadi penambahan node diawal list. Adapun prosedur yang digunakan adalah sebagai berikut:

Procedure INSERT(elemen:TipeData) ;
Var Now : Point ;
Begin
New(Now) ;
Now^.Isi := elemen ;
If Head = Nil then
Now^.Next := Nil ;
Else
Now^.Next := Head ;
Head := Now ;
End ;

Double Linked list

Double Linked List adalah suatu linked list yang mempunyai 2 penunjuk yaitu penunjuk ke data sebelumnya dan berikutnya.

Beberapa operasi yang dapat dilakukan dalam double linked list adalah :

1. Pendeklarasian Struktur dan Variabel Double Linked List

Jika dilihat 1 elemen listnya, maka secara umum struktur dari elemen listnya


2. View data

Untuk view data, langkah yang dilakukan adalah dengan menelusuri semua elemen list sampai elemen terakhir. Setelah melakukan penelurusan posisi awal dan akhir elemen tidak boleh berubah sehingga untuk melakukan penelusuran dibutuhkan sebuah variabel bantu.

Kelebihan dari view data pada linked list adalah kita dapat menampilkan data dari data terakhir dengan lebih mudah.

Implementasi program view data dari awal sampai data terakhir yang menggunakan double linked list dengan bahasa C adalah :

void viewdata(pdata awal)

{

pdata p;

p=awal;

printf("Data : ");

while (p!=NULL)

{

printf("%5d",p->info);

p=p->kanan;

}

printf("\n");

}

Sedangkan jika view data dari data terakhir sampai data pertama adalah :

void viewdatareverse(pdata akhir)

{

pdata p;

p=akhir;

printf("Data Terbalik: ");

while (p!=NULL)

{

printf("%5d",p->info);

p=p->kiri;

}

printf("\n");

}

Cara pemanggilannya adalah :

viewdata(awal); // menampilkan data dari data

viewdata(akhir); // menampilkan data dari data terakhir


3. Tambah di awal

Operasi ini berguna untuk menambahkan elemen baru di posisi pertama. Langkah pertama untuk penambahan data adalah pembuatan elemen baru dan pengisian nilai infonya. Pointer yang menunjuk ke data tersebut dipanggil dengan nama baru. Kondisi di setelah ada pembuatan elemen baru tersebut adalah :


Perintah pembuatan elemen double linked list dalam bahasa C adalah :

pdata baru;

baru=(pdata)malloc(sizeof(tdata));

baru->kiri=NULL;

baru->kanan=NULL;

baru->info=data; // data berasal dari parameter fungsi

Ada 2 kondisi yang harus diperhatikan dalam penambahan data di awal yaitu :

a. Ketika linked list masih kosong

Kalau kondisi linked list masih kosong, maka elemen baru akan menjadi awal dan akhir linked list.

Perhatikan gambar di bawah ini :

􀂃 Kondisi sebelum disisipkan

􀂃 Kondisi setelah operasi penambahan

Operasi penambahan awal ketika linked list masih kosong adalah dengan mengisikan alamat pointer baru ke pointer awal dan pointer akhir. Lihat gambar di bawah ini.

4. Tambah di akhir

Operasi ini berguna untuk menambahkan elemen baru di posisi akhir. Langkah pertama untuk penambahan data adalah pembuatan elemen baru dan pengisian nilai infonya.

5. Sisip di tengah

Operasi penyisipan data di tengah linked list adalah suatu operasi menambah data di posisi tertentu di dalam linked list. Contohnya adalah jika ingin menyisipkan data di posisi ke-3 atau ke-4.

Untuk proses tersebut ada 2 hal yang harus diperhatikan yaitu :

a. Kondisi linked list masih kosong atau posisi penyisipan kurang dari atau sama dengan 1

Jika kondisi ini terjadi, maka langkah yang dilakukan adalah sangat mudah yaitu dengan memanggil proses penambahan data awal atau akhir. (untuk lebih jelas lihat penambahan data awal atau akhir ketika kondisi linked list masih kosong).

b. Kondisi linked list sudah mempunyai data

Langkah untuk penyisipan data ketika linked list sudah mempunyai data adalah :

􀂃 Cari posisi pointer pada data ke-posisi sisip.

6. Hapus data awal

Operasi ini berguna untuk menghapus data pada posisi pertama. Ada 3 keadaan yang mungkin terjadi ketika akan melakukan proses hapus yaitu :

a. Kondisi linked list masih kosong

Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.

b. Kondisi linked list hanya memiliki 1 data

Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1 data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir di-NULL-kan.

c. Kondisi linked list memiliki data lebih dari 1 buah

Untuk operasi penghapusan data di posisi pertama pada double linked list yang mempunyai data lebih dari 1 buah adalah :

Simpan pointer yang akan dihapus (awal) ke suatu pointer lain yang diberi nama pointer Bantu

- Pindahkan pointer awal ke data berikutnya (bantu􀃆kanan atau awal􀃆kanan).

- Field kiri dari awal yang baru (awal􀃆kiri) di-NULL-kan.

- Langkah terakhir adalah hapus elemen yang ditunjuk pointer bantu.

7. Hapus data terakhir

Operasi ini berguna untuk menghapus data pada posisi terakhir. Ada 3 keadaan yang mungkin terjadi ketika akan melakukan proses hapus yaitu :

a. Kondisi linked list masih kosong

Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.

b. Kondisi linked list hanya memiliki 1 data

Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1 data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir di-NULL-kan.

8. Hapus data di tengah

Untuk melakukan proses penghapusan di tengah linked list, ada 3 kondisi yang perlu diperhatikan yaitu :

a. Kondisi ketika linked list masih kosong atau ketika posisi hapus lebih kecil dari 1.

Ketika kondisi ini terjadi, maka proses penghapusan tidak bisa dilakukan karena data masih kosong atau karena posisi hapus diluar jangkauan linked list (posisi kurang dari 1).

b. Kondisi ketika posisi hapus sama dengan 1 (hapus data pertama)

Ketika kondisi ini terjadi, maka proses yang dilakukan adalah proses penghapusan di posisi awal (hapusawal).