Anda di halaman 1dari 21

KATA PENGANTAR

Puji syukur ke hadirat Tuhan Yang Maha Esa. Atas rahmat dan hidayah-Nya, penulis
dapat menyelesaikan tugas makalah yang berjudul "Algoritma dan Sejarah Algoritma"
dengan tepat waktu.

Makalah disusun untuk memenuhi tugas Mata Kuliah Algoritma. Selain itu, makalah ini
bertujuan menambah wawasan tentang Algoritma bagi para pembaca dan juga bagi
penulis.

Penulis mengucapkan terima kasih kepada bapak karnadi selaku Dosen Pengajar Mata


Kuliah. Ucapan terima kasih juga disampaikan kepada semua pihak yang telah
membantu diselesaikannya makalah ini.

Penulis menyadari makalah ini masih jauh dari sempurna. Oleh sebab itu, saran dan
kritik yang membangun diharapkan demi kesempurnaan makalah ini.

Palembang,3 Oktober 2022

Penulis

1
2
Algoritma Dan Sejarah Algoritma

Diagram alur dari sebuah algoritme (Algoritme Euclid) untuk menghitung faktor persekutuan terbesar (f.p.b.)
dari dua angka a dan b dalam lokasi bernama A dan B. Algoritme dijalankan dengan pengurangan berturut-
turut dalam dua pengulangan: JIKA pengujian B >= A menghasilkan "ya" (atau benar) (lebih
akuratnya angka b dalam lokasi B lebih besar atau sama dengan angka a dalam lokasi A) MAKA, algoritme
menentukan B ← B - A (artinya angka b - a menggantikan b sebelumnya). Hal yang sama, JIKA A > B, MAKA
A ← A - B. Proses tersebut berhenti saat (isi dari) B adalah 0, menghasilkan f.p.k. dalam A. (Algoritme tersebut
diambil dari Scott 2009:13; simbol dan gaya penggambaran dari Tausworthe 1977).

Dalam matematika dan ilmu komputer, algoritma adalah rangkaian terbatas dari


instruksi-instruksi yang rumit, yang biasanya digunakan untuk menyelesaikan atau
menjalankan suatu kelompok masalah komputasi tertentu. Algoritma digunakan sebagai
spesifikasi untuk melakukan perhitungan dan pemrosesan data. Algoritma yang lebih
mutakhir dapat melakukan deduksi otomatis (disebut sebagai penalaran otomatis) dan
menggunakan tes matematis dan logis untuk mengarahkan eksekusi kode melalui
berbagai rute (disebut sebagai pengambilan keputusan otomatis). Penggunaan

3
karakteristik manusia sebagai deskriptor mesin secara metaforis telah dipraktekkan
oleh Alan Turing dengan terminologi seperti "memory", "search" dan "stimulus". [1]
Sebaliknya, heuristika adalah pendekatan untuk pemecahan masalah komputasi yang
mungkin tidak sepenuhnya terspesifikasi atau tidak menjamin hasil yang benar atau
optimal, terutama dalam ranah masalah komputasi yang mana tidak ada hasil yang
benar atau optimal yang terdefinisi dengan baik. [2]
Sebagai metode yang efektif, algoritma dapat diekspresikan dalam jumlah ruang dan
waktu yang terbatas,[3] dan dalam bahasa formal yang terdefinisi dengan baik [4] untuk
menghitung suatu fungsi.[5] Dimulai dari tataran awal dan input awal (bisa jadi kosong),
[6]
 instruksi-instruksi yang ada menggambarkan sebuah komputasi yang, ketika
dieksekusi, berjalan melalui sejumlah tataran dengan jumlah terhingga yang terdefinisi
dengan baik,[7] yang pada akhirnya menghasilkan "output" [8] dan berakhir pada tataran
final akhir. Transisi dari satu tataran ke tataran berikutnya tidak selalu bersifat
menentukan; beberapa algoritme, yang dikenal sebagai algoritme acak,
menggabungkan input acak.[9]

Sejarah[sunting | sunting sumber]
Konsep algoritma telah ada sejak zaman prasejarah. Algoritma aritmatika, seperti
algoritma divisi, digunakan oleh matematikawan Babilonia kuno sekitar tahun
2500 SM dan matematikawan Mesir sekitar tahun 1550 SM.
Matematikawan Yunani kemudian juga menggunakan algoritma pada 240 SM
sebagaimana yang terdapat pada Tapis Eratosthenes untuk menemukan bilangan
prima, dan Algoritma Euklides untuk menemukan pembagi persekutuan terbesar dari
dua bilangan.[10] Matematikawan Arab seperti al-Kindi pada abad ke-9 menggunakan
algoritma kriptografi untuk pemecahan kode, berdasarkan analisis frekuensi.
Kata algoritma berasal dari nama matematikawan Persia abad ke-9, Muḥammad bin
Mūsā al-Khwārizmī, yang nisbah-nya (yang mengidentifikasikannya sebagai seseorang
yang berasal dari Khwarezmia) dilatinkan sebagai Algoritmi (bahasa Persia yang
diarabkan: ‫ الخوارزمی‬sekitar: 780-850).[11][12] Namanya bermakna 'yang berasal dari
(daerah) Khwarezmia', sebuah daerah yang dulunya merupakan bagian dari Iran
Raya dan sekarang sebagai bagian dari Uzbekistan.[13][14] Sekitar tahun 825, Al-
Khwarizmi menulis sebuah risalah berbahasa Arab tentang sistem angka Hindu-Arab,
yang diterjemahkan ke dalam bahasa Latin selama abad ke-12. Naskah ini dimulai
dengan frasa Dixit Algorizmi ('Maka berkatalah Al-Khwarizmi'), di mana "Algorizmi" di
sini adalah Latinisasi penerjemah akan nama Al-Khwarizmi.[15] Bukunya yang bernama
Aljabar menjadi salah satu buku matematikawan yang paling banyak dibaca di Eropa
pada abad pertengahan.[16] Dalam bahasa Latin abad pertengahan,
kata algorismus, yang merupakan pengadaptasian dari namanya, menjadi kata yang
bermakna "sistem bilangan desimal". [17] Pada abad ke-15, di bawah pengaruh kata
Yunani ἀριθμός (arithmos), 'angka' (lih. 'aritmatika'), kata Latin-nya diubah menjadi
algorithmus.[18] Dalam bahasa Inggris, kata algorithm pertama kali digunakan pada
sekitar tahun 1230 dan kemudian oleh Chaucer pada 1391. Bahasa Inggris mengadopsi
istilah tersebut dari bahasa Prancis, akan tetapi baru pada abad ke-19 lah kata

4
"algorithm" mulai memiliki makna seperti sekarang yang ada dalam bahasa Inggris
modern.[19]
Matematika India pada awalnya sebagian besar berbentuk algoritmik. Algoritma yang
mewakili tradisi matematika India berkisar dari Śhulba Sūtrā dari beberapa abad
sebelum masehi hingga teks-teks abad pertengahan dari Sekolah Kerala akan
Astronomi dan Matematika.[20]
Pemakaian awal lainnya dari kata ini berasal dari tahun 1240, dalam sebuah manual
berjudul Carmen de Algorismo yang disusun oleh Alexandre de Villedieu. Yang
kalimatnya diawali dengan:
Haec algorismus ars praesens dicitur, in qua / Talibus Indorum fruimur bis quinque
figuris.
yang bermakna:
Algorisme adalah ilmu yang saat ini kita gunakan untuk menghitung dengan angka-
angka India, yang jumlahnya ada dua kali lima (sepuluh).
Puisi ini panjangnya beberapa ratus baris dan merangkum ilmu menghitung dengan
angka-angka yang diadopsi dari India.[21]
Formalisasi parsial dari konsep algoritma modern dimulai dengan upaya untuk
memecahkan Entscheidungsproblem (masalah pengambilan keputusan) yang diajukan
oleh David Hilbert pada tahun 1928. Formalisasi selanjutnya dibingkai sebagai upaya
untuk mendefinisikan "kalkulabilitas efektif" [22] atau "metode efektif".[23] Formalisasi
tersebut termasuk fungsi rekursif Gödel-Herbrand-Kleene pada tahun 1930, 1934 dan
1935, kalkulus lambda Alonzo Church pada tahun 1936, Formulasi 1 Emil Post pada
tahun 1936, dan mesin Turing-nya Alan Turing pada tahun 1936-37 dan 1939.

Definisi informal[sunting | sunting sumber]


Untuk penjelasan lebih rinci dari berbagai sudut pandang mengenai definisi "algoritme",
lihat Karakterisasi Algoritme.
Definisi informalnya bisa berarti "sekumpulan aturan yang secara tepat menentukan
seurutan operasi". [24] yang mengikutkan semua program komputer, termasuk program
yang tidak melakukan perhitungan numerik. Secara umum, sebuah program hanyalah
sebuah algoritme jika ia akan berhenti nantinya. [25]
Sebuah contoh prototipikal dari suatu algoritme adalah algoritme Euclid untuk
menentukan bilangan pembagi terbesar dari dua integer; sebagai contohnya (ada
contoh yang lain) dijelaskan dengan diagram alur di atas dan sebagai contoh di bagian
lanjut.
(Boolos & Jeffrey 1974, 1999) memberikan sebuah makna informal dari kata algoritme
dalam persamaan berikut:
Tidak ada manusia yang dapat menulis begitu cepat, atau begitu lama, atau begitu kecil
("kecil, dan lebih kecil tanpa batas ... anda mungkin mencoba menulis di atas molekul,
atom, elektron") untuk mencatat semua anggota dari kumpulan bilangan tak terbatas
dengan menuliskan namanya, bergantian, dalam suatu notasi. Tapi manusia bisa

5
melakukan sesuatu yang sama bergunanya, pada kasus kumpulan bilangan tak
terbatas: Mereka dapat memberikan instruksi jelas untuk menentukan anggota ke-
n dari set, untuk n terbatas acak. Instruksi tersebut diberikan secara eksplisit, dalam
bentuk yang dapat diikuti oleh mesin penghitung, atau oleh manusia yang mampu
melakukan hanya operasi-operasi dasar dengan simbol-simbol. [26]
Suatu "bilangan tak-terbatas" adalah bilangan yang elemen-elemenya bisa
berkorespondensi satu-ke-satu dengan integer. Maka, Boolos dan Jeffrey mengatakan
bahwa sebuah algoritme berarti instruksi bagi sebuah proses yang "membuat" keluaran
integer dari sebuah "masukan" acak integer yang, secara teori, bisa sangat besar.
Maka sebuah algoritme dapat berupa persamaan aljabar seperti y = m + n -- dua
variabel masukan m dan n yang menghasikan keluaran y. Tapi berbagai penulis yang
mencoba mendefinisikan persamaan tersebut mengatakan bahwa kata algoritme
mengandung lebih dari itu, sesuatu yang kurang lebih (untuk contoh penjumlahan):
Instruksi rinci dan tepat (dalam bahasa yang dipahami oleh "komputer") [27] untuk
proses yang cepat, efisien, "baik"[28] yang menentukan "pergerakan" dari
"komputer" (mesin atau manusia, dibekali dengan informasi dan kemampuan
internal yang dibutuhkan)[29] untuk menemukan, dekode, dan kemudian mengolah
masukan integer/simbol m dan n, simbol + dan = ... dan "secara
efektif"[30] menghasilkan, dalam waktu yang "masuk akal", [31] keluaran
integer y pada tempat dan format tertentu.
Konsep dari algoritme juga digunakan untuk mendefinisikan notasi
dari desidabilitas. Notasi tersebut adalah pusat untuk menjelaskan
bagaimana sistem formal berasal dari sejumlah kecil aksioma dan aturan.
Dalam logika, waktu dari sebuah algoritme untuk selesai tidak dapat dihitung,
karena tidak berelasi dengan dimensi fisik kita. Dari ketidakpastian tersebut, yang
mengkarakteristikan pekerjaan yang sedang berjalan, timbulah ketidak-tersediannya
definisi algoritme yang sesuai dengan konkret (pada tingkat tertentu) dan
penggunaan secara abstrak dari istilah tersebut.

Formalisasi[sunting | sunting sumber]
Algoritme sangat penting bagi cara komputer mengolah data. Banyak program
komputer mengandung algoritme memberikan rincian pada instruksi khusus yang
komputer harus lakukan (dengan urutan tertentu) untuk menjalankan pekerjaan
tertentu, seperti menghitung gaji karyawan atau mencetak kartu rapor siswa. Maka,
sebuah algoritme bisa dianggap sebagai urutan operasi yang bisa disimulasikan
oleh sebuah sistem Turing-lengkap. Penulis yang mendukung tesis ini termasuk
Minsky (1967), Savage (1987), dan Gurevich (2000):
Minsky: "Tapi kita juga menjaga, dengan Turing ... bahwa setiap prosedur yang
"secara alami" disebut efektif, bisa dinyatakan oleh mesin (sederhana). Walaupun
tampaknya ekstrem, alasan tersebut ... sukar disanggah". [32]
Gurevich: "... argumen informal Turing untuk menyokong tesis ini membenarkan
tesis yang lebih kuat: setiap algoritme bisa disimulasikan oleh sebuah mesin

6
Turing ... menurut Savage [1987], sebuah algoritme adalah sebuah proses
penghitungan yang ditentukan oleh sebuah mesin Turing". [33]
Biasanya, bila sebuah algoritme dihubungkan dengan pengolahan informasi, data
dibaca dari sumber masukan, ditulis ke perangkat keluaran, dan/atau disimpan
untuk pengolahan selanjutnya. Data simpanan dianggap sebagai bagian dari
keadaan internal dari entitas yang melakukan algoritme. Pada praktiknya, keadaan
tersebut disimpan pada satu atau lebih struktur data.
Untuk beberapa proses komputasi, algoritme harus ditentukan secara teliti:
dijabarkan dengan cara ia bakal berlaku untuk semua kemungkinan yang dapat
timbul. Yaitu, setiap langkah tambahan harus secara sistematis dihadapi, kasus-per-
kasus; Kriteria bagi setiap kasus harus jelas (dan bisa dihitung).
Karena sebuah algoritme adalah kumpulan dari langkah-langkah yang tepat, urutan
dari komputasi selalu penting bagi berfungsinya algoritme. Instruksi biasanya
diasumsikan terdaftar secara eksplisit, dan dijelaskan dimulai "dari atas" dan terus
"ke bawah", sebuah gambaran yang dijelaskan secara formal oleh alur kontrol
Sejauh ini, diskusi tentang formalisasi algoritme telah mengasumsikan premis
dari pemrograman imperatif. Hal ini merupakan konsepsi umum, yang mencoba
menjelaskan sebuah pekerjaan dalam makna diskrit dan "mekanis". Keunikan dari
konsepsi formalisasi algoritme adalah operasi penetapan, mengatur nilai dari
sebuah variabel. Ia berasal dari intuisi "ingatan" sebagai kertas buram. Contoh
operasi penetapan tersebut ada di bawah.
Untuk konsepsi yang lain dari apa yang membentuk sebuah algoritme
lihat pemrograman fungsional dan pemrograman logika.
Menggambarkan algoritme[sunting | sunting sumber]
Algoritme dapat digambarkan dengan banyak notasi, termasuk bahasa
alamiah, pseudokode, diagram alur, bagan drakon, bahasa pemrograman atau tabel
kontrol (diproses oleh penerjemah). Ekspresi bahasa alamiah terhadap algoritme
condong lebih banyak dan rancu, dan jarang digunakan untuk algoritme yang
kompleks dan teknis. Pseudokode, diagram alur, bagan drakon, dan tabel kontrol
adalah cara yang terstruktur untuk menggambarkan algoritme yang mencegah
banyaknya kerancuan pada pernyataan-pernyataan bahasa alamiah. Bahasa
pemrograman ditujukan untuk mengekspresikan algoritme dalam sebuah bentuk
yang dapat dieksekusi oleh komputer, tetapi sering kali digunakan sebagai suatu
cara untuk menentukan atau mendokumentasikan algoritme.
Ada banyak macam kemungkinan representasi dan seseorang dapat
mengekspresikan sebuah program mesin Turing sebagai urutan dari tabel-tabel
mesin (lihat lebih lanjut di mesin kondisi-terbatas, tabel transisi kondisi dan tabel
kontrol), sebagai diagram alur dan bagan drakon (lihat lebih lanjut di diagram
kondisi), atau sebagai bentuk kode mesin atau kode assembly dasar yang dikenal
"kumpulan lipat empat" (lihat lebih lanjut di mesin Turing).
Representasi dari algoritme dapat dikelompokan ke dalam tiga tingkatan dari
deskripsi mesin Turing: [34]

7
1 Deskripsi tingkat-tinggi
"... ditujukan untuk menjelaskan algoritme, menghiraukan rincian implementasi.
Pada tingkat ini kita tidak perlu menyebutkan bagaimana mesin mengatur
perangkat pita atau kepala pita rekam."
2 Deskripsi implementasi
"... digunakan untuk menjelaskan cara mesin Turing menggunakan kepalanya
dan cara menyimpan data. Pada tingkat ini kita tidak memberikan secara rinci
kondisi atau fungsi transisi."
3 Deskripsi formal
Lebih rinci, "tingkat paling rendah", menjelaskan "tabel kondisi" dari mesin
Turing.
Sebagai contoh dari algoritme sederhana "Penjumlahan m+n" dijelaskan
dalam tiga tingkatan tersebut lihat contoh algoritme.

Implementasi[sunting | sunting sumber]
Kebanyakan algoritme ditujukan untuk diimplementasikan
sebagai program komputer. Namun, algoritme juga diimplementasikan
dengan tujuan lain, seperti dalam jaringan saraf biologis (sebagai
contohnya, otak manusia yang mengimplementasikan aritmetika atau
sebuah serangga yang melihat makanan), dalam sirkuit elektris, atau
dalam sebuah perangkat mekanis.

Algoritme komputer[sunting | sunting sumber]

8
Contoh diagram alur dari struktur Bohm-Jacopini: URUTAN (segi empat), WHILE-DO
dan IF-THEN-ELSE. Ketiga struktur dibentuk dari kondisi primitif GOTO
(  IF test=true THEN GOTO step xxx  ) (wajik), GOTO tak bersyarat (segi

empat), berbagai operator penetapan (segi empat), dan HALT (bujursangkar).


Memasukan struktur tersebut ke dalam blok-penetapan menghasilkan diagram yang
kompleks (cf Tausworthe 1977:100,114).

Dalam sistem komputer, sebuah algoritme pada dasarnya adalah instansi


dari logika ditulis dalam perangkat lunak oleh pengembang perangkat
lunak supaya efektif untuk komputer yang "ditargetkan" untuk mesin
tertentu untuk menghasilkan keluaran dari masukan yang diberikan
(kemungkinan nul).
Program yang "elegan" (padat), program yang "baik" (cepat): Pernyataan
dari "sederhana dan elegan" muncul secara informal dalam buku Knuth
dan dalam Chaitin:
Knuth: "... kita menginginkan algoritme yang baik dalam definisi estetika
sederhana. Salah satu kriterianya ... adalah waktu yang dibutuhkan untuk

9
berjalannya algoritme ... Kriteria yang lain adalah adaptasi dari algoritme ke
komputer, kesederhanaan dan elegan, dll" [35]
Chaitin: "... sebuah program adalah 'elegan, maksud saya adalah ia merupakan
program terkecil untuk menghasilkan keluaran." [36]
Chaitin membuka definisinya dengan: "Saya akan perlihatkan
bahwa anda tidak dapat membuktikan sebuah program adalah
'elegan'"—bukti tersebut akan menyelesaikan permasalahan
perhentian (ibid).
Algoritme terhadap fungsi yang dapat dihitung oleh algoritme:
Untuk sebuah fungsi bisa ada beberapa algoritme. Hal ini benar,
bahkan tanpa mengembangkan kumpulan instruksi yang ada bagi
programmer. Rogers mengamati bahwa "Sangat ... penting untuk
membedakan antara pengertian algoritme, misalnya prosedur dan
pernyataan fungsi yang dihitung oleh algoritme, misalnya
pemetaan hasil dari prosedur. Fungsi yang sama bisa memiliki
beberapa algoritme berbeda". [37]
Sayangnya ada pertukaran antara kebaikan (kecepatan) dan
elegan (kepadatan) -- sebuah program yang elegan bisa
melakukan lebih banyak langkah untuk menyelesaikan sebuah
komputasi daripada yang kurang elegan. Sebuah contoh yang
menggunakan algoritme Euclid bisa dilihat di bawah.
Komputer (dan komputor), model dari komputasi: Sebuah
komputer (atau manusia "komputor" [38] ) adalah tipe terbatas dari
mesin, sebuah "perangkat mekanis deterministik diskrit" [39] yang
secara buta mengikuti instruksinya.[40] Model primitif dari Melzak
dan Lambek [41] mereduksi pemikiran tersebut menjadi empat
elemen: (i) diskrit, lokasi yang bisa dibedakan, (ii)
diskrit, penghitung yang tak bisa dibedakan [42] (iii) sebuah agen,
dan (iv) sebuah daftar instruksi yang efektif relatif terhadap
kemampuan dari agen. [43]
Minsky menjelaskan variasi yang lebih sesuai dari model
"abacus"-nya Lambek dalam "Basis Komputabilitas Paling
Sederhana". [44] Mesin Minsky memproses secara berurutan lewat
lima (atau enam tergantung bagaimana seseorang
menghitungnya) instruksi kecuali baik sebuah kondisi IF-THEN
GOTO atau GOTO tak bersyarat mengubah alur program keluar
dari urutan. Selain HALT, mesin Minsky mengikutkan tiga
operasi penetapan (penggantian, substitusi): [45] ZERO (misalnya,
isi dari lokasi diganti oleh 0: L ← 0), SUCCESSOR (misalnya, L ←
L+1), dan DECREMENT (misalnya, L ← L-1). [46] Jarang seorang
programer harus menulis "kode" dengan kumpulan instruksi
terbatas. Tapi Minsky memperlihatkan (sebagaimana Melzak dan
Lambek) bahwa mesinnya adalah Turing komplet dengan hanya

10
empat tipe instruksi utama: GOTO kondisional, GOTO tak
bersyarat, penetapan/penggantian/substitusi, dan HALT. [47]
Simulasi dari sebuah algoritme: bahasa komputer (komputor):
Knuth menganjurkan pembaca bahwa "cara terbaik untuk belajar
algoritme dalah mencobanya ... langsung ambil pulpen dan kertas
dan bekerja lewat contoh". [48] Lalu bagaimana dengan simulasi
atau eksekusi yang sebenarnya? Programmer harus
menerjemahkan algoritme ke dalam bahasa yang mana
simulator/komputer/komputor dapat mengeksekusi secara efektif.
Stone memberikan contoh dari hal ini: saat menghitung akar dari
persamaan kuadrat si komputor harus tahu bagaimana
mendapatkan akar kuadrat. Jika tidak maka supaya algoritme
dapat efektif ia harus menyediakan sejumlah aturan untuk
mengekstrak akar kuadrat. [49]
Hal ini berarti programer harus tahu sebuah "bahasa" yang efektif
relatif terhadap target pada agen komputasi (komputer/komputor).
Lalu model apa yang seharusnya digunakan untuk simulasi? Van
Emde Boas mengamati "bahkan bila kita mendasari teori
kompleksitas dengan mesin abstrak bukannya mesin kongkrit,
kesembarangan dari pemilihan model masih tetap ada. Pada titik
itulah mulainya pemikiran simulasi". [50] Bila kecepatan yang
dihitung, jumlah instruksi berpengaruh. Sebagai contohnya,
subprogram dalam algoritme Euclid untuk menghitung sisa akan
berjalan lebih cepat jika programmer memiliki instruksi "modulus"
(sisa pembagian) bukannya dengan pengurangan (atau lebih
parah: hanya "penurunan").
Pemrograman terstuktur, struktur kanonikal: Menurut Tesis
Church-Turing setiap algoritme bisa dihitung dengan sebuah
model yang dikenal Turing komplet, dan menurut demonstrasi
Minsky kekomplitan Turing membutuhkan hanya empat tipe
instruksi—GOTO bersyarat, GOTO tak bersyarat, penetapan,
HALT. Kemeny dan Kurtz mengamati bahwa saat penggunaan
GOTO tak bersyarat yang "tak disiplin" dan IF-THEN GOTO
bersyarat bisa menghasilkan "kode spageti" seorang programer
bisa menulis program terstruktur menggunakan instruksi tersebut;
di lain sisi "juga memungkinkan, dan tidak begitu sulit, untuk
menulis sebuah program terstruktur yang buruk dalam sebuah
bahasa terstruktur". [51] Tausworthe menambahkan tiga struktur
kanon Bohm-Jacopini: [52] SEQUENCE, IF-THEN-ELSE, dan
WHILE-DO, dengan dua lagi: DO-WHILE dan
CASE. [53] Keuntungan dari program terstruktur adalah ia cocok
dengan pembuktian kebenaran menggunakan induksi
matematika. [54]

11
Simbol diagram alur[55]: Pembantu grafik yang disebut diagram
alur memberikan suatu cara untuk menjelaskan dan
mendokumentasikan sebuah algoritme (dan program komputer).
Seperti alur program dari mesin Minsky, sebuah diagram alur
selalu mulai dari atas dan terus ke bawah. Simbol utamanya
hanya 4: arah panah memperlihatkan alur program, segi empat
(SEQUENCE, GOTO), wajik (IF-THEN-ELSE), dan titik (OR).
Struktur kanonikal Bohm-Jacopini dibuat dari bentuk-bentuk
primitif tersebut. Sub-struktur bisa "bersarang" dalam segi empat
hanya jika jalan keluar tunggal terjadi pada super-struktur. Simbol
dan penggunaannya untuk membangun struktur kanonikal
diperlihatkan dalam diagram.

Contoh[sunting | sunting sumber]
Info lebih lanjut: Contoh algoritme
Contoh Algoritme[sunting | sunting sumber]

Animasi dari algoritme quicksort mengurutkan larik dari nilai acak. Batang


merah menandakan elemen pivot; pada awal animasi, elemen paling kanan
dipilih sebagai pivot.

Salah satu dari algoritme sederhana adalah menemukan bilangan


terbesar dalam sebuah deretan angka (tak berurut). Solusinya
membutuhkan pemeriksaan setiap angka dalam deret, tetapi
hanya sekali. Dari hal ini munculah algoritme sederhana, yang
bisa dinyatakan dalam kalimat bahasa deskripsi tingkat-tinggi,
sebagai:
Deskripsi tingkat-tinggi:

1. Jika tidak ada angka dalam deret makan tidak ada


bilangan terbesar.
2. Asumsikan item pertama dalam deret adalah yang
terbesar.
3. Untuk setiap sisa angka dalam deret, jika angka tersebut
besar dari angka terbesar sekarang, anggap angka
tersebut menjadi yang terbesar dalam deret.

12
4. Bila tidak ada lagi angka yang tersisa pada deret untuk
diperiksa, anggap angka terbesar sekarang menjadi angka
yang terbesar dalam deret.
Deskripsi (Quasi-)formal: Ditulis dalam kalimat yang lebih dekat
dengan bahasa tingkat-tinggi dari program komputer, berikut ini
adalah kode formal dari algoritme dalam pseudokode atau kode
pijin:

Algoritma LargestNumber
Masukan: Deret angka L.
Keluaran: Angka terbesar dalam daftar L.
terbesar ← Lnull
untuk setiap item dalam L, lakukan
jika item > terbesar, maka
terbesar ← item
kembalikan terbesar

 "←" adalah singkatan untuk "diubah menjadi". Misalnya, "terbesar ← item" artinya


nilai dari terbesar diubah menjadi nilai dari item.
 "kembalikan" mengakhiri algoritma dan mengeluarkan nilai kembalian.

Algoritme Euclid[sunting | sunting sumber]


Info lebih lanjut: Algoritme Euklid

Contoh diagram dari algoritme Euclid dari T.L. Health 1908 dengan rincian
tambahan. Euclid tidak sampai pada penghitungan ketiga dan tidak memberikan
contoh numeris. Nocomachus memberikan contoh dari 49 dan 21: "Saya
mengurangi yang kecil dari yang besar; 28 adalah yang kiri; kemudian saya kurangi
lagi 21 (hal ini memungkinkan); tersisa 7, tetapi 7 tidak bisa dikurangi dari 7." Heath
berkomentar bahwa, "Kalimat terakhir terdengar aneh, tetapi maknanya sangat
jelas, begitu juga makna dari kalimat tentang mengakhiri 'dengan satu dan angka
yang sama'."(Heath 1908:300).

13
Algoritme Euclid muncul sebagai Proposisi II dalam Book VII
("Elementary Number Theory") dari Elements. [56] Euclid
mengajukan permasalahan: "Ambil dua angka bukan prima, untuk
mencari bilangan pembagi terbesar". Dia menentukan "Sebuah
angka [merupakan] besaran yang terdiri dari unit-unit": angka
penghitung, integer positif kecuali 0. Dan "mengukur" adalah
menempatkan ukuran panjang terkecil s dengan tepat (q kali) di
antara ukuran terpanjang l sampai sisa r lebih kecil dari panjang
terkecil s. [57] Dalam dunia modern, sisa r = l - q*s, q sebagai hasil
bagi, atau sisa r adalah "modulus", bagian sisa-integer yang
tersisa setelah pembagian. [58]
Supaya metode Euclid berhasil, panjang awalnya harus
memenuhi dua kebutuhan: (i) panjangnya tidak 0, DAN (ii) hasil
pengurangan harus "lebih", sebuah pengujian harus menjamin
bahwa bilangan terkecil dari dua angka adalah hasil pengurangan
dari yang terbesar (cara lain, keduanya bisa sama sehingga
pengurangan menghasilkan 0).
Pembuktian asli Euclid mengikutkan kebutuhan yang ketiga:
kedua panjang bukanlah bilangan prima. Euclid menentukan hal
ini supaya dia bisa membentuk sebuah bukti reductio ad
absurdum bahwa dua pembagi dua angka adalah
yang terbesar. [59] Walau algoritme Nicomachus sama dengan
Euclid, bila kedua bilangan prima maka menghasilkan angka "1"
untuk bilangan pembagi terbesar. Jadi untuk lebih jelasnya
algoritme berikut adalah algoritme Nicomachus.
Contoh[sunting | sunting sumber]

Ekspresi grafik dari algoritme Euclid menggunakan contoh dengan 1599 dan
650.

9778 = 650*2 + 299


650 = 299*2 + 52
299 = 52*5 + 39
52 = 39*1 + 13

14
39 = 13*3 + 0

Bahasa komputer untuk algoritme Euclid[sunting | sunting sumber]


Hanya beberapa tipe instruksi yang dibutuhkan untuk
mengeksekusi algoritme—beberapa tes logika (GOTO bersyarat),
GOTO tak bersyarat, penetapan (penggantian), dan
pengurangan.

 Sebuah lokasi disimbolkan dengan huruf besar, misalnya, S,


A, dll.
 Kuantitas beragam (angka) dalam sebuah lokasi ditulis
dengan huruf kecil dan (biasanya) dihubungkan dengan nama
lokasi. Sebagai contohnya, lokasi L pada awal bisa
mengandung angka l = 3009.
Program yang kurang elegan (inelegan) untuk algoritme
Euclid[sunting | sunting sumber]

"Inelegan" adalah terjemahan dari versi Knuth terhadap algoritme berdasarkan


pengulangan-sisa mengganti pembagian (atau instruksi "modulus"). Diambil
dari Knuth 1973:2-4. Bergantung pada kedua angka "Inelegan" bisa
menghitung f.p.k dengan sedikit langkah daripada "elegan".

Algoritme berikut disebut sebagai versi Euclid dan Nichomachus


4-langkah-nya Knuth, tetapi bukannya menggunakan pembagi
untuk menentukan sisa ia menggunakan pengurangan berturut-
turut dari panjang terkecil s dari sisa panjang r sampai r kurang

15
dari s. Deskripsi tingkat-tinggi, diperlihatkan dengan tulisan tebal,
diadaptasi dari Knuth 1973:2-4:
INPUT:

1 [Kedalam dua lokasi L dan S taruh angka l dan s yang


merepresentasikan kedua panjang]:
INPUT L, S
2 [Inisialisasi R: buat supaya sisa panjang r sama dengan
panjang awal l]
R ← L

E0: [Pastikan r ≥ s.]

3 [Pastikan angka terkecil dari kedua angka ada dalam S


dan yang terbesar di R]:
IF R > S THEN
isi dari L adalah angka terbesar jadi lewati langkah
4, 5 dan 6:
GOTO step 6
ELSE
tukar isi R dan S.
4 L ← R (langkah pertama ini berlebih, tetapi berguna
untuk diskusi nanti).
5 R ← S
6 S ← L

E1: [Cari sisa]: Sampai sisa panjang r di R kurang dari panjang


terkecil s pada S, kurangi angka s dalam S berulang kali dari sisa
panjang r dalam R.

7 IF S > R THEN
selesai mengukur jadi
GOTO 10
ELSE
ukur lagi,
8 R ← R - S
9 [Pengulangan-sisa]:
GOTO 7.

E2: [Apakah sisa 0?]: APAKAH (i) pengukuran terakhir adalah


sama dan sisa di R adalah 0 program dapat berhenti, ATAU (ii)
algoritme harus terus jalan: hasil pengukuran meninggalkan sisa
di R kurang dari angka pengukuran dalam S.

10 IF R = 0 THEN
selesai jadi
GOTO langkah 15
ELSE

16
lanjut ke langkah 11,

E3: [Interchange s dan r]: Sulitnya algoritme Euclid.


Menggunakan sisa r untuk mengukur angka terkecil
sebelumnya s:; L sebagai lokasi sementara.

11 L ← S
12 R ← S
13 S ← L
14 [Ulang proses pengukuran]:
GOTO 7

OUTPUT:

15 [Selesai. S berisi faktor persekutuan terbesar]:


PRINT S

DONE:

16 HALT, END, STOP.

Program elegan untuk algoritme Euclid[sunting | sunting sumber]


Versi algoritme Euclid berikut hanya membutuhkan 6 instruksi inti
untuk melakukan 13 langkah pada solusi "inelegan"; parahnya,
"inelegan" membutuhkan tipe instruksi lebih banyak. Diagram alur
dari "elegan" bisa dilihat pada bagian atas artikel ini. Dalam
bahasa Basic (tak terstruktur) langkahnya diberi nomor, dan
instruksi LET [] = [] adalah instruksi penetapan disimbolkan
dengan ←.

5 REM Algoritme Euclid untuk faktor persekuturan


terbesar
6 PRINT "Masukan dua integer besar dari 0"
10 INPUT A,B
20 IF B=0 THEN GOTO 80
30 IF A > B THEN GOTO 60
40 LET B=B-A
50 GOTO 20
60 LET A=A-B
70 GOTO 20
80 PRINT A
90 END

Bagaimana cara kerja "Elegan": Sebagai pengganti "pengulangan


Euclid" luar, "Elegan" mengulang antara dua pengulangan,
pengulangan A > B yang menghitung A ← A - B, dan pengualang

17
B ≤ A yang menghitung B ← B - A. Hal ini bekerja karena, saat
yang dikurang M lebih kecil pengurang S ( Selisih = pengurang -
yang_di_kurang ), yang_dikurang bisa menjadi s (panjang
pengukuran yang baru) dan pengurang bisa menjadi r yang baru
(panjang yang akan diukur); dengan kata lain "arti" dari
pengurangan dibalik.
Menguji algoritme Euclid[sunting | sunting sumber]
Apakah algoritme berjalan seperti yang penulis inginkan?
Beberapa kasus uji cukup menentukan fungsi inti. Sumber
pertama [60] menggunakan 3009 dan 884. Knuth menyarankan
40902, 24140. Kasus menarik lainnya yaitu dua angka relatif
prima 14157 dan 5950.
Tapi kasus pengecualian harus teridentifikasi dan diuji. Apakah
"inelegan" berjalan benar saat R > S, S > R, R = S? Sama juga
dengan "Elegan": B > A, A > B, A = B? (Semuanya benar). Apa
yang terjadi bila salah satu bilangan nol, atau keduanya nol?
("Inelegan" terus berjalan pada kedua kasus; "elegan" terus
berjalan saat A = 0.) Apa yang terjadi bila
angka negatif dimasukan? Angka desimal? Bila angka masukan,
misalnya domain dari fungsi yang dihitung oleh
algoritme/program, mengikutkan hanya integer positif termasuk 0,
maka kegagalan pada nol mengindikasikan bahwa algoritme (dan
program instansiasinya) adalah sebuah fungsi
parsial bukannya fungsi total. Kesalahan yang terkenal karena
eksepsi adalah kegagalan roket Ariane V.
Bukti dari kebenaran program menggunakan induksi matematika:
Knuth mendemonstrasikan penggunaan induksi matematika untuk
versi "pengembangan" dari algoritme Euclid, dan dia mengajukan
"metode umum yang digunakan untuk membuktikan validitas dari
setiap algoritme." [61] Tausworthe mengajukan bahwa sebuah
pengukuran dari kompleksitas dari sebuah program adalah
panjang dari pembuktian kebenarannya. [62]
Menghitung dan meningkatkan algoritme
Euclid[sunting | sunting sumber]
Elegan (kepadatan) lawan kebaikan (kecepatan): Dengan hanya 6
instruksi dasar, "Elegan" adalah jelas pemenang dibandingkan
dengan instruksi "inelegan" dengan 13 instruksi. Namun,
"inelegan" lebih cepat (ia sampai pada HALT dengan langkah
lebih sedikit). Analisis algoritme [63] mengindikasikan kenapa hal
tersebut terjadi: "Elegan" melakukan pengujian kondisi dua kali
disetiap pengulangan pengurangan, sementara "inelegan" hanya
sekali. Bila algoritme (biasanya) membutuhkan banyak
pengulangan, secara rata-rata lebih banyak waktu yang terbuang

18
saat melakukan tes "B = 0?" yang hanya diperlukan saat sisa
sudah dihitung.
Bisakah algoritme ditingkatkan?: Bila programmer sudah menilai
sebuah program "cocok" dan "efektif"—yaitu, ia menghitung fungsi
yang ditujukan oleh penulisnya—maka pertanyaannya menjadi,
bisakah ditingkatkan?
Kepadatan dari "inelegan" bisa ditingkatkan dengan
menghilangkan 5 langkah. Tapi Chaitin membuktikan bahwa
memadatkan algoritme tidak bisa diotomatiskan dengan algoritme
generalisasi; [64] tapi, ia bisa dilakukan secara heuristik, misalnya
dengan pencarian menyeluruh (contohnya bisa ditemukan
di Berang sibuk), coba dan gagal, kecerdasan, kedalaman,
penggunaan penalaran induktif, dll. Bisa diamati bahwa langkah
4, 5, dan 6 diulang pada langkah 11, 12, dan 13. Pembandingan
dengan "Elegan" menyediakan petunjuk langkah-langkah tersebut
dengan langkah 2 dan 3 dapat dihilangkan. Hal ini mereduksi
jumlah instruksi dasar dari 13 menjadi 8, yang membuatnya "lebih
elegan" dari "Elegan" dengan 9 langkah.
Kecepatan "Elegan" bisa ditingkatkan dengan memindahkan tes
B=0? keluar dari pengulangan. Perubahan ini memerlukan
penambahan 3 instruksi (B=0?, A=0?, GOTO). Sekarang
"Elegant" menghitung contoh-angka lebih cepat; untuk setiap
angka pada A, B dan R, S hal ini selalu merupakan kasus yang
membutuhkan analisis yang mendalam.

Analisis Algoritme[sunting | sunting sumber]


Artikel utama: Analisis algoritme
Sangat penting untuk mengetahui berapa banyak sumber tertentu
(seperti waktu dan tempat penyimpanan) secara teoretis
diperlukan untuk sebuah algoritme. Metode-metode telah
dikembangkan untuk analisis algoritme untuk mendapatkan
jawaban kuantitatif (estimasi); sebagai contohnya, algoritme
pengurutan di atas memerlukan waktu O(n), menggunakan notasi
O besar dengan n sebagai panjang deret (yang akan diurut).
Setiap saat algoritme hanya perlu mengingat dua nilai: nilai
terbesar yang ditemukan, dan posisinya sekarang dideretan input.
Oleh karena itu dikatakan memiliki kebutuhan ruang O(1), jika
ruang yang dibutuhkan untuk menyimpan angka masukan tidak
dihitung, atau O(n) jika dihitung.
Algoritme berbeda mungkin menyelesaikan pekerjaan yang sama
dengan kumpulan instruksi yang berbeda dengan waktu, ruang,
atau 'usaha' lebih sedikit atau banyak dari yang lain. Sebagai
contohnya, algoritme pencairan binari biasanya mengungguli

19
pencarian berderet secara paksa bila digunakan untuk tabel
pencarian pada deret terurut.
Formal lawan empiris[sunting | sunting sumber]
Artikel utama: Algoritme empiris, Profiling (pemrograman
komputer), dan Optimisasi program
Analisis dan kajian algoritme adalah bidang dari ilmu komputer,
dan biasanya dilakukan secara abstrak tanpa
menggunakan bahasa pemrograman tertentu atau implementasi.
Dalam artian, analisis algoritme mirip dengan bidang matematika
lainnya yang mana fokus pada properti yang mendasari algoritme
dan bukan pada implementasi tertentu.
Biasanya pseudokode digunakan pada analisis karena
merupakan representasi paling umum dan sederhana. Namun,
pada akhirnya, kebanyakan algoritme diimplementasikan di
perangkat keras / lunak tertentu dan efisiensi algoritmik mereka
akhirnya diuji menggunakan kode yang sebenarnya. Untuk solusi
dari sebuah masalah, efisiensi dari algoritme tertentu mungkin
tidak terlalu berpengaruh (kecuali n sangat besar) tetapi bagi
algoritme yang dirancang untuk kecepatan interaktif, komersial,
atau penggunaan ilmiah jangka panjang ia bisa saja kritikal.
Meningkatkan n dari kecil ke n yang besar biasanya menunjukan
ketak efisienan algoritme yang tidak berbahaya.
Pengujian empiris berguna karena bisa membuka interaksi tak
terduga yang mempengaruhi performa. Benchmark bisa
digunakan untuk membandingkan potensi kenaikan
sebelum/sesudah algoritme setelah optimisasi program dilakukan.
Efisiensi eksekusi[sunting | sunting sumber]
Artikel utama: Efisiensi algoritmik
Untuk menggambarkan kemungkinan potensi peningkatan
bahkan pada algoritme yang sudah teruji, inovasi terbaru,
berkaitan dengan algoritme FFT (banyak digunakan di bidang
pemrosesan gambar), bisa menurunkan waktu pemrosesan
dengan faktor sampai 1.000 untuk aplikasi seperti pencitraan
medis. [65] Secara umum, peningkatan kecepatan bergantung pada
properti khusus dari permasalahan, yang mana sangat umum
pada aplikasi praktis. [66] Percepatan dengan tingkat seperti itu
membolehkan perangkat komputasi yang sering menggunakan
pemrosesan gambar (seperti kamera digital dan peralatan medis)
menghabiskan daya yang lebih sedikit.

Klasifikasi[sunting | sunting sumber]
Salah satu cara mengklasifikasikan algoritme yaitu dengan cara
implementasi.

20
Rekursi atau iterasi
Sebuah algoritme rekursi yaitu algoritme yang memanggil dirinya sendiri
berulang kali sampai kondisi tertentu tercapai, ini merupakan metode umum
bagi pemrograman fungsional. Algoritme iteratif menggunakan konstruksi
berulang seperti pengulangan dan terkadang struktur data tambahan
seperti tumpukan untuk menyelesaikan permasalahan. Beberapa permasalahan
secara alami cocok dengan satu implementasi atau lainnya. Sebagai
contoh, Menara Hanoi dikenal dengan implementasi rekursif. Setiap versi rekursif
memiliki kesamaan (tapi bisa lebih atau kurang kompleks) dengan versi iteratif,
dan sebaliknya.
Logical
Sebuah algoritme bisa dilihat sebagai logika deduksi terkontrol. Pernyataan ini
diekspresikan sebagai: Algoritme = logika + kontrol.[67] Komponen logika
mengekspresikan aksioma yang bisa digunakan dalam komputasi dan
komponen kontrol menentukan cara deduksi digunakan pada aksioma. Ini
merupakan dasar dari paradigma pemrograman logika. Dalam bahasa
pemrograman logika murni komponen kontrol adalah tetap dan algoritme
ditentukan dengan memberikan hanya komponen logikanya. Daya tarik dari
pendekatan ini adalah semantik elegan: sebuah perubahan dalam aksioma
memiliki perubahan dalam algoritme.
Serial, paralel atau terdistribusi
Algoritme biasanya dibicarakan dengan asumsi bahwa komputer menjalankan
satu instruksi algoritme setiap waktu. Komputer tersebut terkadang disebut
dengan komputer serial. Rancangan algoritme untuk lingkungan tersebut disebut
dengan algoritme serial, terbalik dengan algoritme paralel atau algoritme
terdistribusi. Algoritme paralel memanfaatkan arsitektur komputer yang mana
beberapa prosesor bisa mengerjakan masalah pada waktu yang sama, selain itu
algoritme terdistribusi memanfaatkan banyak mesin yang terhubung
dengan jaringan. Algoritme paralel atau terdistribusi membagi permasalahan
menjadi banyak sub-masalah simetris atau asimetris dan mengumpulkan
hasilnya kembali. Konsumsi sumber pada algoritme tersebut tidak hanya
perputaran prosesor disetiap prosesor tetapi juga daya komunikasi antara
prosesor. Algoritme pengurutan bisa diparalelkan secara efisien, tetapi biaya
komunikasinya sangat mahal. Algoritme iteratif secara umum bisa diparalelkan.
Beberapa permasalahan tidak ada algoritme paralelnya, dan disebut dengan
permasalahan serial lahiriah.
Deterministik atau non-deterministik
Algoritme deterministik menyelesaikan masalah dengan keputusan yang tepat
disetiap langkah dari algoritme sedangkan algoritme non-
deterministik menyelesaikan masalah lewat penerkaan walaupun penerkaan
biasanya lebih akurat dengan menggunakan heuristik.
Tepat atau perkiraan
Bila banyak algoritme sampai pada solusi yang tepat, algoritme
perkiraan mencari sebuah perkiraan yang terdekat dengan solusi benarnya.
Perkiraan bisa menggunakan baik strategi deterministik atau acak. Algoritme
seperti itu memiliki nilai guna untuk banyak permasalahan sulit.

21

Anda mungkin juga menyukai