Anda di halaman 1dari 21

Pada buku algoritma dan struktur data karya N writh 1985 (versi oberon tahun 2004) terdapat 5

bab,ringkasan sebagai berikut :

BAB 1 Struktur Data Fundamental

1.1 Pengantar

Komputer digital modern diciptakan dan dimaksudkan sebagai perangkat yang harus memfasilitasi dan
mempercepat perhitungan yang rumit dan memakan waktu. Secara umum diketahui bahwa komputer
menggunakan representasi internal berdasarkan digit biner (bit). Ini representasi tidak cocok untuk
manusia karena biasanya angka dalam jumlah besar yang terlibat, tetapi itu paling cocok untuk sirkuit
elektronik karena dua nilai 0 dan 1 dapat direpresentasikan dengan nyaman dan andal dengan ada atau
tidak adanya arus listrik, muatan listrik, atau medan magnet.

Dari contoh ini kita juga dapat melihat bahwa masalah representasi seringkali melampaui beberapa
tingkatan detail. Mengingat masalah mewakili, katakanlah, posisi suatu objek,

keputusan pertama dapat menyebabkan pilihan sepasang bilangan real dalam, katakanlah, baik
koordinat Cartesian atau kutub.

Keputusan kedua mungkin mengarah ke representasi floating-point, di mana setiap bilangan real x
terdiri dari sepasang bilangan bulat yang menunjukkan afraksi f dan eksponen e ke basis tertentu
(sedemikian sehingga x = f × 2e).

Keputusan ketiga, berdasarkan pada pengetahuan bahwa data akan disimpan di komputer, dapat
menyebabkan representasi biner, posisi bilangan bulat, dan keputusan akhir bisa mewakili angka biner
oleh muatan listrik dalam semikonduktor alat penyimpanan. Jelas, keputusan pertama dalam rantai ini
terutama dipengaruhi oleh situasi masalah, dan yang kemudian semakin tergantung pada alat dan
teknologinya.

Jadi, itu hampir tidak diperlukan bahwa seorang programmer memutuskan representasi angka yang
akan digunakan, atau bahkan pada perangkat penyimpanankarakteristik. Keputusan tingkat bawah ini
dapat diserahkan kepada perancang peralatan komputer, yang memilikinya informasi terbanyak yang
tersedia tentang teknologi saat ini untuk membuat pilihan yang masuk akal dapat diterima untuk semua
(atau hampir semua) aplikasi di mana angka berperan.

1.2 Konsep Tipe Data

Karakteristik utama dari konsep tipe data dalam bahasa pemograman Oberon :

1. Tipe data menentukan set nilai yang dimiliki konstanta, atau yang dapat diasumsikan oleh a

variabel atau ekspresi, atau yang dapat dihasilkan oleh operator atau fungsi.
2. Jenis nilai yang dilambangkan dengan konstanta, variabel, atau ekspresi dapat diturunkan dari bentuk
atau bentuknya deklarasi tanpa perlu mengeksekusi proses komputasi.

3. Setiap operator atau fungsi mengharapkan argumen dari tipe tetap dan menghasilkan hasil dari tipe
tetap. Jika operator menerima argumen dari beberapa jenis (misalnya, + digunakan untuk penambahan
bilangan bulat dan nyata angka), maka jenis hasilnya dapat ditentukan dari aturan bahasa tertentu.

1.3 Jenis Data Primitif

Tipe primitif baru dapat didefinisikan dengan menyebutkan nilai-nilai berbeda yang dimiliki. Jenis seperti
ini disebut sebuah tipe enumerasi . Definisinya memiliki bentuk

TYPE T = (c1, c2, ..., cn)

T adalah pengenal tipe baru, dan c i adalah pengidentifikasi konstan baru.

Contohnya

JENIS bentuk = (persegi panjang, persegi, elips, lingkaran)

TIPE warna = (merah, kuning, hijau)

1.4 Tipe Primitif Standar

Tipe primitif standar adalah tipe yang tersedia pada kebanyakan komputer sebagai fitur bawaan, Kami
menunjukkan ini jenis oleh pengidentifikasi

INTEGER, REAL, BOOLEAN, CHAR, SET

1.4.1 Jenis bilangan bulat(INTEGER)

Jenis INTEGER terdiri dari himpunan bagian dari seluruh angka yang ukurannya dapat bervariasi di
antara individu sistem komputer. Diasumsikan bahwa semua operasi pada data jenis ini adalah tepat
dan sesuai dengan hukum aritmatika biasa, dan bahwa perhitungan akan terputus dalam kasus hasil
yang terletak di luar bagian yang dapat diwakili

1.4.2 Jenis NYATA(REAL)

Tipe REAL menunjukkan subset dari bilangan real. Sedangkan aritmatika dengan operan jenis INTEGER
diasumsikan menghasilkan hasil yang tepat, aritmatika pada nilai-nilai tipe REAL diizinkan tidak akurat
dalam batas kesalahan pembulatan yang disebabkan oleh perhitungan pada jumlah digit yang
terbatas. Ini adalah alasan utama untuk perbedaan eksplisit antara jenis INTEGER dan REAL, seperti yang
dibuat di sebagian besar bahasa pemrograman.

1.4.3 Jenis BOOLEAN

Dua nilai tipe standar BOOLEAN dilambangkan oleh pengidentifikasi BENAR dan SALAH. Itu Operator
Boolean adalah konjungsi logis, disjungsi, dan negasi

1.4.4 Jenis CHAR

Tipe standar CHAR terdiri dari serangkaian karakter yang dapat dicetak. Sayangnya, tidak ada umumnya
set karakter standar yang diterima digunakan pada semua sistem komputer. Oleh karena itu,
penggunaan predikat "standar" mungkin dalam kasus ini hampir menyesatkan; itu harus dipahami
dalam arti "standar pada komputer sistem di mana program tertentu akan dieksekusi. "

1.4.5 Jenis SET

Jenis SET menunjukkan set yang elemen-elemennya bilangan bulat dalam kisaran 0 hingga sejumlah
kecil, biasanya 31 atau 63.

Operator dasar berikut didefinisikan pada variabel jenis SET:

* mengatur persimpangan

+ mengatur persatuan

- atur perbedaan

/perbedaan set simetris

DALAM menetapkan keanggotaan

1.5 Struktur Array

Array mungkin adalah struktur data yang paling banyak digunakan; dalam beberapa bahasa itu bahkan
satu-satunya tersedia. Array terdiri dari komponen-komponen yang semuanya memiliki tipe yang sama

disebut tipe dasarnya ; ini oleh karena itu disebut struktur homogen . Array adalah struktur akses acak ,
karena semua komponen dapat dipilih secara acak dan sama-sama dapat diakses dengan cepat. Untuk
menunjukkan komponen individu, nama seluruh struktur ditambah oleh indeks memilih
komponen. Indeks ini menjadi integer antara 0 dan n-1, di mana n adalah jumlah elemen, ukuran , array.

TYPE T = ARRAY n OF T0
Contohnya

JENIS Baris = ARRAY 4 REAL

TYPE Card = ARRAY 80 OF CHAR

TYPE Name = ARRAY 32 OF CHAR

Nilai tertentu dari suatu variabel

VAR x: Baris

1.6 Struktur Catatan (Record)

Metode paling umum untuk mendapatkan tipe terstruktur adalah dengan menggabungkan elemen tipe
arbitrer, yang mungkin jenis sendiri terstruktur, menjadi senyawa. Karenanya kata record telah menjadi

diterima secara luas untuk menggambarkan senyawa data yang bersifat ini, dan kami mengadopsi
nomenklatur ini di preferensi untuk produk Cartesian istilah. Secara umum, catatan tipe T dengan
komponen tipe T1, T2,

... , Tn is defined as follows:

TYPE T = RECORD s1: T1; s2: T2; ... sn: Tn END

card(T) = card(T1) * card(T2) * ... * card(Tn)

Contohnya

TYPE Complex = RECORD re, im: REAL END

1.7 Representasi Array, Catatan, dan Set

Inti dari penggunaan abstraksi dalam pemrograman adalah bahwa suatu program dapat dipahami,
dipahami, dan diverifikasi berdasarkan undang-undang yang mengatur abstraksi, dan bahwa tidak perlu
untuk memiliki wawasan dan pengetahuan lebih lanjut tentang cara di mana abstraksi
diimplementasikan dan diwakili dalam komputer tertentu. Namun demikian, penting bagi seorang
programmer profesional untuk memiliki pemahaman tentang teknik yang banyak digunakan untuk
mewakili konsep dasar abstraksi pemrograman, seperti struktur data mendasar. Hal ini bermanfaat
sejauh memungkinkan programmer untuk membuat keputusan yang masuk akal tentang program dan
desain data dalam terang tidak hanya dari sifat abstrak struktur, tetapi juga realisasi mereka pada
komputer yang sebenarnya, dengan mempertimbangkan kemampuan dan keterbatasan khusus
komputer.

Masalah representasi data adalah pemetaan struktur abstrak ke toko komputer. Toko komputer - dalam
perkiraan pertama - array sel penyimpanan individu yang disebut byte. Mereka dipahami sebagai
kelompok 8 bit. Indeks byte disebut alamat.
VAR store: ARRAY StoreSize OF BYTE

Tipe dasar diwakili oleh sejumlah kecil byte, biasanya 2, 4, atau 8. Komputer dirancang untuk
mentransfer secara internal sejumlah kecil (mungkin 1) byte yang berdekatan secara bersamaan,
"secara paralel". Unit yang dapat dipindahtangankan secara bersamaan disebut sebuah kata.

1.7.1 Representasi Array

Representasi struktur array adalah pemetaan array (abstrak) dengan komponen tipe T ke
toko yang merupakan array dengan komponen tipe BYTE. Array harus dipetakan sedemikian rupa
sehingga perhitungan alamat komponen array sesederhana (dan karena itu seefisien) mungkin.
Alamat i dari komponen array j-th dihitung oleh fungsi pemetaan linear
i = i0 + j * s
di mana i0 adalah alamat komponen pertama, dan s adalah jumlah kata yang ditempati komponen.
Dengan asumsi bahwa kata itu adalah unit toko terkecil yang dapat ditransfer secara individu,
jelas sangat diinginkan bahwa menjadi bilangan bulat, kasus paling sederhana adalah s = 1. Jika
s bukan bilangan bulat (dan ini adalah kasus normal), maka s biasanya dibulatkan ke bilangan
bulat berikutnya yang lebih besar S. Setiap komponen array kemudian menempati

Kata-kata S, di mana kata-kata S-dibiarkan tidak digunakan (lihat Gambar. 1.5 ).


Pembulatan dari jumlah kata yang dibutuhkan ke seluruh angka selanjutnya disebut padding.
Faktor pemanfaatan penyimpanan u adalah hasil bagi dari jumlah minimal penyimpanan yang
diperlukan untuk mewakili struktur dan jumlah yang sebenarnya digunakan:
u = s / (dibulatkan ke bilangan bulat terdekat)

Gambar 1.5. Memetakan array ke toko


1.7.2 Representasi Record

Keumuman struktur rekaman

sayangnya tidak mengizinkan fungsi linear yang sederhana untuk perhitungan alamat offset, dan
memang demikian Oleh karena itu alasan untuk persyaratan bahwa komponen rekaman hanya dapat
dipilih oleh pengidentifikasi tetap.Pembatasan ini memiliki manfaat yang diinginkan bahwa masing-
masing offset diketahui pada waktu kompilasi. Itu menghasilkan efisiensi yang lebih besar dari akses
bidang rekaman yang terkenal.

Ini berarti bahwa pada banyak komputer pengemasan catatan menyebabkan sebuah penurunan
efisiensi akses jauh lebih kecil daripada yang disebabkan oleh pengemasan array

1.7.3 Representasi Set

Satu set s diwakili dengan nyaman di toko komputer dengan fungsi karakteristiknya C (s). Ini adalah
sebuah array

nilai-nilai logis yang komponennya memiliki arti "i hadir dalam s". Sebagai contoh, himpunan kecil

integer s = {2, 3, 5, 7, 11, 13} diwakili oleh urutan bit, oleh bitstring:

C (s) = (... 0010100010101100)

Operasi logis ini tersedia di semua komputer digital, dan terlebih lagi mereka beroperasi bersamaan
semua elemen (bit) kata yang sesuai. Oleh karena itu tampak bahwa untuk dapat mengimplementasikan

operasi himpunan dasar secara efisien, himpunan harus direpresentasikan dalam jumlah kata yang kecil
dan tetap yang tidak hanya operasi logis dasar, tetapi juga yang bergeser tersedia. Menguji keanggotaan

kemudian diimplementasikan oleh satu shift dan operasi uji bit (tanda) berikutnya. Sebagai
konsekuensinya, tes bentuk x IN {c1, c2, ..., cn} dapat diimplementasikan jauh lebih efisien daripada yang
setara Ekspresi Boolean

(x = c1) ATAU (x = c2) ATAU ... ATAU (x = cn

1.8 File (Urutan) Sequence

Metode penataan dasar lainnya adalah urutan. Urutan biasanya struktur yang homogen

seperti array. Yaitu, semua elemennya memiliki tipe yang sama, tipe dasar dari urutan. Kami akan
menyatakan sebuah urutan s dengan n elemen oleh

s = <s 0 , s 1 , s 2 , ..., s n-1 >

n disebut panjang urutan. Struktur ini terlihat persis seperti array. Perbedaan dasarnya adalah
bahwa dalam kasus array jumlah elemen diperbaiki oleh deklarasi array, sedangkan untuk

urutan dibiarkan terbuka

Dapat dissimpulkan

1. Array dan catatan adalah struktur akses acak. Mereka digunakan ketika terletak di primer, akses acak

toko.

2. Urutan digunakan untuk mengakses data pada toko sekunder, akses sekuensial, seperti disk dan
kaset.

3. Kami membedakan antara deklarasi variabel sekuens, dan deklarasi dari mekanisme akses yang
berada pada posisi tertentu dalam seqence.

1.8.1 Operator File Dasar

Kita sekarang dapat mendalilkan dan menggambarkan secara informal kumpulan primitif berikut

operator:

1a. Baru (f, nama) mendefinisikan f sebagai urutan kosong.

1b. Old (f, name) mendefinisikan f sebagai urutan yang disimpan secara tetap dengan nama yang
diberikan.

2. Atur (r, f, pos) kaitkan rider dengan urutan f, dan letakkan di posisi pos.

3. Tulis (r, x)

tempatkan elemen dengan nilai x dalam urutan yang ditentukan oleh rider r, dan maju.

4. Baca (r, x)

tetapkan untuk x nilai elemen yang ditunjuk oleh rider r, dan maju.

5. Tutup (f)

mendaftarkan file tertulis f di toko persisten (buffer flush).

Catatan : Menulis elemen secara berurutan seringkali merupakan operasi yang rumit. Namun, sebagian
besar, file dibuat oleh menambahkan elemen di bagian akhir.

Untuk menyampaikan pemahaman yang lebih tepat tentang operator pengurutan, contoh berikut dari
sebuah implementasi disediakan. Ini menunjukkan bagaimana mereka dapat diekspresikan jika urutan
diwakili oleh array. Contoh implementasi ini sengaja dibangun di atas konsep yang diperkenalkan dan
didiskusikan sebelumnya, dan itu tidak melibatkan buffering atau toko berurutan yang, seperti
disebutkan di atas, membuat konsep urutan benar-benar diperlukan dan menarik.

1.8.2 Urutan Buffering


Buffering memiliki keuntungan tambahan dalam memungkinkan proses yang menghasilkan (menerima)
data untuk diproses bersamaan dengan perangkat yang menulis (membaca) data dari (ke)
buffer. Bahkan, lebih mudah untuk melakukannya menganggap perangkat sebagai proses itu sendiri
yang hanya menyalin aliran data. Tujuan buffer adalah untuk menyediakan tingkat tertentu decoupling
antara dua proses, yang akan kita sebut sebagai produsen dan konsumen . Jika, misalnya, konsumen
lambat pada saat tertentu, itu mungkin menyusul produsen kemudian. Decoupling ini seringkali penting
untuk pemanfaatan perangkat periferal yang baik, tetapi hanya memilik efeknya, jika tingkat produsen
dan konsumen rata-rata hampir sama, tetapi kadang-kadang berfluktuasi. Itu tingkat decoupling tumbuh
dengan meningkatnya ukuran buffer.

Kita sekarang beralih ke pertanyaan tentang bagaimana merepresentasikan buffer, dan untuk saat ini
akan mengasumsikan data itu elemen disimpan dan diambil secara individual alih-alih dalam blok. Buffer
dasarnya merupakan first- in-first-out queue (fifo). Jika dinyatakan sebagai larik, dua variabel indeks,
katakan masuk dan keluar , tandai posisi dari lokasi selanjutnya untuk ditulis dan dibaca. Idealnya, array
seperti itu seharusnya tidak memiliki indeks batas. Namun, array terbatas cukup memadai mengingat
fakta bahwa elemen yang pernah diambil adalah no relevan lagi. Lokasi mereka mungkin digunakan
kembali. Ini mengarah pada gagasan buffer melingkar . Itu operasi penyetoran dan pengambilan elemen
dinyatakan dalam modul berikut, yang diekspor operasi ini sebagai prosedur, tetapi menyembunyikan
buffer dan variabel indeksnya - dan dengan demikian efektif mekanisme penyangga - dari proses
klien. Mekanisme ini juga melibatkan variabel dan penghitungan jumlah elemen saat ini di buffer. Jika N
menunjukkan ukuran buffer, kondisi 0 ≤ n ≤ N adalah jelas-jelas invarian. Oleh karena
itu, pengambilan operasi harus dijaga oleh kondisi n> 0 (buffer non- kosong),
dan setoran operasi dengan kondisi n <N (buffer non-full). Tidak bertemu mantan kondisi harus
dianggap sebagai kesalahan pemrograman, pelanggaran yang terakhir sebagai kegagalan yang
disarankan implementasi (buffer terlalu kecil). MODUL Buffer; (* mengimplementasikan buffer
melingkar *)

CONST N = 1024; (*ukuran buffer*)

VAR dan masuk, keluar: INTEGER;

buf: ARRAY N OF CHAR;

Setoran PROSEDUR (x: CHAR);

MULAI

JIKA n = N MAKA HALT AKHIR;

INC (n); buf [di]: = x; dalam: = (dalam + 1) MOD N

Deposit END;

PROSEDUR mengambil (VAR x: CHAR);

MULAI

JIKA n = 0 KEMUDIAN HALT AKHIR;

DEC (n); x: = buf [keluar]; keluar: = (keluar + 1) MOD N


AKHIR mengambil;

BEGIN n: = 0; dalam: = 0; keluar: = 0

END Buffer.

Implementasi sederhana dari buffer ini hanya dapat diterima, jika


Prosedur setoran dan pengambilan diaktifkan oleh agen tunggal (sekali bertindak sebagai produsen,
sekali sebagai konsumen). Namun, jika mereka diaktifkan oleh individu, proses bersamaan, skema ini
terlalu sederhana. Alasannya adalah bahwa upaya untuk menyetor buffer penuh, atau upaya untuk
mengambil dari buffer kosong, cukup sah. Eksekusi ini tindakan hanya harus ditunda sampai kondisi
penjagaan ditetapkan. Penundaan seperti itu pada dasarnya merupakan sinkronisasi yang diperlukan
antara proses bersamaan. Kami mungkin mewakili penundaan ini masing-masing oleh pernyataan

ULANGI SAMPAI n <N

ULANGI SAMPAI n> 0

yang harus diganti dengan dua pernyataan HALT yang dikondisikan

1.8.3 Buffer antara Proses Bersamaan

Solusi yang disajikan, bagaimanapun, tidak direkomendasikan, bahkan jika diketahui bahwa kedua
proses digerakkan oleh dua mesin individual. Alasannya adalah bahwa kedua prosesor harus mengakses
variabel n yang sama, dan Oleh karena itu toko yang sama.

1.8.4 Input dan Output Teks

Dengan input dan output standar, kami memahami transfer data ke (dari) sistem komputer dari (ke)
agen yang benar-benar eksternal, khususnya operator manusianya. Input biasanya berasal dari keyboard
dan output mungkin tenggelam ke layar tampilan. Bagaimanapun, karakteristiknya adalah bahwa itu
dapat dibaca, dan biasanya terdiri dari urutan karakter. Itu adalah teks. Kondisi keterbacaan ini
bertanggung jawab untuk kondisi lainnya

komplikasi yang terjadi di sebagian besar operasi input dan output asli. Terlepas dari transfer data
aktual, mereka juga melibatkan transformasi representasi. Misalnya, angka, biasanya dianggap sebagai
atom unit dan direpresentasikan dalam bentuk biner, perlu diubah menjadi notasi desimal yang dapat
dibaca. Kebutuhan struktur unt,.uk diwakili dalam tata letak yang sesuai, yang generasinya disebut
format
1.9 Pencarian

Tugas pencarian adalah salah satu operasi yang paling sering dalam pemrograman komputer. Ini juga
menyediakan tanah yang ideal untuk penerapan struktur data sejauh ini ditemui.

1.9.1 Pencarian Linear

Ketika tidak ada informasi lebih lanjut tentang data yang dicari, pendekatan yang jelas adalah untuk
melanjutkan berurutan melalui array untuk meningkatkan langkah demi langkah ukuran bagian, di mana
yang diinginkan Elemen diketahui tidak ada. Pendekatan ini disebut pencarian linear . Ada dua syarat
yang hentikan pencarian:

1. Unsur ini ditemukan, yaitu i = x.

2. Seluruh array telah dipindai, dan tidak ada kecocokan yang ditemukan.

1.9.2 Pencarian Biner

Jelas tidak ada cara untuk mempercepat pencarian, kecuali ada lebih banyak informasi tentang data
yang dicari. Diketahui bahwa pencarian dapat dibuat jauh lebih efektif, jika datanya dipesan. Bayangkan,
misalnya, sebuah direktori telepon di mana nama-namanya tidak terdaftar secara alfabet. Itu akansama
sekali tidak berguna. Oleh karena itu kami akan menyajikan sebuah algoritma yang menggunakan
pengetahuan bahwa suatu adalah dipesan, yaitu, dari kondisi tersebut

A k: 1 ≤ k <N: a k-1 ≤ a k

Gagasan utamanya adalah memeriksa elemen yang dipilih secara acak, katakan saya, dan
membandingkannya dengan argumen pencarian x. Jika sama dengan x, pencarian berakhir; jika kurang
dari x, kami menyimpulkan bahwa semua elemen dengan indeks kurang atau sama dengan m dapat
dihilangkan dari pencarian lebih lanjut; dan jika lebih besar dari x, semua dengan indeks lebih besar atau
sama untuk m bisa dihilangkan. Ini menghasilkan algoritma berikut yang disebut pencarian biner

1.9.3 Pencarian Tabel

Jelas tidak ada cara untuk mempercepat pencarian, kecuali ada lebih banyak informasi tentang

data yang dicari. Diketahui bahwa pencarian dapat dibuat jauh lebih efektif, jika datanya dipesan.

Bayangkan, misalnya, sebuah direktori telepon di mana nama-namanya tidak terdaftar secara
alfabet. Itu akan

sama sekali tidak berguna. Oleh karena itu kami akan menyajikan sebuah algoritma yang menggunakan
pengetahuan bahwa suatu adalah

dipesan, yaitu, dari kondisi tersebut

A k: 1 ≤ k <N: a k-1 ≤ a k
Gagasan utamanya adalah memeriksa elemen yang dipilih secara acak, katakan saya, dan
membandingkannya dengan argumen pencarian

x. Jika sama dengan x, pencarian berakhir; jika kurang dari x, kami menyimpulkan bahwa semua elemen
dengan indeks kurang atau sama dengan m dapat dihilangkan dari pencarian lebih lanjut; dan jika lebih
besar dari x, semua dengan indeks lebih besar atau sama untuk m bisa dihilangkan. Ini menghasilkan
algoritma berikut yang disebut pencarian biner

1.9.4 Pencarian String Lurus

Jenis pencarian yang sering dijumpai adalah yang disebut pencarian string . Ini ditandai sebagai
berikut. Diberikan sebuah array s dari elemen N dan sebuah array p dari elemen M, di mana 0 <M <N,
dinyatakan sebagai

s: ARRAY N OF Item

p: ARRAY M OF Item

pencarian string adalah tugas menemukan kemunculan pertama p dalam s. Biasanya, item adalah
karakter; lalu sdapat dianggap sebagai teks dan p sebagai pola atau kata, dan kami ingin menemukan
kata pertama yang muncul di teks. Operasi ini merupakan dasar untuk setiap sistem pemrosesan teks,
dan ada minat yang jelas untuk menemukan algoritma yang efisien untuk tugas ini. Namun, sebelum
memberi perhatian khusus pada efisiensi, marilah kita terlebih dahulu menyajikan algoritma pencarian
langsung. Kami akan menyebutnya pencarian string langsung

1.9.5 Pencarian String Knuth-Morris-Pratt

Sekitar tahun 1970, DE Knuth, JH Morris, dan VR Pratt menemukan sebuah algoritma yang
membutuhkan dasarnya di

hanya urutan perbandingan karakter N, bahkan dalam kasus terburuk [1-8]. Algoritma baru didasarkan
pada observasi bahwa dengan memulai perbandingan pola selanjutnya pada permulaannya setiap kali,
kita mungkin membuang informasi berharga yang dikumpulkan selama perbandingan
sebelumnya. Setelah pertandingan parsial awal pola dengan karakter yang sesuai dalam string, kita
memang tahu bagian terakhir dari string, dan mungkin bisa mengkompilasi beberapa data (dari pola)
yang dapat digunakan untuk kemajuan yang lebih cepat distring teks. Contoh pencarian kata Hooligan
berikut mengilustrasikan prinsip algoritma. Karakter yang digarisbawahi adalah yang
dibandingkan. Perhatikan bahwa setiap dua kali dibandingkan karakter tidak cocok, polanya digeser
sepanjang jalan, karena pergeseran yang lebih kecil tidak mungkin mengarah kepertandingan penuh.

1.9.6 Pencarian String Boyer-Moore

Skema cerdas dari pencarian KMP menghasilkan manfaat asli hanya jika ketidakcocokan didahului oleh
sebagian cocok dengan panjang tertentu. Hanya dalam kasus ini pergeseran pola meningkat menjadi
lebih dari 1. Sayangnya, ini pengecualian daripada aturan; kecocokan terjadi lebih jarang dari pada
ketidakcocokan. Karena itu, keuntungan dalam menggunakan strategi KMP adalah marjinal dalam
banyak kasus pencarian teks normal. Metode yang akan dibahas di sini memang tidak hanya
meningkatkan kinerja dalam kasus terburuk, tetapi juga dalam kasus rata-rata. Dulu ditemukan oleh RS
Boyer dan JS Moore sekitar tahun 1975, dan kami akan menyebutnya pencarian BM. Kami akan hadir di
siniversi sederhana dari BM-search sebelum melanjutkan ke yang diberikan oleh Boyer dan Moore ..

Pencarian BM didasarkan pada ide yang tidak konvensional untuk mulai membandingkan karakter pada
akhir pola daripada di awal. Seperti dalam kasus pencarian KMP, polanya dikompilasi menjadi sebuah
tabel d sebelum pencarian sebenarnya dimulai. Biarkan, untuk setiap karakter x dalam set
karakter, dx menjadi jarak paling kanan terjadinya x dalam pola dari ujungnya. Sekarang asumsikan
bahwa ketidakcocokan antara string dan pola adalah ditemukan. Kemudian polanya dapat segera
digeser ke kanan dengan posisi dp [M-1] , jumlah tersebut sangat mungkin lebih besar dari 1. Jika p M-
1 tidak terjadi dalam pola sama sekali, pergeserannya bahkan lebih besar, yaitu sama dengan panjang
pola keseluruhan

2 Menyortir

2.1 Pendahuluan

Tujuan utama bab ini adalah untuk memberikan serangkaian contoh luas yang menggambarkan
penggunaan data struktur diperkenalkan pada bab sebelumnya dan untuk menunjukkan bagaimana
pilihan struktur untuk yang mendasarinya data sangat mempengaruhi algoritma yang melakukan tugas
yang diberikan. Penyortiran juga merupakan contoh yang baik untuk ditampilkan bahwa tugas seperti
itu dapat dilakukan sesuai dengan banyak algoritma yang berbeda, masing-masing memiliki tertentu
kelebihan dan kekurangan yang harus ditimbang terhadap satu sama lain dalam terang tertentu aplikasi.

2.2 Array Penyortiran

Persyaratan utama yang harus dibuat untuk menyortir metode pada array adalah penggunaan ekonomis
dari toko yang tersedia. Ini menyiratkan bahwa permutasi item yang membawa item ke dalam urutan
harus dilakukan in situ, dan metode yang mengangkut item dari larik a ke larik hasil b secara intrinsik
dengan kepentingan minor

2.2.1 Penyortiran dengan Penyisipan Lurus

Metode ini banyak digunakan oleh pemain kartu. Item (kartu) secara konseptual dibagi menjadi tujuan
urutan 1 ... a i-1 dan urutan sumber i ... a n . Di setiap langkah, dimulai dengan i = 2 dan menambah i
dengan kesatuan, elemen ke-1 dari urutan sumber diambil dan ditransfer ke dalam urutan tujuan oleh
memasukkannya di tempat yang tepat.

2.2.2 Menyortir berdasarkan Pilihan Lurus

Metode ini didasarkan pada prinsip berikut:


1. Pilih item dengan kunci paling sedikit.

2. Tukarkan dengan item pertama a 0 .

3. Kemudian ulangi operasi ini dengan item n-1 yang tersisa, kemudian dengan item n-2, hingga hanya
satu item -- yang terbesar - tersisa.

2.2.3 Menyortir berdasarkan Pertukaran Lurus(Straigh Exchange)

Klasifikasi metode penyortiran jarang sepenuhnya jelas. Kedua metode yang dibahas sebelumnya dapat
juga dipandang sebagai jenis pertukaran. Namun, pada bagian ini, kami menyajikan metode pertukaran
dua item adalah karakteristik dominan dari proses tersebut. Algoritma pertukaran lurus berikutnya
adalah berdasarkan pada prinsip membandingkan dan menukar pasangan barang yang berdekatan
sampai semua item diurutkan.Seperti dalam metode seleksi lurus sebelumnya, kami membuat lintasan
berulang di atas larik, setiap kali menyaring item terkecil dari set yang tersisa ke ujung kiri array. Jika,
untuk perubahan, kami melihat array berada dalam sebuah vertikal bukan posisi horizontal, dan -
dengan bantuan imajinasi - item sebagai gelembung dalam tangki air dengan bobot menurut kunci
mereka, kemudian masing-masing melewati array menghasilkan kenaikan sebuah gelembung ke tingkat
berat yang sesuai (lihat Tabel 2.3). Metode ini dikenal luas sebagai Bubblesor

2.3 Metode Penyortiran Lanjut

2.3.1 Penyisipan Diurutkan berdasarkan Diminishing Increment

Penyempurnaan jenis penyisipan lurus diusulkan oleh DL Shell di l959. Metode ini dijelaskan dan
ditunjukkan pada contoh standar kami dari delapan item (lihat Tabel 2.5). Pertama, semua item yang
ada empat posisi terpisah dikelompokkan dan diurutkan secara terpisah. Proses ini disebut 4-
sort. Dalam contoh delapan item ini, masing-masing grup persis mengandung dua item. Setelah pass
pertama ini, item dikelompokkan kembali menjadi grup dengan item dua posisi terpisah dan kemudian
disortir lagi. Proses ini disebut 2-sort. Akhirnya, di pass ketiga, semua item diurutkan dalam semacam
biasa atau 1-jenis.

2.3.2 Urut Pohon

kita bias buat pohon pemilihan seperti yang ditunjukkan pada Gambar 2.3. dan mengidentifikasi root
sebagai kunci paling tidak diinginkan Langkah kedua sekarang terdiri dari menuruni sepanjang jalan yang
ditandai dengan kunci paling tidak dan menghilangkannya dengan berturut-turut menggantinya dengan
lubang kosong di bagian bawah, atau dengan item di cabang alternatif di simpul tengah

Sekali lagi, item yang muncul di root pohon memiliki (sekarang)

kedua) kunci terkecil dan bisa dihilangkan. Setelah langkah seleksi seperti n, pohon itu kosong (yaitu,
penuh lubang), dan proses penyortiran dihentikan. Perlu dicatat bahwa setiap langkah seleksi n hanya
memerlukan log n perbandingan. Oleh karena itu, proses seleksi total hanya membutuhkan urutan n *
log n dasar operasi selain n langkah yang diperlukan oleh pembangunan pohon
2.3.3 Sortir Partisi

penyortiran terbaik pada array yang dikenal sejauh ini. Hanya ya kinerja sangat spektakuler sehingga
penemunya, CAR Hoare, menyebutnya Quicksort. Quicksort didasarkan pada pengakuan bahwa
pertukaran sebaiknya dilakukan pada jarak yang jauh di Agar paling efektif

2.3.4 Menemukan Median

Median n item didefinisikan sebagai item yang kurang dari (atau sama dengan) setengah dari n item dan
yanglebih besar dari (atau sama dengan) setengah dari n item. Misalnya, median dari

16 12 99 95 18 87 10

adalah 18. Masalah menemukan median biasanya terhubung dengan penyortiran, karena jelas Metode
menentukan median adalah menyortir item n dan kemudian untuk memilih item di tengah. Tapi partisi
menghasilkan cara yang berpotensi jauh lebih cepat untuk menemukan median. Metode yang akan
ditampilkan dengan mudah menyamaratakan masalah menemukan item terkecil dari n
item. Menemukan median mewakili yang spesial

case k = n / 2

2.3.5 Perbandingan Metode Penyortiran Array

Untuk mengakhiri parade metode penyortiran ini, kami akan mencoba membandingkan
efektivitasnya. Jika n menunjukkan jumlah item yang akan disortir, C dan M akan berdiri lagi untuk
jumlah perbandingan kunci yang diperlukan dan barang bergerak, masing-masing

2.4 Urutan Penyortiran

2.4.1 Penggabungan Lurus

ang paling penting adalah menyortir dengan menggabungkan. Menggabungkan (atau menyusun) berarti
menggabungkan dua (atau lebih) urutan berurutan menjadi satu, urutan berurutan dengan seleksi
berulang di antara komponen yang saat ini dapat diakses. Penggabungan adalah operasi yang jauh lebih
sederhana daripada menyortir, dan digunakan sebagai operasi bantu dalam proses penyortiran
berurutan yang lebih kompleks. Salah satu cara memilah berdasarkan penggabungan,
disebut penggabungan lurus , adalah sebagai berikut:

1. Pisahkan urutan a menjadi dua bagian, disebut b dan c.

2. Gabungkan b dan c dengan menggabungkan item tunggal ke dalam pasangan yang dipesan.

3. Panggil urutan gabungan a, dan ulangi langkah 1 dan 2, kali ini menggabungkan pasangan berurutan
ke dalam urutan empat kali lipat.
4. Ulangi langkah sebelumnya, menggabungkan empat kali lipat menjadi oktet, dan terus melakukan ini,
setiap kali menggandakan panjang dari gabungan selanjutnya, sampai seluruh urutan diperintahkan

Algoritme penggabungan rupanya membandingkan dengan baik bahkan dengan teknik penyortiran
canggih yang dibahas dalam bab sebelumnya. Namun, biaya administrasi untuk manipulasi indeks relatif
tinggi,

2.4.2 Penggabungan Alami

Dalam penggabungan lurus tidak ada keuntungan diperoleh ketika data awalnya sudah diurutkan
sebagian. Panjangnya semua tahapan yang digabungkan dalam k th pass kurang dari atau sama dengan
2k, terlepas dari apakah lebih lama urutan sudah dipesan dan bisa juga digabung. Bahkan, ada dua
urutan berikutnya dari panjang m dan n dapat digabung langsung ke dalam satu urutan item m +
n. Sebuah mergesort yang setiap saat menggabungkan dua urutan terpanjang yang mungkin
disebut semacam penggabungan alami .

2.4.3 Penggabungan Multiway Seimbang

mengembangkan program pengurutan berdasarkan penggabungan multi-jalur. Untuk

lebih jauh kontras program dari prosedur penggabungan dua fase alami sebelumnya, kami akan
merumuskan multiway menggabungkan sebagai fase tunggal, mergesort seimbang. Ini menyiratkan
bahwa dalam setiap pass ada yang sama jumlah file input dan output yang menjalankan berturut-turut
didistribusikan secara bergantian. Menggunakan 2 file N , file Oleh karena itu algoritma akan didasarkan
pada penggabungan N-way. Mengikuti strategi yang diadopsi sebelumnya, kami tidak akan
melakukannya repot untuk mendeteksi penggabungan dua run berturut-turut yang didistribusikan ke
file yang sama. Karena itu,kita dipaksa untuk merancang program penggabungan tanpa asumsi jumlah
berjalan yang sama pada input file

2.4.4 Sortir Polifase

penggabungan seimbang menghilangkan operasi penyalinan murni yang diperlukan saat distribusi dan
penggabungan operasi disatukan menjadi satu fase. Muncul pertanyaan apakah urutan yang diberikan
bisa atau tidak diproses lebih efisien. Ini memang masalahnya; kunci untuk perbaikan selanjutnya ini
terletak pada pengabaian gagasan kaku untuk melewati yang ketat, yaitu, untuk menggunakan urutan
dengan cara yang lebih canggih daripada dengan selalu memilikinya N / 2 sumber dan sebanyak
mungkin tujuan dan bertukar sumber dan tujuan di setiap akhir yang berbeda lulus. Sebaliknya, gagasan
lulus menjadi menyebar. Metode ini ditemukan oleh RL Gilstad [2-3] dan dipanggil Sortir Polifase.

Polyphase lebih efisien daripada gabungan seimbang karena, diberi urutan N , selalu beroperasi
dengan N-1 - cara menggabungkan bukan gabungan N / 2 -jalan. Karena jumlah lintasan yang diperlukan
kira-kira log N n, n sedang jumlah item yang akan diurutkan dan N menjadi tingkat operasi
penggabungan, Polifase menjanjikan sebuah peningkatan signifikan atas penggabungan seimbang.

2.4.5 Distribusi Proses Awal

komputer kecil termasuk akses acak, toko utama yang hampir selalu lebih besar dari apa yang ada
dibutuhkan oleh program yang dikembangkan di sini. Gagal memanfaatkannya secara optimal tidak
dapat dibenarkan.

Solusinya terletak pada menggabungkan teknik penyortiran array dan urutan. Secara khusus, jenis array
yang diadaptasi mungkin digunakan dalam fase distribusi run awal dengan efek bahwa run ini sudah
memiliki panjang L of kira-kira ukuran penyimpanan data primer yang tersedia. Jelas bahwa dalam
penggabungan berikutnya melewati no jenis array tambahan dapat meningkatkan kinerja karena proses
yang terlibat terus berkembang panjang, dan dengan demikian mereka selalu tetap lebih besar dari toko
utama yang tersedia. Alhasil, untungnya kita bias pusatkan perhatian kami pada peningkatan algoritma
yang menghasilkan proses awal.

Secara alami, kami segera memusatkan pencarian kami pada metode pengurutan array logaritmik. Yang
paling cocok untuk mereka adalah jenis pohon atau metode Heapsort (lihat Bagian 2.2.5). Tumpukan
dapat dianggap sebagai corong melalui mana semua item harus melewati, beberapa lebih cepat dan
beberapa lebih lambat. Kunci paling tidak mudah diambil bagian atas tumpukan, dan penggantiannya
adalah proses yang sangat efisien. Tindakan menyalurkan komponen dari urutan input src (rider r0)
melalui tumpukan penuh H ke dest urutan output (rider r1) mungkin

3 Algoritma Rekursif

3.1 Pendahuluan

Rekursi adalah teknik yang sangat kuat dalam definisi matematika. Beberapa contoh yang sudah dikenal
adalah angka alami, struktur pohon, dan fungsi tertentu:

1. Bilangan alami:

(a) 0 adalah bilangan alami.

(B) penerus nomor alami adalah nomor alami.

2. Struktur pohon

(a) O adalah pohon (disebut pohon kosong).

(B) Jika t1 dan t2 adalah pohon, maka struktur yang terdiri dari simpul dengan dua keturunan t1 dan t2
adalah

juga pohon (biner).


3. Fungsi faktorial f (n):

f (0) = 1

f (n) = n × f (n - 1) untuk n>

Kekuatan rekursi jelas terletak pada kemungkinan mendefinisikan satu set objek yang tak terbatas oleh
yang terbatas pernyataan. Dengan cara yang sama, jumlah perhitungan yang tak terbatas dapat
dijelaskan oleh rekursif terbatas

Seperti pernyataan berulang, prosedur rekursif memperkenalkan kemungkinan tidak terminasi


perhitungan, dan dengan demikian juga perlunya mempertimbangkan masalah penghentian. Dasar
Persyaratan jelas bahwa panggilan rekursif P tunduk pada kondisi B, yang pada suatu waktu menjadi
salah. Skema untuk algoritma rekursif karenanya dapat diekspresikan lebih tepat oleh salah satu salah
satu dari formulir berikut:

P ≡ JIKA B LALU P [S, P] AKHIR

P ≡ P [S, JIKA B LALU AKHIR]

3.2 Kapan Tidak Menggunakan Rekursi

Algoritma rekursif sangat tepat ketika masalah yang mendasarinya atau data yang akan diobati
didefinisikan dalam istilah rekursif. Namun, ini tidak berarti bahwa definisi rekursif seperti itu menjamin
bahwa algoritma rekursif adalah cara terbaik untuk menyelesaikan masalah

Dengan demikian, pelajaran yang bisa ditarik adalah menghindari penggunaan rekursi ketika ada solusi
yang jelas olehperulangan. Namun, ini seharusnya tidak mengarah pada penghindaran dari rekursi
dengan harga berapa pun. Ada banyak penerapan rekursi yang baik, seperti yang akan ditunjukkan oleh
paragraf dan bab berikut. Fakta bahwa implementasi prosedur rekursif pada dasarnya mesin non-
rekursif ada membuktikan bahwa untuk tujuan praktis setiap program rekursif dapat diubah menjadi
program yang murni berulang. Ini, bagaimanapun, melibatkan penanganan eksplisit tumpukan rekursi,
dan operasi ini akan sering mengaburkan esensi sebuah program sedemikian rupa sehingga menjadi
paling sulit untuk dipahami. Pelajarannya adalah algoritma itu yang pada dasarnya bersifat rekursif
daripada berulang har s dirumuskan sebagai prosedur rekursif. Di Untuk menghargai poin ini, pembaca
dirujuk ke algoritma untuk QuickSort dan

Quicksort NonRecursive di Sect. 2.3.3 untuk perbandingan. Bagian selanjutnya dari bab ini dikhususkan
untuk pengembangan beberapa program rekursif di Indonesia situasi di mana rekursi dapat dibenarkan
sesuai. Juga Chap. 4 memanfaatkan rekursi dalam kasus di mana struktur data yang mendasari
membiarkan pilihan solusi rekursif tampak jelas dan alam

3.3 Dua Contoh Program Rekursif


Prosedur Hilbert menggunakan empat prosedur bantu A, B, C, dan D secara rekursif

Keanggunan penggunaan rekursi pada contoh-contoh ini jelas dan meyakinkan. Kebenaran dari program
dapat dengan mudah disimpulkan dari struktur dan pola komposisi mereka. Apalagi penggunaan sebuah
parameter tingkat eksplisit (menurun) menjamin penghentian karena kedalaman rekursi tidak bisa
menjadi lebih besar dari n. Berbeda dengan formulasi rekursif ini, program setara yang menghindari
penggunaan eksplisit rekursi sangat rumit dan tidak jelas. Mencoba memahami program yang
ditunjukkan dalam [3-3] harus dengan mudah meyakinkan pembaca ini
3.4 Algoritma Perulangan

Pola umum adalah untuk menguraikan proses coba-coba tugas parsial. Seringkali tugas-tugas ini paling
alami diungkapkan dalam istilah rekursif dan terdiri dari eksplorasi sejumlah subtugas. Kami biasanya
dapat melihat seluruh proses sebagai percobaan atau pencarian proses yang secara bertahap
membangun dan memindai (memotong) pohon subtugas. Dalam banyak masalah pohon pencarian ini
tumbuh sangat cepat, seringkali secara eksponensial, tergantung pada parameter yang diberikan. Upaya
pencarian meningkat demikian. Seringkali, pohon pencarian dapat dipangkas dengan menggunakan
heuristik saja, sehingga mengurangi perhitungan batas yang bisa ditoleransi.
Contoh Program :

3.5 Masalah Delapan Queens

Delapan ratu poblem dinyatakan sebagai berikut): Delapan ratu harus ditempatkan pada catur

papan sedemikian rupa sehingga tidak ada ratu memeriksa terhadap ratu lainnya. Menggunakan skema
terakhir dari Sekte. 3.4 sebagai a

template, kami siap mendapatkan versi kasar dari solusi:

3.6 Masalah Pernikahan yang Stabil

Asumsikan bahwa dua set disjoint A dan B dengan ukuran yang sama n diberikan. Temukan satu set n
pasangan <a, b> sedemikian rupa sehingga dalam

A dan b dalam B memenuhi beberapa kendala. Ada berbagai kriteria untuk pasangan demikian; salah
satunya adalah aturannya

disebut aturan pernikahan yang stabil .

Asumsikan bahwa A adalah himpunan pria dan B adalah himpunan wanita. Setiap pria dan wanita
menyatakan berbeda
preferensi untuk mitra mereka yang mungkin. Jika n pasangan dipilih sedemikian rupa sehingga ada laki-
laki dan seorang wanita yang belum menikah, tetapi yang keduanya lebih suka satu sama lain dengan
pasangan nikah mereka yang sebenarnya tugasnya tidak stabil. Jika tidak ada pasangan seperti itu, itu
disebut stabil. Situasi ini menjadi ciri banyak orang masalah terkait di mana tugas harus dibuat sesuai
dengan preferensi seperti, misalnya,pilihan sekolah oleh siswa, pilihan rekrutmen oleh cabang berbeda
dari dinas bersenjata, dll.

Contoh pernikahan sangat intuitif; catat, bagaimanapun, bahwa daftar preferensi yang dinyatakan
adalah invarian dan tidak berubah setelah penugasan tertentu dilakukan. Asumsi ini disederhanakan
masalah, tetapi juga merupakan penyimpangan besar realitas (disebut abstraksi).Salah satu cara untuk
mencari solusi adalah dengan mencoba memasangkan anggota dari dua set satu demi satu hingga dua
set habis. Berangkat untuk menemukan semua tugas yang stabil, kita dapat dengan mudah membuat
sketsa solusi dengan menggunakan skema program AllQueens sebagai templat. Biarkan Coba
(m) menunjukkan algoritma untuk menemukan pasangan untuk man m, dan biarkan pencarian ini
berjalan sesuai urutan daftar pilihan pria tersebut. Pertama versi berdasarkan asumsi ini adalah:

3.7 Masalah Pemilihan Optima

Pertama kami menggunakan prinsip backtracking untuk menemukan satu solusi untuk masalah yang
diberikan. Ini dicontohkan oleh tur ksatria dan delapan ratu. Lalu kita menangani tujuan
menemukan semua solusi untuk masalah yang diberikan; contohnya adalah dari delapan ratu dan
pernikahan yang stabil. Sekarang kami ingin menemukan solusi optimal

Untuk tujuan ini, perlu untuk menghasilkan semua solusi yang mungkin, dan dalam proses
menghasilkannya pertahankan yang optimal dalam arti tertentu. Dengan asumsi bahwa optimalitas
didefinisikan dalam istilah beberapa fungsi bernilai positif f (s), algoritma diturunkan dari skema
umum Try dengan mengganti solusi cetak pernyataan oleh pernyataan

Anda mungkin juga menyukai