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.
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.
Tipe primitif baru dapat didefinisikan dengan menyebutkan nilai-nilai berbeda yang dimiliki. Jenis seperti
ini disebut sebuah tipe enumerasi . Definisinya memiliki bentuk
Contohnya
Tipe primitif standar adalah tipe yang tersedia pada kebanyakan komputer sebagai fitur bawaan, Kami
menunjukkan ini jenis oleh pengidentifikasi
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
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.
Dua nilai tipe standar BOOLEAN dilambangkan oleh pengidentifikasi BENAR dan SALAH. Itu Operator
Boolean adalah konjungsi logis, disjungsi, dan negasi
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. "
Jenis SET menunjukkan set yang elemen-elemennya bilangan bulat dalam kisaran 0 hingga sejumlah
kecil, biasanya 31 atau 63.
* mengatur persimpangan
+ mengatur persatuan
- atur perbedaan
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
VAR x: Baris
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,
Contohnya
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.
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
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
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:
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
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
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
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.
Kita sekarang dapat mendalilkan dan menggambarkan secara informal kumpulan primitif berikut
operator:
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)
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.
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 *)
MULAI
Deposit END;
MULAI
END Buffer.
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.
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.
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:
2. Seluruh array telah dipindai, dan tidak ada kecocokan yang ditemukan.
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
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
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
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
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.
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.
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
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.
3. Kemudian ulangi operasi ini dengan item n-1 yang tersisa, kemudian dengan item n-2, hingga hanya
satu item -- yang terbesar - tersisa.
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
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.
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
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
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
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
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:
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,
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 .
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
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.
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:
2. Struktur pohon
(B) Jika t1 dan t2 adalah pohon, maka struktur yang terdiri dari simpul dengan dua keturunan t1 dan t2
adalah
f (0) = 1
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
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
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 :
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
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
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:
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