Professional Documents
Culture Documents
STRUKTUR DATA
Disusun Oleh :
Tetra Octaria Saputri
Kelas : 3c
Syukur Alhamdullilah penulis panjatkan kehadirat Allah SWT. Atas rahmat dan
hidayahnya sehingga makalah ini dapaat diselesaikan dengan baik. Padaa kesempataan
ini tidak lupa, penulis mengucapakan terima kasih kepaadaa semua pihak yang telah
membantu penyelesaian makalah ini diantaranya :
1. Istakhori selaku Asisten dosen struktur data.
2. Orang tua yang memberikan dorongan dan dukungan baik dorongan moril
maupun materil kepada penulis.
3. Teman-teman yang telah memberikan dorongan dan kerjasamanya secara
langsung maupun tidak langsung.
Penulis sangat menyadari bahwa sesungguhnya dalam makalah ini masih banyak
sekali kekurangan baik dari segi bahasa maupun dalam system pembuatan makalah. Oleh
karena itu penulis sangat mengharapkan kritik dan saran dari pembaca guna
menyempurnakan makalah-makalah dimasa akan datang.
Demikian penyusunan makalah Ini, penulis sangat berharap semoga makalah ini dapat
bermanfaat bagi penulis maupun bagi para pembaca.
BAB I
B-TREE
Pendahuluan
Struktur pohon menunjang berbagai operasi dinamik dasar termasuk search,
predecessor, successor, minimum, maximum, insert, dan delete dalam proporsional waktu
terhadap ketinggian pohon. Idealnya, sebuah pohon seimbang dan ketinggiannya adalah
log n di mana adalah jumlah simpul pohon. Untuk memastikan ketinggian pohon sekecil
mungkin dan menghasilkan waktu yang terbaik, maka struktur pohon seimbang seperti B-
tree sebaiknya digunakan.
1. Pengertian
B-tree adalah struktur data pohon yang paling umum digunakan dalam basis data
dan file system. B-tree menjaga data tetap terurut dan seimbang. Ide di balik B-tree ini
yaitu simpul internal dapat memiliki sejumlah simpul anak dalam cakupan (range) yang
telah terdefinisi. Ketika data disisipkan atau dipidah dari struktur data, sejumlah simpul
anak dapat bertukar sepanjang simpul. Untuk tetap mempertahankan cakupan yang telah
didefinisikan, simpul internal digabungkan atau dipisahkan. Karena adanya cakupan
(range) pada simpul anak, maka B-tree tidak perlu diseimbangkan secara berkala seperti
struktur data pohon seimbang yang lain, misalnya self-balancing binary search trees.
Akan tetapi, B-tree dapat menghabiskan tempat karena simpul tidak selalu penuh. Batas
atas dan batas bawah jumlah simpul anak biasanya tetap untuk implementasi tertentu.
Sebagai contoh, dalam 2-3 B-tree (disebut juga 2-3 tree), setiap simpul internal hanya
dapat memiliki 2 atau 3 simpul anak.
Sebuah B-tree dijaga keseimbangannya dengan membuat semua simpul daun
berada pada ketinggian yang sama. Ketinggian ini akan meningkat perlahan saat elemen-
elemen ditambahkan pada pohon, tetapi peningkatan ketinggian secara keseluruhan
jarang terjadi. Hal disebabkan karena sebuah B-tree didesain dapat memiliki cabang
dalam jumlah besar dan mengandung sejumlah kunci pada tiap simpulnya sehingga
ketinggian pohon relatif kecil. Hal ini berarti hanya sedikit simpul yang harus dibaca dari
disk untuk mengambil data.Tujuannya yaitu untuk mendapatkan akses pada data yang
cepat.
1.1 Sejarah B-Tree
Bukti : h
n≥ 1+(t-1) ∑ 2t k-1
k=1
= 1+2 (t-1) th-1
t-1
= 2 th-1
jadi = n+1 ≥ th
2
Lalu kedua sisi di-logaritma.
Tinggi dari kasus terburuk adalah O(logn). Karena percabangan dari B-tree bisa
lebih besar dibandingkan struktur pohon seimbang yang lain, basis dari logaritma
cenderung lebih besar. Sehingga jumlah simpul yang dikunjungi selama pencarian
cenderung lebih kecil dari yang dibutuhkan oleh struktur pohon yang lain.Walaupun hal
ini tidak mempengaruhi tinggi asimtotik kasus terburuk, B-tree cenderung memiliki
tinggi yang lebih kecil dari pohon lain yang memiliki tinggi asimtotik yang sama.
2.3 Waktu Proses pada B-Tree
Sebuah B-tree dengan ketinggian n+1 dapat menghabiskan U waktu sebanyak
jumlah nilai pada B-tree dengan ketinggian n, tetapi waktu yang dibutuhkan untuk
melakukan operasi search, insert, dan delete bertambah sesuai ketinggian pohon.
Dibandingkan dengan pohon seimbang lain, pertambahan pada B-tree leih lambat
dibandingakan jumlah elemen.
Karena setiap simpul cenderung memiliki faktor percabangan yang besar
(jumlah anak yang besar), maka perlu untuk menelusuri beberapa simpul sebelum
menempatkan kunci yang diinginkan. Jika akses ke setiap simpul memerlukan disk
access, maka sebuah B-tree akan meminimumkan jumlah akses disk yang dibutuhkan.
Faktor minimalisasi biasanya dipilih agar ukuran total setiap simpul berkorespondensi
pada sebuah ukuran blok yang banyak pada sebuah alat penyimpanan. Pilihan ini
memudahkan dan mengoptimumkan akses disk. Oleh karena itu, sebuah B-tree adalah
struktur data yang ideal untuk situasi di mana data tidak dapat disimpan pada tempat
penyimpanan primer dan akses pada tempat penyimpanan sekunder membutuhkan
banyak waktu. Waktu pencarian kasus terburuk pada derajat n-kunci B-tree adalah
O(log(n)). Sebuah simpul pada pohon B-tree memiliki t-1 <= K <= 2t-1 kunci yang
terurut. Kasus terburuk :
- K = t-1 untuk semua simpul
- X tidak ada pada pohon
Diberikan sebuah simpul W dala pohon T. Berapa lama waktu yang dibutuhkan untuk
mencari subpohon dari W yang mengandung X ? Dengan mengguanakan binary search
dibutuhkan.
3 Algoritma B-Tree
Algoritma untuk operasi search, create, dan insert ditunjukkan di bawah. Perlu
diperhatikan bahwa algoritma-algoritma ini hanya sekali pass. Dengan kata lain,
algoritma tersebut tidak menelusuri pohon kembali. Karena B-tree berusaha melakukan
akses disk seminimum mungkin dan simpul-simpul biasanya disimpan pada disk, pass
sekali ini akan mengurangi jumlah kunjungan pada simpul dan jumlah akses disk. Dua
kali pass yang lebih sederhana pada pohon untuk mempesbaiki pelanggaran mungkin
terjadi. Karena semua simpul diasumsikan disimpan pada tempat penyimpanan sekunder
(disk) daripada tempat peyimpanan primer (memori), semua referensi pada simpul yang
diberikan sebelumnya dengan melakukan operasi read dilambangkan dengan Disk-Read.
Sama halnya, apabila sebuah simpul dimodifikasi dan tidak lagi diperlukan, simpul harus
eitulis pada tempat penyimpanan sekunder dengan operasi write dilambangkan dengan
Disk-Write. Algoritma-algoritma di bawah diasumsikan bahwa semua simpul yang
memiliki parameter telah memiliki operasi Disk-Read yang sesuai. Simpul baru\ dibuat
dan di-assign dengan fungsi Allocate-Node. Implementasi secara detail dari Disk-Read,
Disk-Write, dan AllocateNode tergantung pada sistem operasi (operating system).
3.1 Search
Operasi search pada B-tree mirip dengan search pada binary tree. Dimulai dari
akar, pohon ditelusuri dari atas sampai kebawah, memilih pointer anak yang nilainya
berada pada sisi nilai yang dicari. Binary search umum digunakan (tidak selalu) di antara
simpul untuk menemukan nilai yang berbeda dan anak pohon yang dicari. Akan tetapi,
daripada memilih diantara anak kiri dan anak kanan pada Btree, sebuah search pada B-
tree harus membuat pilihan sebanyak n cara. Anak yang sesuai dipilih dengan melakukan
pencarian linier pada nilai-nilai dalam simpul. Setelah menemukan nilai lebih besar atau
sama dengan nilai yang diinginkan, pencarian pointer anak di sebelah kiri segera
dilakukan. Jika semua nilai yang dicari lebih kecil dari nilai yang diinginkan, pencarian
dilakukan pada pointer anak paling kanan. Tetntu saja pencarian dapat terhenti apabila
simpul yang diinginkan telah ditemukan. Karena waktu yang dibutuhkan untuk
melakukan search tergantung pada tinggi pohon, maka proses search pada B-Tree adalah
O(log n). Berikut ini adalah pseudocodes proses search pada B-tree.
B-Tree-Search (x,k)
i <- 1
while (i<=n[x] and k>keyi[x])
do
i <- i + 1
if (i<=n[x] and k=keyi[x]) then
return (x, i)
if (leaf[x]) then
return NIL
else
Disk-Read(ci[x])
return B-Tree-Search(ci[x], k)
Contoh search pada B-tree Sebagai contoh, di bawah adalah B-tree dengan orde 2 (simpul
paling sedikit memiliki 2 kunci dan 3 pointer anak). Simpul dibatasi dengan kurung siku.
Kunci adalah nama kota dan terurut pada setiap simpul. Pada sisi lain dari setiap kunci
adalah pointer anak yang menghubungkan kunci pada simpul berikutnya.
Untuk menemukan kunci “Dallas”, kita mulai pencarian dari akar simpul paling
atas. “Dallas” tidak berada simpul , tetapi terurut di antara “Chicago” dan “Hoboken” jadi
kita menelusuri pointer anak yang di tengah. Sekali lagi “Dallas: tidak ada dalm simpul
tetapi terurut sebelum “Denver”, jadi kita menelusuri pointer anak yang pertama menuju
ke simpul berikutnya yang ditandai dengan “X”. Pada akhirnya kita akan menemukan
kunci yang dicari ataupun menemukan simpul daun pada tingkat bawah dari Btree tanpa
pointer anak menuju simpul bawah lain dan tanpa kunci yang kita inginkan, menandakan
bahwa kunci yang dicari tidak ada dalam B-tree.
3.2 Insertion
Untuk melakukan insertion pada sebuah B-tree, simpul yang tepat untuk kunci
harus dicari menggunakan algoritma yang sama seperti search pada B-tree. Berikutnya,
kunci disisipkan pada simpul.
Semua proses insertion terjadi pada simpul daun.
- Dengan melakukan pencarian pada pohon, temukan simpul daun di mana elemen
baru seharusnya berada. Jika simpul daun mengandung lebih sedikit dari nilai
maksimum jumlah elemen legal, maka ada tempat kosong. Sisipkan elemen baru
pada simpul, tetap jaga keterurutan elemen simpul.
- Selainnya apabila simpul penuh, simpul daun harus dipisah menjadi dua simpul.
Karena pemisahan simpul menghasilkan pemindahan sebuah kunci ke simpul
orang tuanya, simpul tersebut tidak boleh penuh atau operasi pemisahan
dilakukan kembali. Proses ini dapat berulang sepanjangperjalanan menuju akar
dan memungkinkan pemisahan simpul akar. Hal ini memerlukan dua kali pass.
Pas pertama mencari simpul di mana kunci harus diletakkan, yang kedua
melakukan pemisahan yang diperlukan pada simpul-simpul
sebelumnya.Pemisahan simpul akar ditangani sebagai kasus khusus karena simpul
baru harus dibuat untuk menampung kunci tengah dari simpul lama.
Pemisahan dilakukan sebagai berikut :
median dipilih di antara elemen daun dan elemen baru. Nilai yang lebih kecil dari median
diletakkan di simpul kiri yang baru dan nilai yang lebih besar dari median diletakkan di
simpul kanan yang baru, dengan median sebagai nilai pemisah. Nilai pemisah tersebut
ditambahkan pada simpul orang tuanya, yang dapat mnyebabkan adanya pemisahan lagi,
dst. Maksimum jmlah elemen setiap simpul adalah U-1. Ketika sebuah simpul dipisah,
satu elemen pindah ke simpul orangtuanya, tetapi
elemen lain ditambahkan. Jadi mungkin untuk membagi jmlah maksimum U-1 elemen
menjadi dua simpul legal. Jika jumlahnya ganjil maka U = 2L dan setiap simpul baru
mengandung (U-2)/2 = L-1 elemen dan kemudian menjadi simpul legal. Jika jumlahnya
genap maka U = 2L- 1, sehingga ada 2L-2 elemen pada simpul. Setengah dari jumlah
tersebut adalah L-1, merupakan jumlah elemen minimum pada
setiap simpul. Karena setiap akses pada simpul berhubungan dengan akses disk,
diusahakan menghindari pass kedua dengan memastikan bahwa simpul orang tuanya
tidak pernah penuh. Untuk memenuhi hal tersebut, algoritma yang telah dijelaskan
memisahkan setiap simpul penuh yang ditemukan ketika menelusuri pohon. Walaupan
hal ini mengakibatkan operasi pemisahan yang teidak diperlukan, hal ini menjamin setiap
simpul orang tua tidak pernah perlu dipisahkan dan menghapus kebutuhan pass kedua
pada pohon. Proses pemisahan berjalan dalam waktu yang linear sehingga mempengaruhi
pada O(t logt n) pada waktu pelaksanaan insert pada Btree. Berikut ini adalah
pseudocodes proses insert dan split pada B-tree.
• B-Tree-Insert(T,k)
r <- root[T]
if (n[r] = 2t–1)then
s <- Allocate-Node()
root[T] <- s
leaf[s] <- FALSE
n[s] <- 0
c1 <- r
B-Tree-SplitChild(s,1,r)
B-Tree-InsertNonfull(s,k)
else
B-Tree-InsertNonfull(r,k)
• B-Tree-Insert-Nonfull(T,k)
i <- n[x]
if (leaf[x])then
while (i>=1 and k<keyi[x])do
keyi+1[x] <- keyi[x]
i <- i - 1
keyi+1[x] <- k
n[x] <- n[x] + 1
Disk-Write(x)
else
while (i>=1 and k<keyi[x])do
i <- i - 1
i <- i + 1
Disk-Read(ci[x])
if (n[ci[x]] = 2t-1)then
B-Tree-SplitChild(x,i,ci[x])
if (k>keyi[x])then
i <- i + 1
B-Tree-InsertNonfull(ci[x],k)
• B-Tree-Split-Child(x,i,y)
z <- Allocate-Node()
leaf[z] <- leaf[y]
n[z] <- t-1
for j<-1 to t-1 do
keyj[z] <- keyj+t[y]
if not leaf[y]then
for j<-1 to t do
cj[z] <- cj+t[y]
n[y] <- t-1
for j<-n[x]+1 downto i+1 do
cj+1[x] <- cj[x]
ci+1 <- z
for j <- n[x] downto i do
keyj+1[x] <- keyj[x]
keyi[x] <- keyt[y]
n[x] <- n[x] + 1
Disk-Write(y)
Disk-Write(z)
Disk-Write(x)
5. Pengertian Searching
Searching adalah pencarian data dengan menelusuri tempat pencarian data tersebut.
Tempat pencarian data tersebut dapat berupa array dalam memori, bias juga pada
file pada external storage. Pada suatu data seringkali dibutuhkan pembacaan
kembali informasi (retrieval information) dengan cara searching.
#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
int data[8] = {8,10,6,-2,11,7,1,100};
int cari;
int flag=0;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
for(int i=0;i<8;i++){
if(data[i] == cari) flag=1;
}
if(flag==1) printf("Data ada!\n");
else printf("Data tidak ada!\n");
o Binary Search adalah teknik pencarian data dalam dengan cara membagi
data menjadi dua bagian setiap kali terjadi proses pengurutan. Data yang ada
harus diurutkan terlebih dahulu berdasarkan suatu urutan tertentu yang
dijadikan kunci pencarian.
o Interpolation Search, teknik ini dilakukan pada data yang sudah terurut
berdasarkan kunci tertentu. Teknik searching ini dilakukan dengan perkiraan
letak data.
Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku telepon,
misal yang berawalan dengan huruf T, maka kita tidak akan mencarinya dari
awal buku, tapi kita langsung membukanya pada 2/3 atau ¾ dari tebal buku.
Jadi kita mencari data secara relatif terhadap jumlah data.
Rumus posisi relatif kunci pencarian dihitung dengan rumus:
Contoh program :
BAB III
SORTING
6. Sorting
Pengurutan (Sorting) adalah proses menyusun kembali data yang sebelumnya telah
disusun dengan suatu pola tertentu, sehingga tersusun secara teratur menurut aturan
tertentu.Pengurutan data dalam struktur data sangat penting untuk data yang bertipe data
numerik ataupun karakter. Pengurutan dapat dilakukan secara ascending dan descending.
Buble Sort merupakan metode sorting termudah. 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. Algoritma ini
seolah-olah menggeser satu per satu elemen dari kanan ke kiri atau kiri ke kanan,
tergantung jenis pengurutannya.
Ketika satu proses telah selesai, maka bubble sort akan mengulangi proses,
demikian seterusnya. Bubble sort berhenti jika seluruh array telah diperiksa dan tidak ada
pertukaran lagi yang bisa dilakukan, serta tercapai perurutan yang telah diinginkan.
Contoh prosedur:
Versi 1
void bubble_sort(){
for(int i=1;i<n;i++){
for(int j=n-1;j>=i;j--){
if(data[j]<data[j-1])
tukar(&data[j],&data[j-1]); //ascending
}
}
}
Versi 2
void bubblesort2(){
for(i=1;i<6;i++){
for(int j=0;j<6-i;j++){
if(data[j]>data[j+1])
tukar(&data[j],&data[j+1]); //descending
}
}
}
“The bubble sort is an easy algorithm to program, but it is slower than many other
sorts”
6.2. Selection Sort
Merupakan kombinasi antara sorting dan searching. Untuk setiap proses, akan
dicari elemen-elemen yang belum diurutkan yang memiliki nilai terkecil atau terbesar
akan dipertukarkan ke posisi yang tepat di dalam array. Misalnya untuk putaran pertama,
akan dicari data dengan nilai terkecil dan data ini akan ditempatkan di indeks terkecil
(data[0]), pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di
indeks kedua (data[1]).
Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks
pembanding saja, pertukaran data secara fisik terjadi pada akhir proses.
Contoh prosedur:
void selection_sort(){
for(int i=0;i<n-1;i++){
pos = i;
for(int j=i+1;j<n;j++){
if(data[j] < data[pos]) pos = j; //ascending
}
if(pos != i) tukar(pos,i);
}
}
Mirip dengan cara orang mengurutkan kartu, selembar demi selembar kartu diambil
dan disisipkan (insert) ke tempat yang seharusnya. 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.
Contoh prosedur:
void insertion_sort(){
int temp;
for(int i=1;i<n;i++){
temp = data[i];
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
}
Untuk data sejumlah 10.000 data pada komputer Pentium II 450 MHz