Anda di halaman 1dari 155

Algoritme

prosedur dari sebuah kalkulasi

Diagram alur dari sebuah algoritme (Algoritme


Euclid) untuk menghitung faktor persekutuan
t b (f b ) d i d k d bd l l k i
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,


algoritme adalah prosedur langkah-demi-
langkah untuk penghitungan. Algoritme
digunakan untuk penghitungan,
pemrosesan data, dan penalaran
otomatis.

Algoritme adalah metode efektif


diekspresikan sebagai rangkaian
terbatas[1] dari instruksi-instruksi yang
telah didefinisikan dengan baik[2] untuk
menghitung sebuah fungsi.[3] Dimulai
dari sebuah kondisi awal dan input awal
(mungkin kosong),[4] instruksi-instruksi
tersebut menjelaskan sebuah komputasi
yang, bila dieksekusi, diproses lewat
sejumlah urutan kondisi terbatas[5] yang
terdefinisi dengan baik, yang pada
akhirnya menghasilkan "keluaran"[6] dan
berhenti di kondisi akhir. Transisi dari
satu kondisi ke kondisi selanjutnya tidak
harus deterministik; beberapa algoritme,
dikenal dengan algoritme pengacakan,
menggunakan masukan acak.[7]

Walaupun algorism-nya al-Khawarizmi


dirujuk sebagai aturan-aturan melakukan
aritmetika menggunakan bilangan Hindu-
Arab dan solusi sistematis dan
persamaan kuadrat, sebagian formalisasi
yang nantinya menjadi algoritme modern
dimulai dengan usaha untuk
memecahkan permasalahan keputusan
(Entscheidungsproblem) yang diajukan
oleh David Hilbert pada tahun 1928.
Formalisasi selanjutnya dilihat sebagai
usaha untuk menentukan "penghitungan
efektif" [8] atau "metode efektif"; [9]
formalisasi tersebut mengikutkan Godel-
Herbrand-Kleene fungsi rekursif-nya Kurt
Godel - Jacques Herbrand - Stephen Cole
Kleene pada tahun 1930, 1934, dan 1935,
kalkulus lambda-nya Alonzo Church pada
tahun 1936, "Formulasi 1"-nya Emil Post
pada tahun 1936, dan Mesin Turing-nya
Alan Turing pada tahun 1936-7 dan 1939.
Dari definisi formal dari algoritme di atas,
berkaitan dengan konsep intuituf, masih
tetap ada masalah yang menantang. [10]

Asal kata
'Algoritme' muncul dari 'Algoritmi', bentuk
Latin dari al-Khwarizmi, matematikawan,
ahli astronomi, dan ahli geografi dari
Persia.[11][12]

Definisi informal
Definisi informalnya bisa berarti
"sekumpulan aturan yang secara tepat
menentukan seurutan operasi". [13] yang
mengikutkan semua program komputer,
termasuk program yang tidak melakukan
perhitungan numerik. Secara umum,
sebuah program hanyalah sebuah
algoritme jika ia akan berhenti nantinya.
[14]

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
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. [15]

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")[16]
untuk proses yang cepat, efisien,
"baik"[17] yang menentukan
"pergerakan" dari "komputer" (mesin
atau manusia, dibekali dengan
informasi dan kemampuan internal
yang dibutuhkan)[18] untuk
menemukan, dekode, dan kemudian
mengolah masukan integer/simbol m
dan n, simbol + dan = ... dan "secara
efektif"[19] menghasilkan, dalam waktu
yang "masuk akal",[20] 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
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".
[21]

Gurevich: "... argumen


informal Turing untuk
menyokong tesis ini
membenarkan tesis yang lebih
kuat: setiap algoritme bisa
disimulasikan oleh sebuah
mesin Turing ... menurut
Savage [1987], sebuah
algoritme adalah sebuah
proses penghitungan yang
ditentukan oleh sebuah mesin
Turing". [22]
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

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: [23]

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
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

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
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
berjalannya algoritme ... Kriteria yang
lain adalah adaptasi dari algoritme ke
komputer, kesederhanaan dan elegan,
dll"[24]
Chaitin: "... sebuah program adalah
'elegan, maksud saya adalah ia
merupakan program terkecil untuk
menghasilkan keluaran."[25]

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". [26]

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" [27] ) adalah tipe
terbatas dari mesin, sebuah "perangkat
mekanis deterministik diskrit" [28] yang
secara buta mengikuti instruksinya [29].
Model primitif dari Melzak dan Lambek
[30] mereduksi pemikiran tersebut
menjadi empat elemen: (i) diskrit, lokasi
yang bisa dibedakan, (ii) diskrit,
penghitung yang tak bisa dibedakan [31]
(iii) sebuah agen, dan (iv) sebuah daftar
instruksi yang efektif relatif terhadap
kemampuan dari agen. [32]

Minsky menjelaskan variasi yang lebih


sesuai dari model "abacus"-nya Lambek
dalam "Basis Komputabilitas Paling
Sederhana". [33]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): [34] ZERO
(misalnya, isi dari lokasi diganti oleh 0: L
← 0), SUCCESSOR (misalnya, L ← L+1),
dan DECREMENT (misalnya, L ← L-1). [35]
Jarang seorang programer harus menulis
"kode" dengan kumpulan instruksi
terbatas. Tapi Minsky memperlihatkan
(sebagaimana Melzak dan Lambek)
bahwa mesinnya adalah Turing komplet
dengan hanya empat tipe instruksi
utama: GOTO kondisional, GOTO tak
bersyarat,
penetapan/penggantian/substitusi, dan
HALT. [36]

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". [37]
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. [38]

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". [39] 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". [40] Tausworthe
menambahkan tiga struktur kanon
Bohm-Jacopini: [41] SEQUENCE, IF-THEN-
ELSE, dan WHILE-DO, dengan dua lagi:
DO-WHILE dan CASE. [42] Keuntungan
dari program terstruktur adalah ia cocok
dengan pembuktian kebenaran
menggunakan induksi matematika. [43]

Simbol diagram alur[44]: 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
Info lebih lanjut: Contoh algoritme

Contoh Algoritme

Animasi dari algoritme quicksort mengurutkan larik


dari nilai acak. Batang merah menandakan elemen
pivot; pada awal animasi, elemen paling kanan dipilih
p ;p , p g p
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.
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

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
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).

Algoritme Euclid muncul sebagai


Proposisi II dalam Book VII ("Elementary
Number Theory") dari Elements. [45]
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. [46]
Dalam dunia modern, sisa r = l - q*s, q
sebagai hasil bagi, atau sisa r adalah
"modulus", bagian sisa-integer yang
tersisa setelah pembagian. [47]

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. [48] 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
Ekspresi grafik dari algoritme Euclid menggunakan
contoh dengan 1599 dan 650.

1599 = 650*2 + 299


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

Bahasa komputer untuk


algoritme Euclid
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

"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 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
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

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 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

Apakah algoritme berjalan seperti yang


penulis inginkan? Beberapa kasus uji
cukup menentukan fungsi inti. Sumber
pertama [49] 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." [50] Tausworthe
mengajukan bahwa sebuah pengukuran
dari kompleksitas dari sebuah program
adalah panjang dari pembuktian
kebenarannya. [51]

Menghitung dan
meningkatkan algoritme
Euclid
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 [52] 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 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; [53] 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
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 pencarian
berderet secara paksa bila digunakan
untuk tabel pencarian pada deret terurut.

Formal lawan empiris

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

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. [54] Secara umum,
peningkatan kecepatan bergantung pada
properti khusus dari permasalahan, yang
mana sangat umum pada aplikasi
praktis. [55] 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
Salah satu cara mengklasifikasikan
algoritme yaitu dengan cara
implementasi.
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.[56] 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 di 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.
Algoritme quantum
Berjalan di model realistik dari
komputasi quantum. Istilah ini
biasanya digunakan untuk algoritme
yang tampak pada dasarnya quantum,
atau menggunakan beberapa fitur
penting komputasi quantum seperti
superposisi quantum atau belitan
quantum.

Paradigma secara
rancangan
Cara lain mengklasifikasikan algoritme
adalah dengan metodologi rancangannya
atau paradigma. Ada sejumlah
paradigma, tiap-tiapnya berbeda dari
yang lain. Lebih lanjut, setiap kategori
tersebut mengikutkan banyak tipe
algoritme yang berbeda. Beberapa
paradigma umum termasuk:

Pencarian paksa atau pencarian


mendalam
Ini merupakan metode naif mencoba
setiap kemungkinan solusi untuk
melihat yang terbaik.[57]
Membagi dan menaklukan (Divide and
conqueror)
Algoritme bagi dan takluk secara
berulang mereduksi instansi jumlah
masalah menjadi satu atau lebih kecil
instasi masalah yang sama (biasanya
secara rekursif) sampai instansi cukup
kecil diselesaikan dengan mudah.
Salah satu contoh bagi dan takluk
adalah pengurutan gabung.
Pengurutan dapat dilakukan disetiap
segmen data setelah membagi data
menjadi segmen-segmen dan urutan
seluruh data bisa didapat pada fase
takluk dengan menggabungkan
segmen-segmen. Variasi sederhana
dari bagi-dan-takluk disebut algoritme
kurang dan takluk, yang
menyelesaikan sub-masalah yang
sama dan menggunakan solusi dari
sub-masalah tersebut untuk
menyelesaikan masalah yang lebih
besar. Bagi dan takluk membagi
permasalahan menjadi banyak sub-
masalah dan sehingga tahap takluk
lebih kompleks daripada algoritme
kurang-dan-taklukan. Sebuah contoh
dari algoritme kurang-dan-taklukan
adalah algoritme pencarian binari.
Pencarian dan enumerasi
Banyak masalah (seperti bermain
catur) bisa dimodelkan sebagai
masalah dalam grafik. Sebuah
algoritme eksplorasi grafik
menentukan aturan-aturan untuk
bergerak disekitar grafik dan berguna
bagi masalah tersebut. Kategori ini
juga mengikutkan algoritme pencarian,
enumerasi batas dan cabang dan
backtracking.
Algoritme pengacakan
Algoritme ini membuat pilihan secara
acak (atau pseudo-acak). Ia sangat
berguna untuk menemukan solusi
perkiraan untuk masalah dimana
solusi yang pasti tidak praktis (lihat
metode heuristik di bawah). Untuk
beberapa masalah, diketahui bahwa
perkiraan tercepat harus mengikutkan
beberapa pengacakan.[58] Apakah
algoritme pengacakan dengan
kompleksitas waktu polinomial bisa
menjadi algoritme tercepat untuk
beberapa masalah masih menjadi
pertanyaan terbukan yang dikenal
sebagai Masalah P versus NP. Ada
dua kelas besar dari algoritme ini:
1. Algoritme Monte Carlo
mengembalikan jawaban yang benar
dengan probabilitas-tinggi. Misalnya, RP
adalah sub-klas dari algoritme ini yang
berjalan dalam waktu polinomial)
2. Algoritme Las Vegas selalu
mengembalikan jawaban yang benar,
tetapi waktu prosesnya adalah hanya
terikat secara probabilistik, misalnya
ZPP.
Reduksi
Teknik ini menyelesaikan masalah sulit
dengan mengubahnya menjadi
permasalahan yang lebih diketahui
yang mana kita (berharap) memiliki
algoritme asimptotikal optimal.
Tujuannya yaitu untuk menemukan
sebuah algoritme reduksi yang
kompleksitasnya tidak didominasi oleh
algoritme hasil reduksi. Sebagai
contoh, algoritme seleksi untuk
menemukan rata-rata dalam daftar tak
terurut mengikutkan mengurutkan
daftar (bagian yang paling mahal) dan
menarik elemen paling tengah dalam
daftar terurut (bagian yang paling
mudah). Teknik ini juga diketahui
dengan ubah dan taklukan.

Permasalahan optimisasi
Pemrograman Linear
Saat mencari solusi optimal terhadap
sebuah fungsi linear yang terikat
persamaan linear dan ketidaksamaan
konstrain, batasan dari permasalahan
bisa digunakan secara langsung untuk
menghasilkan solusi optimal. Ada
algoritme yang dapat memecahkan
setiap permasalahan dalam kategori
ini, seperti algoritme simpleks yang
terkenal.[59] Permasalahan yang dapat
diselesaikan dengan pemrograman
linear termasuk permasalahan alur
maksimum untuk grafik terarah). Jika
sebuah masalah sebagai tambahan
membutuhkan satu atau lebih jawaban
haruslah integer maka ia diklasifikan
dalam pemrograman integer.
Algoritme pemrograman linear dapat
menyelesaikan masalah seperti itu jika
dapat dibuktikan bahwa semua
batasan untuk nilai integer adalah
tidak benar, yaitu solusi memenuhi
batasan tersebut. Pada kasus umum,
algoritme yang dikhususkan atau
algoritme yang menemukan solusi
perkiraan digunakan, bergantung pada
kesulitan dari permasalahan.
Pemrograman dinamis
Bila sebuah masalah memperlihatkan
substruktur optimal, artinya solusi
optimal terhadap sebuah masalah bisa
direkonstruksi dari solusi optimal ke
sub-masalah, dan submasalah
tumpang-tindih, artinya sub-masalah
yang sama digunakan untuk
menyelesaikan banyak instasi masalah
berbeda, pendekatan tercepat disebut
pemrograman dinamis menghindari
penghitungan solusi yang telah
dikomputasi. Sebagai contoh,
algoritme Floyd-Warshall, jalan
terpendek ke tujuan dari sebuah vertex
dalam grafik berbobot bisa ditemukan
dengan menggunakan jalan terpendek
ke tujuan dari semua simpul yang
berdekatan. Pemrograman dinamis
dan memoisasi berpadanan.
Perbedaan utama antara
pemrograman dinamis dan bagi-dan-
taklukan adalah submasalah kurang
lebih independen dalam bagi-dan-
taklukan, sementara submasalah
tumpang tindik dalam pemrograman
dinamis. Perbedaaan antara
pemrograman dinamis dan rekursi
langsung adalah dalam 'caching' atau
memoisasi dari pemanggialan rekursif.
Saat submasalah independen dan
tidak ada pengulangan, memoisasi
tidak membantu sama sekali; makanya
pemrograman dinamis bukalanh solusi
untuk semua permasalahan kompleks.
Dengan menggunakan memoisasi atau
tabel dari submasalah yang telah
diselesaikan, pemrograman dinamis
mereduksi eksponensial dari banyak
permasalahan menjadi kompleksitas
polinomial.
Metode rakus
Sebuah algoritme rakus mirip dengan
algoritme pemrograman dinamis,
tetapi perbedaannya adalah solusi dari
submasalah tidak harus diketahui
pada setiap tahap; melainkan pilihan
yang "rakus" bisa dibuat dengan
melihat apa yang terbaik untuk saat
tersebut. Metode rakus
mengembangkan solusi dengan
kemungkinan keputusan yang terbaik
(bukan dengan keputusan yang ada)
pada tahap algoritmis berdasarkan
optimasi lokal yang ada sekarang dan
keputusan yang terbaik (bukan semua
kemungkinan keputusan) yang dibuat
pada langkah sebelumnya. Algoritme
ini tidak terlalu mendalam, dan tidak
memberikan jawaban yang akurat
terhadap banyak permasalahan. Tapi
bila ia bekerja, ia menjadi metode yang
paling cepat. Algoritme rakus paling
terkenal adalah menemukan rentang
pohon minimal seperti pada Pohon
Huffman, Kruskal, Prim, Sollin.
Metode heuristik
Dalam masalah optimisasi, algoritme
heuristik bisa digunakan untuk
menemukan suatu solusi yang
terdekat dengan solusi optimal jika
seandainya menemukan solusi optimal
tidak praktis. Algoritme ini bekerja
dengan mendekati sedikit demi sedikit
ke solusi optimal saat ia berjalan.
Secara prinsipnya, jika dijalankan
tanpa batas waktu, ia akan
menemukan solusi optimal. Kebaikan
mereka adalah mereka dapat
menemukan suatu solusi sangat dekat
dengan solusi optimal dalam waktu
yang relatif sangat pendek. Algoritme
tersebut termasuk pencarian lokal,
pencarian tabu, simulasi pelunakan,
dan algoritme genetik. Beberapa dari
mereka, seperti simuasi pelunakan,
adalah algoritme non-deterministik
sementara yang lainnya, seperti
pencarian tabu, adalah deterministik.
Saat batas dari galat dari solusi non-
optimal diketahui, algoritme kemudia
dikategorikan sebagai algoritme
pendekatan.

Berdasarkan bidang kajian

Setiap bidang sains memiliki


permasalahannya sendiri dan
membutuhkan algoritme yang efisien.
Masalah yang berkaitan di satu bidang
terkadang dipelajari bersama. Beberapa
contoh yaitu algoritme pencarian,
algoritme penggabungan, algoritme
numerik, algoritme grafik, algoritme
deret, algoritme komputasi geometri,
algoritme kombinatorial, algoritmas
medis, mesin belajar, kriptografi,
algoritme kompresi data dan teknik
penguraian.

Terkadang bidang-bidang tersebut saling


tumpang tindih, dan perkembangan
algoritme di satu bidang bisa
meningkatkan bidang lainnya yang
terkadang tidak berkaitan. Sebagai
contohnya, pemrograman dinamis
ditemukan untuk optimisasi konsumsi
sumber daya dalam industri, tetapi
sekarang digunakan untuk
menyelesaikan sejumlah besar
permasalahan dalam banyak bidang.

Berdasarkan kompleksitas
Algoritme bisa diklasifikasikan
berdasarkan jumlah waktu yang
dibutuhkan untuk selesai dibandingkan
dengan ukuran inputnya. Ada berbagai
varietas: beberapa algoritme selesai
dalam waktu linear relatif terhadap
ukuran input, beberapa selesai dalam
jumlah waktu yang eksponensial atau
lebih buruh, dan beberapa berhenti.
Sebagai tambahan, beberapa masalah
bisa memiliki berbagai algoritme dengan
kompleksitas yang berbeda, sementara
permasalahan yang lain bisa saja tidak
memiliki algoritme atau tidak diketahui
algoritmanya yang efisien. Ada juga
pemetaan dari beberapa algoritme
terhadap permasalahan lain. Karena itu,
lebih cocok untuk mengklasifikasikan
permasalahan itu sendiri bukannya
algoritme menjadi kelas-kelas yang sama
berdasarkan kompleksitas dari
kemungkinan algoritme terbaik baginya.

Burgin (2005, p. 24) menggunakan


definisi algoritme secara umum yang
melonggarkan kebutuhan bersama yang
keluaran dari algoritme yang
menjalankan sebuah fungsi harus
ditentukan setelah sejumlah langkah. Dia
mendefinisikan kelas super-rekursif dari
algoritme sebagai "sebuah kelas
algoritme yang mana memungkinkan
untuk menghitung fungsi yang tidak bisa
dihitung oleh mesin Turing manapun"
(Burgin 2005, p. 107). Hal ini berkaitan
dekat dengan kajian dari metode
hiperkomputasi.

Berdasarkan tipe evaluatif

Untuk menjaga keseimbangan saat


mengintegrasikan mesin ke dalam
masyarakat, seseorang bisa
mengklasifikasikan algoritme
berdasarkan tipe dari evaluasi yang
mereka lakukan. Sejumlah filsuf telah
berhipotesis bahwa masyarakat
diuntungkan dari keragaman evaluatif
seperti mereka diuntungkan keragaman
jender dan tipe darah (misalnya, Dean
2012, Sober & Wilson 1998) Hertzke &
McConkey 1998, dan Bellah 1985).
Teknologi dapat mengancam ekosistem
moral tersebut seperi spesies invasif jika
ia mengganggu campuran keragaman.
Wallach & Allen (2008)
mengklasifikasikan algoritme pembuat-
keputusan menjadi tiga tipe evaluatif:
Algoritme bottom-up membuat penilaian
tidak terprediksi bagi pemrogram
(misalnya, perangkat lunak yang
berevolusi). Yang lainnya (top-down)
dibagi menjadi deontologikal (yang dapat
bergantung pada implementasi aturan
pemrograman) lawan consequensialis
(yang mengandalkan pada
memaksimalkan perkiraan
pemrograman). Sebagai contohnya,
sebuah kalkulator standar termasuk
deontologikal, sementara mesin
pembelajaran untuk perdagangan saham
termasuk consequensialis.

Santos-Lang mengganti nama


deontologikal dan consequensialis
menjadi kelas "institusional" dan
"negosiator" dengan tujuan untuk
menghindari implikasi bahwa semua
teori-teori etika deontologikal dan
consequensialis bisa diimplementasikan
sebagai algoritme, dan membagi kelas
bottom-up menjadi "pengganggu"
(algoritme yang tidak terprediksi karena
menggunakan generator pengacakan)
lawan "relasional" (algoritme yang tidak
terprediksi karena efek jaringan).
Seorang mutator dalam komputasi
evolusioner bisa menjadi contoh dari
pengganggu, sementara kelas 3 atau 4
dari otomata sellular adalah contoh dari
mesin relasional. Santos-Lang mencatat
bahwa algoritme terkadang memiliki
subkomponen dari tipe lainnya. Sebagai
contohnya, negosiator perdagangan
saham bisa mengimplementasikan
sebuah algoritme genetik, dan memiliki
mutator pengganggu, dan mutator bisa
memiliki subkomponen institusional dan
relasional, semua komputasi adalah
relasional pada tingkat di jajaran kimiawi
(Santos-Lang 2014).
Algoritme berkelanjutan
Kata sifat "berkelanjutan" bila diterapkan
pada kata "algoritme" bisa berarti:

Sebuah algoritme beroperasi pada


data yang merepresentasikan
kuantitas yang berkelanjutan,
walaupun data tersebut
direpresentasikan oleh pendekatan
diskrit—seperti algoritme yang
dipelajari dalam analisis numerik; atau
Sebuah algoritme dalam bentuk dari
persamaan diferensial yang beroperasi
secara berkelanjutan terhadap data,
berjalan dalam sebuah komputer
analog.
[60]

Isu legalitas
Lihat pula: Paten perangkat lunak untuk
pendahuluan umum dari paten pada
perangkat lunak, termasuk algoritme
untuk diimplementasikan pada
komputer.

Algoritme biasanya tidak dipatenkan. Di


Amerika Serikat, sebuah klaim yang
terdiri hanya dari manipulasi sederhana
dari konsep abstrak, angka, atau sinyal
tidak berarti suatu "process" (SPTO
2006), dan oleh karena itu algoritme
tidak bisa dipatenkan (sebagaimana
dalam Gottschalk v. Benson). Namun,
penerapan praktis dari algoritme
terkadang dipatenkan. Sebagai
contohnya, dalam Diamond v. Diehr,
aplikasi dari algoritme umpan-balik
sederhana untuk membantu dalam
menyembuhkan karet sintetis dianggap
dapat dipatenkan. Mematenkan
perangkat lunak sangat kontroversial,
dan ada paten yang mengikutkan
algoritme yang sangat dikritisi, terutama
algoritme kompresi data, seperti Format
Grafiknya Unisys.

Sebagai tambahan, beberapa algoritme


kriptografi memiliki batasan ekspor (lihat
ekspor dari kriptografi).
Etimologi
Kata "Algoritme", atau "Algorisma" pada
versi penulisan lain, datang dari nama al-
Khwarizmi. dieja dalam Arab klasik
sebagai Al-Khwarithmi. Al-khwarizmi
(bahasa Persia: 850-780 ,‫ )ﺧﻮارزﻣﻲ‬adalah
matematikawan, ahli astronomi, ahli
geografi dari Persia dan sarjana House of
Wisdom di Baghdad, yang arti namanya
"penduduk asli Khwarezm", sebuah kota
yang merupakan bagian dari Wilayah Iran
pada masanya dan sekarang Uzbekistan.
[11][12] Sekitar tahun 825, dia menulis
risalah dalam bahasa Arab, yang
diterjemahkan dalam Latin pada abad ke-
12 dengan judul Algoritmi de numero
Indorum. Judul ini artinya "Algoritmi pada
bilangan India", di mana "Algoritmi"
adalah pelatinan penerjemah dari nama
Al-Khwarizmi. [61] Al-Khwarizmi dulunya
adalah matematikawan yang paling
banyak dibaca di Eropa pada akhir Abad
Pertengahan, pada umum lewat bukunya
yang lain, Aljabar. [62] Pada akhir abad
pertengahan, algorismus, perubahan dari
namanya, berarti "sistem bilangan
desimal" yang masih merupakan arti dari
kata Inggris modern algorism. Pada abad
ke-17 Prancis kata tersebut berubah,
tetapi tidak maknanya, menjadi
algorithme. Inggris mengadopsi Prancis
setelahnya, tetapi tidak pada akhir abad
ke-19 lah "Algorithm" mengambil makna
dari kata Inggris masa sekarang. [63]

Etimologi alternatif mengklaim asal


mulanya dari istilah algebra (aljabar) dari
makna abad pertengahan "aritmetika
Arab" dan arithmos istilah Yunani untuk
angka (yang secara harfiah berarti
"bilangan Arab" atau "perhitungan Arab").
Karya algoritme Al-Kharizmi bukan
berbentuk seperti pada masa modern
sekarang tetapi sebagai tipe dari
pengulangan kalkulus (disini disebutkan
bahwa karya fundamentalnya yang
dikenal sebagai algebra pada awalnya
berjudul "Buku Ringkasan tentang
Kalkulasi dengan Penyempurnaan dan
Pengimbangan" menjelaskan tipe-tipe
dari pengulangan perhitungan dan
persamaan kuadrat). Dalam makna
tersebut, algoritima dikenal di Eropa jauh
sebelum Al-Kharizmi. Algoritme paling
tua yang dikenal sekarang adalah
Algoritme Euklid (lihat juga
Pengembangan algoritme Euklid).
Sebelum ditemukan istilah algorithm
orang Yunani menyebutnya
anthyphairesis secara harfiah berarti anti-
substraksi atau substraksi timbal-balik
(untuk bacaan lebih lanjut disini dan ini .
Algoritme dikenal oleh orang Yunani
berabad sebelum [64] Euclid. Bukannya
kata algebra orang Yunani menggunakan
istilah arithmetica(ἀριθμητική, yaitu
dalam karya Diophantus yang dikenal
"bapak dari Aljabar" - lihat juga artikel
Wikipedia persamaan Diophantine dan
Eudoxos).

Sejarah: Perkembangan dari


kata "algoritme"
Asal mula

Kata algoritme datang dari nama


matematikawan Persia abad ke-9 Abu
Abdullah Muhammad ibnu Musa Al-
Khwarizmi, yang hasil kerjanya dibangun
dari matematikawan India abad ke-7
Brahmagupta. Kata algorisma awalnya
mengacu hanya pada aturan-aturan
dalam melakukan aritmetika
menggunakan bilangan Hindu-Arab
namun berkembang lewat penerjemahan
Latin Eropa dari nama Al-Khwarizmi
menjadi algoritme pada abad ke-18.
Penggunaan kata tersebut berkembang
mengikutkan semua prosedur untuk
menyelesaikan masalah atau melakukan
unit kegiatan. [65]

Simbol diskrit dan yang dapat


dibedakan

Penanda-penghitung: Untuk mencatat


hewan gembalaan, kumpulan biji dan
uang mereka orang dahulu
menggunakan penghitung: akumulasi
batu atau tanda yang ditoreh pada
tongkat, atau membuat simbol diskrit di
kerang. Sampai orang Babilonia dan
Mesir menggunakan tanda dan simbol,
pada akhirnya bilangan Roma dan
abakus berkembang (Dilson, p. 16-41).
Penanda penghitung muncul dalam
sistem bilangan operan aritmetika
digunakan dalam mesin Turing dan
komputasi mesin Post-Turing.

Manipulasi simbol sebagai


"penampung" bilangan:
aljabar

Karya dari Geometer Yunani kuno


(algoritme Euklid), matematikawan India
Brahmagupta, dan matematikawan
Persia Al-Khwarizmi (yang darinya isitlah
"algorism" dan "algoritme" diturunkan),
dan matematikawan Eropa Barat
memuncak dalam notasi Leibniz dari
rasiosinator kalkulus (sekitar 1680-an):

Abad yang baik dan setengah


lebih maju dari masanya,
Leibniz mengajukan logika
aljabar, sebuah aljabar yang
akan menentukan aturan-
aturan untuk memanipulasi
konsep logika dengan cara
yang aljabar biasa
menentukan aturan untuk
manipulasi angka.[66]
Rancangan mekanis dengan
tingkat diskrit

Jam: Bolter memuji penemuan jam gaya-


berat sebagai "Kunci penemuan dari
Eropa pada Abad Pertengahan",
khususnya pada ambang pelarian [67]
yang menyediakan kita dengan tik dan
tak dari jam mekanis. "Mesin otomatis
yang akurat" [68] mengarah langsung
pada "otomata mekanis" dimulai pada
abad ke-13 dan terakhir pada "mesin
komputasi" -- motor berbeda dan motor
analitik dari Charles Babbage dan
bangsawan Ada Lovelace, pertengahan
abad ke-19. [69] Lovelace dikreditkan
sebagai yang pertama menciptakan
algoritme yang ditujukan untuk diproses
di komputer—motor analitis Babbage,
perangkat pertama yang dianggap
komputer Turing-sempurna sebenarnya
bukan hanya sebuah kalkulator—dan
terkadang dikenal "programmer pertama
dalam sejarah", walaupun implementasi
penuh dari perangkat Babbage kedua
tidak terealisasi sampai beberapa
dekade setelah masanya.

Mesin logika 1870 - Stanley Jevons


"sempoa logika" dan "mesin logika":
Masalah teknisnya adalah untuk
mereduksi persamaan boolean bila
ditampilkan dalam sebuah bentuk yang
pada masa sekarang dikenal sebagai
pemetaan Karnaugh. Jevons (1880)
pertama menjelaskan "sempoa"
sederhana dari "potongan kayu
dilengkapi dengan penyemat, dibuat
supaya bagian atau kelas kombinasi
logika manapun dapat dipilih secara
mekanis ... Baru-baru ini Saya telah
mereduksi sistem menjadi bentuk yang
secara sempurna mekanis, dan
membuatnya mewujudkan keseluruhan
proses inferensi tak langsung dalam apa
yang disebut sebuah Mesin Logika"
Mesinnya dilengkapi dengan "beberapa
tangkai kayu yang bisa dipindahkan" dan
"di bawah ada 21 kunci seperti pada
piano [dll] ...". Dengan mesin ini dia dapat
menganalis sebuah "silogisme atau
argumen logika sederhana apapun". [70]

Mesin tenun Jacquard, kartu


berlobangnya Hollerith, telegraf dan
telepon -- penyiaran elektromekanis: Bell
dan Newell (1971) mengindikasikan
bahwa mesin tenun Jacquard (1801),
pelopor dari kartu Hollerith (kartu
berlobang, 1887), dan "teknologi alih
telepon" adalah akar dari sebuah pohon
yang mengarah pada perkembangan dari
komputer pertama. [71] Pada
pertengahan abad ke-19 telegraf, pelopor
dari telepon, digunakan diseluruh dunia,
pengkodean diskrit dan pembedaan
huruf sebagai "titik dan strip". Pada akhir
abad ke-19 pita telegraf (sekitar 1870-an)
digunakan, sebagaimana juga kartu
Hollerith pada sensus Amerika 1890.
Kemudian muncullah teleprinter (sekitar
1910-an) dengan kerta-berlobang
menggunakan kode Baudot di pita.

Jaringan alih-telepon dari penyiaran


elektromekanis (ditemukan 1835) adalah
karya dair George Stibitz (1937), penemu
dari perangkat penghitungan digital. Saat
bekerja di laboratorium Bell, dia
mengamati "beratnya" penggunaan
kalkulator mekanis dengan geligi. "Dia
pulang ke rumah pada suatu malam
1937 berniat untuk menguji idenya ...
Saat mengatik selesai, Stibitz telah
membangun perangkat hitung digital".
[72]

Davis (2000) mengamati pentingnya


penyiaran elektromekanis (dengan
"keadaan binari"-nya buka dan tutup):

Hanya dengan perkembangan, dimulai


sejak 1930-an, dari kalkulator
elektromekanis menggunakan
penggantian elektris, sehingga mesin
yang dibuat memiliki ruang lingkup
yang dibayangkan Babbage."[73]

Matematika selama abad 19


sampai pertengahan abad 20

Simbol dan aturan: Dengan cepat


berkembangnya matematika dari George
Boole (1847, 1854), Gottlob Frege (1897),
dan Giuseppe Peano (1888-1889)
mereduksi aritmetika menjadi
serangkaian simbol dimanipulasi oleh
aturan-aturan. The Principles of
arithmetic, presented by a new method-
nya Peano (1888) adalah "usaha pertama
mengaksiomakan matematika dalam
sebuah bahasa simbolik". [74]

Tapi Heijenoort memberi pujian pada


Frege (1879): Frege "merupakan karya
tulis paling penting mengenai logika. ...
yang mana kita lihat sebuah "'bahasa
formula', yaitu sebuah lingua
characterica, sebuah bahasa ditulis
dengan simbol-simbol khusus, "untuk
berpikir murni", yaiut, bebas dari hiasan
retorikal ... dibangun dari simbol-simbol
tertentu yang dimanipulasi menurut
aturan-aturan terbatas". [75] Karya dari
Frege lebih lanjut disederhanakan dan
diperkuat oleh Alfred North Whitehead
dan Bertrand Russell dalam Principia
Mathematical (1910-1913).

Paradoks: Pada masa yang sama


sejumlah paradoks yang mengganggu
muncul dalam literatur, pada khususnya
paradoks Burali-Forti (1987), paradoks
Russell (1902-03), dan Paradoks Richard.
[76] Hasilnya mengarah ke makalah Kurt
Godel (1931) -- dia secara khusus
merujuk paradoks pembohong—yang
mereduksi aturan dari rekursi pada
angka.

Penghitungan Efektif: Dalam usaha untuk


menyelesaikan permasalahan keputusan
yang didefinisikan oleh Hilbert tahun
1928, matematikawan pertama
mendefinisikan apa arti dari "metode
efektif" atau "kalkulasi efektif" (misalnya,
sebuah kalkulasi yang akan sukses).
Dalam waktu yang cepat hal berikut
muncul: kalkulus-λ oleh Alonzo Church,
Stephen Kleene, dan J.B. Rosser [77]
definisi dari "rekursi umum" yang benar-
benar diasah dari karya Godel
berdasarkan saran dari Jacquard
Herbrand (cf. kuliah Godel di Princeton
tahun 1934) dan penyederhaan
selanjutnya oleh Kleene. [78] Church
membuktikan [79] bahwa permasalahan
keputusan tidak terpecahkan, definisi
Emil Post tentang penghitungan efektif
yaitu sebagai pekerja yang tanpa berpikir
mengikuti suatu daftar instruksi untuk
bergerak ke kiri atau kanan lewat
sederetan ruangan dan bersamaan
dengan itu bisa menandai atau
menghapus kertas atau mengamati
kertas dan membuat pilihan ya-tidak
tentang instruksi selanjutnya. [80]
Pembuktian Alan Turing bahwa
permasalahan keputusan tidak
terpecahkan dengan menggunakan
"sebuah mesin [otomatis]"-nya [81]
dengan efek yang mirip dengan
"formulasi"-nya Post, definisi J. Barkley
Rosser tentang "metode efektif" dalam
makna "sebuah mesin". [82] Proposal S. C.
Kleene dari pelopor "Tesis Church" yang
disebutnya "Thesis I", [83] dan beberapa
tahun kemudian Kleene menamakan
tesisnya "Tesis Church" [84] dan
mengajukan "Tesis Turing". [85]

Emil Post (1936) dan Alan


Turing (1936-37, 1939)

Berikut adalah kebetulan yang luar biasa


dari dua orang yang tidak saling
mengenal tetapi mendeskripsikan
sebuah proses orang-sebagai-komputer
mengerjakan perhitungan—dan mereka
menghasilkan definisi yang mirip.

Emil Post (1936) mendeskripsikan aksi


dari sebuah "komputer" (manusia)
sebagai berikut:

"... dua konsep ikut serta: yaitu sebuah


simbol ruang dimana pekerjaan yang
mengarah dari masalah ke jawaban
dilakukan, dan sekumpulan arahan
yang baku dan tidak bisa diubah.

Simbol ruangnya yaitu

"sederetan dua arah tak terbatas dari


ruang atau kotak... penyelesai masalah
atau pekerja harus berjalan dan
bekerja di simbol ruang ini, dengan
bisanya [si pekerja] masuk, dan
beroperasi dengan satu kotak dalam
satu waktu... sebuah kotak memiliki
dua kemungkinan kondisi, yaitu,
kosong atau belum ditandai, dan
dengan adanya tanda tunggal disana,
katakanlah garis vertikal.
"Satu kotak dibiarkan dan disebut
sebagai titik awal. ...sebuah masalah
tertentu diberikan dalam bentuk
simbolik dengan sejumlah kotak
terbatas [yaitu, INPUT] ditandai dengan
coretan. Begitu juga jawabannya [yaitu,
OUTPUT] diberikan dalam bentuk
simbolik dari suatu konfigurasi dari
kotak-kotak yang ditandai....
"Sekumpulan arahan bisa digunakan
untuk permasalahan umum
menentukan proses determistik saat
diterapkan pada setiap masalah
tertentu. Proses ini hanya berhenti bila
datang arahan dengan tipe (C ) [yaitu,
STOP]".[86] Lihat lebih lanjut pada
mesin post-Turing

Patung Alan Turing di Taman Bletchley.

Karya Alan Turing[87] mendahului karya


dari Stibitz (1937); tidak diketahui
apakah Stibitz mengetahui karya
Turing. Biografinya Turing percaya
bahwa Turing menggunakan model
seperti-mesin-ketik diturunkan dari
ketertarikannya pada masa muda:
"Alan memiliki impian menemukan
mesin ketik pada saat muda; Ibu
Turing memiliki sebuah mesin ketik;
dan dia mungkin memulainya dengan
menanyakan pada dirinya sendiri apa
maksudnya dengan menyebut sebuah
mesin ketik dengan 'mekanikal'".[88]
Dengan lazimnya kode Morse dan
telegraf, mesin pita telegraf, dan
mesin-ketik jarak jauh pada waktu itu
kita bisa menyimpulkan bahwa semua
itu memberikan pengaruh.
Turing—model dari komputasinya
sekarang dikenal dengan mesin Turing—
memulai, sebagaimana Post, dengan
analisis dari komputer manusia yang ia
sederhanakan menjadi sekumpulan
gerakan dasar sederhana dan "keadaan
pikiran". Tapi dia terus maju selangkah ke
depan dan membuat sebuah mesin
sebagai model dari komputasi angka. [89]

"Menghitung biasanya dilakukan


dengan menulis simbol tertentu di atas
kertas. Misalkan kertas tersebut dibagi
menjadi segi empat seperti buku
aritmetika anak-anak.... Saya
asumsikan bahwa komputasi
dilakukan pada kertas satu dimensi,
yaitu, di pita yang dibagi dalam
persegi. Juga misalkan bahwa jumlah
simbol yang akan dicetak terbatas....
"Perilaku dari komputer disetiap waktu
ditentukan oleh simbol yang
diobservasinya, dan "keadaan pikiran"-
nya pada waktu tersebut. Juga bisa
diasumsikan bahwa ada batas B
sebagai jumlah simbol atau persegi
yang mana komputer dapat amati
dalam satu waktu. Jika ia ingin
mengamati lebih, ia harus
menggunakan pengamatan beriringan.
Kita juga memisalkan bahwa jumlah
keadaan pikiran yang diperlukan disini
adalah terbatas...
"Mari kita bayangkan bahwa operasi
yang dilakukan oleh komputer akan
dipecah menjadi 'operasi-operasi
sederhana' yang sangat mendasar
sehingga tidak mudah
membayangkannya untuk dibagi lebih
jauh."[90]

Reduksi Turing menghasilkan hal berikut:

"Operasi sederhana haruslah


mengikutkan:
"(a) Perubahan dari simbol pada
salah satu persegi yang sedang
diamati
"(b) Perubahan dari salah satu
persegi diamati terhadap persegi
lainnya di antara L persegi dari salah
satu yang sebelumnya diamati.

"Bisa saja beberapa dari perubahan


tersebut menyebabkan perubahan
keadaan pikiran. Operasi tunggal paling
umum oleh karena itu harus diambil jadi
salah satu hal berikut:

"(A) Suatu kemungkinan perubahan


(a) dari simbol bersamaan dengan
suatu perubahan dari keadaan
pikiran.
"(B) Suatu kemungknian perubahan
(b) dari persegi yang diamati,
bersama dengan kemungkinan
perubahan dari keadaan pikiran"
"Kita sekarang mungkin sudah bisa
membentuk sebuah mesin untuk
melakukan pekerjaan dari komputer
tersebut."[90]

Beberapa tahun kemudian, Turing


mengembangkan analisanya (tesis,
secara definisi) dengan ekspresi kuat
berikut:

"Sebuah fungsi dikatakan "bisa


dihitung secara efektif" jika nilainya
bisa ditemukan dengan proses yang
murni mekanis.

Walau sangat mudah menangkap ide ini,


namun ia membutuhkan beberapa
definisi matematikan terbatas yang bisa
diekspresikan . . . [dia mendiskusikan
sejarah dari definisi seperti di atas
dengan menghormati Godel, Herbrand,
Kleen, Church, Turing dan Post] ... Kita
mungkin gunakan pernyataan tersebut
secara harfiah, memahami murni dengan
proses mekanis yang mana dapat
dilakukan oleh sebuah mesin.
Memungkinkan untuk memberikan
deskripsi matematis, dalam beberapa
bentuk normal, dari struktur mesin
tersebut. Perkembangan dari ide ini
mengarah pada definisi penulis dari
sebuah fungsi yang dapat dihitung, dan
untuk mengidentifikasi komputibilitas †
dengan penghitungan yang efektif . . . .
"† Kita boleh menggunakan ekspresi
"fungsi hitung" untuk mengartikan
sebuah fungsi yang dapat dihitung
oleh sebuah mesin, dan kita biarkan
"secara efektif dapat dihitung"
mengacu pada ide intuitif tanpa
definisi tertentu dengan salah satu
dari definisi tersebut".[91]

J. B. Rosser (1939) dan S. C.


Kleene (1943)

J. Barkley Rosser mendefinisikan 'metode


[matematis] efektif' dengan cara berikut
(kemiringan ditambahkan):

"'Metode efektif' disebut sebagai


metode yang spesial yang mana setiap
langkahnya secara tepat ditentukan
dan pasti menghasilkan jawaban
dalam sejumlah langkah yang
terbatas. Dengan pengertian khusus
ini, tiga definisi berbeda telah diajukan
sampai sekarang. [catatan kakinya #5;
lihat diskusinya di bawah]. Yang paling
sederhana (karena Post dan Turing)
menyatakan intinya bahwa sebuah
metode efektif menyelesaikan
sekumpulan permasalahan hanya ada
jika seseorang bisa membuat sebuah
mesin yang akan menyelesaikan setiap
masalah dari sekumpulan masalah
tanpa campur tangan manusia kecuali
memasukan pertanyaan dan (nantinya)
membaca jawabannya. Ketiga definisi
tersebut sama, jadi tidak masalah yang
mana yang digunakan. Lebih lanjut,
fakta bahwa ketiganya sama adalah
argumen yang sangat kuat untuk
kebenaran dari salah satunya." (Rosser
1939:225-6)

Catatan kaki Rosser #5 merujuk karya


dari (1) Church dan Kleene dan definisi
dari definabiliti-λ, secara khusus Church
menggunakannya dalam An Unsolvable
Problem of Elementary Number Theory-
nya (1936); (2) Herbrand dan Godel dan
penggunaan rekursi mereka terutama
Godel menggunakannya dalam makalah
terkenalnya On Formally Undecidable
Propositions of Principia Mathematica
and Related Systems I (1931); dan (3)
Post (1936) dan Turing (1936-7) dalam
model mekanisme komputasi mereka.

Stephen C. Kleene didefinisikan sebagai


"Thesis I"-nya yang terkenal yang dikenal
sebagai tesis Church-Turing. Tapi dia
melakukan hal tersebut dalam konteks
berikut (penebalan dari aslinya):

"12. Teori-teori algoritme... Dalam


menyiapkan sebuah teori algoritme
yang komplet, apa yang kita lakukan
adalah mendeskripsikan sebuah
prosedur, yang dapat dilakukan untuk
setiap kumpulan nilai dari variabel-
variabel tunggal, yang mana prosedur
berhenti dan dengan cara tersebut dari
hasilnya kita bisa membaca sebuah
jawaban tertentu, "ya" atau tidak",
untuk pertanyaan "apakah nilai
predikat benar?"" (Kleene 1943:273)

Sejarah setelah 1950

Sejumlah usaha telah diarahkan untuk


memperbaiki lebih lanjut definisi dari
"algoritme", dan aktivitas tersebut masih
terus berjalan karena isu-isu yang
mengelilinginya, terutama, fondasi
matematika (khususnya tesis Church-
Turing) dan filsafat pikiran (khususnya
argumen menyangkut kecerdasan
buatan). Lebih lanjut, lihat karakterisasi
algoritme.

Lihat juga
Mesin abstrak
Rekayasa algoritme
Komposisi algoritmik
Sintesis algoritmik
Algoritme trading
Sampah masuk, sampah keluar
Pendahuluan untuk Algoritme
Daftar topik algoritme umum
Daftar publikasi penting dalam ilmu
komputer teoretis - Algoritme
Numerical Mathematics Consortium
Teori komputasi
Teori komputabilitas
Teori kompleksitas Komputasi

Referensi
1. ^ "Setiap algoritme klasik, misalnya,
bisa dijelaskan dengan sejumlah kata
bahasa Inggris yang terbatas" (Rogers
1987:2).
2. ^ Telah didefinisikan terhadap agen
yang menjalankan algoritme tersebut:
"Ada agen komputasi, biasanya manusia,
yang bisa beraksi terhadap instruksi dan
melakukan komputasi" (Rogers 1987:2).
3. ^ "Sebuah algoritme adalah sebuah
prosedur untuk menghitung sebuah fungsi
(terhadap beberapa notasi terpilih integer)
... batasan ini (terhadap fungsi bilangan)
tanpa kehilangan generalisasi", (Rogers
1987:1).
4. ^ Sebuah algoritme memiliki input nol
atau lebih, yaitu, kuantitas yang diberikan
padanya sejak awal sebelum algoritme
dijalankan" (Knuth 1973:5).
5. ^ "Sebuah prosedur yang memiliki
semua karakteristik dari sebuah algoritme
kecuali prosedur yang tidak memiliki
keterbatasan bisa disebut sebagai sebuah
'metode komputasi'" (Knuth 1973:5).
6. ^ "Sebuah algoritme memiliki satu atau
lebih keluaran, yaitu kuantitas yang
memiliki relasi tertentu terhadap
masukan" (Knuth 1973:5).
7. ^ Apakah sebuah proses dengan
proses-proses bagian dalam yang acak
(tidak termasuk masukan) adalah sebuah
algoritme atau bukan masih
diperdebatkan. Rogers beropini bahwa:
"sebuah komputasi dilakukan dengan
sebuah gaya diskrit bertahap, tanpa
menggunakan metode-metode
berkelanjutan atau perangkat analog ...
dijalakan terus secara deterministik, tanpa
menggunakan metode-metode atau
perangkat acak, misalnya, dadu" Rogers
1987:2
8. ^ Kleene 1943 dalam Davis 1965:274
9. ^ Rosser 1939 dalam Davis 1965:225
10. ^ Moschovakis, Yiannis N. (2001).
"What is an algorithm?". Dalam Engquist,
B.; Schmid, W. Mathematics Unlimited —
2001 and beyond . Springer. hlm. 919–936
(Part II). ISBN 9783540669135.
11. ^ a b Hogendijk, Jan P. (1998). "al-
Khwarzimi" . Pythagoras. 38 (2): 4–5.
ISSN 0033-4766 . Kesalahan pengutipan:
Tanda <ref> tidak sah; nama
"Hogendijk" didefinisikan berulang
dengan isi berbeda
12. ^ a b Oaks, Jeffrey A. "Was al-
Khwarizmi an applied algebraist?" .
University of Indianapolis. Diakses tanggal
2008-05-30. Kesalahan pengutipan: Tanda
<ref> tidak sah; nama "Oaks"
didefinisikan berulang dengan isi berbeda
13. ^ Stone 1973:4
14. ^ Stone secara sederhana
membutuhkan "harus berhenti dalam
sejumlah langkah" (Stone 1973:7-8).
15. ^ Boolos and Jeffrey 1974, 1999:19
16. ^ cf Stone 1972:5
17. ^ Knuth 1973:7 menyatakan: "Pada
praktiknya kita tidak hanya menginginkan
algoritme, kita menginginkan algoritam
yang baik ... salah satu kriteria dari
kebaikannya adalah lama waktu yang
digunakan untuk menjalankan algoritme ...
kriteria lainnya adalah kemampuan
adaptasi dari algoritme ke komputer,
kesederhanaan dan elegan, dll."
18. ^ cf Stone 1973:6
19. ^ Stone 1973:7-8 menyatakan bahwa
harus ada, "... sebuah prosedur yang robot
[yaitu komputer] bisa ikuti supaya dapat
menentukan secara tepat bagaimana
mengikuti instruksi tersebut." Stone
menambahkan keterbatasan dari proses,
dan kepastian (tidak memiliki kerancuan
pada instruksi) pada definisi tersebut.
20. ^ Knuth, loc. cit
21. ^ Minsky 1967:105
22. ^ Gurevich 2000:1, 3
23. ^ Sipser 2006:157
24. ^ Knuth 1973:7
25. ^ Chaitin 2005:32
26. ^ Rogers 1987:1-2
27. ^ Dalam esainya "Calculations by Man
and Machine: Conceptual Analysis" Seig
2002:390 memuji perbedaan ini oleh
Robin Gandy, cf Wilfred Seig, dll., 2002
Reflections on the foundations of
mathematics: Essays in honor of Solomon
Feferman, Association for Symbolic Logic,
A. K Peters Ltd, Natick, MA.
28. ^ cf gandy 1980:126, robin gandy
church's thesis and principles for
mechanisms appearing on pp. 123–148 in
j. barwise et al. 1980 the kleene
symposium, north-holland publishing
company.
29. ^ Sebuah "robot": "Sebuah komputer
adalah sebuah robot yang melakukan
setiap tugas yang dapat dijelaskan
sebagai urutan dari instruksi." cf Stone
1972:3
30. ^ "abacus"-nya Lambek adalah
"sejumlah lokasi tak terbatas yang bisa
dihitung (lubang, kabel, dll.) berikut
dengan persediaan penghitung yang tak
terbatas (kerikil, remah roti, dll). Lokasinya
bisa dibedakan, penghitungnya tidak".
Lubangnya memiliki kapasitas tak
terbatas, dan digerakan oleh agen yang
memahami dan mampu menjalankan
sejumlah instruksi" (Lambek 1961:295).
Lambek mengacu Melzak yang
mendefinisikan mesin-Q nya sebagai
"sejumlah lokasi yang besar tanpa batas ...
persediaan penghitung yang tanpa batas
yang terdistribusi di antara lokasi-lokasi
tersebut, sebuah program, dan sebuah
operator yang tujuan satu-satunya yaitu
menjalankan program." (Melzak
1961:283). B-B-J (loc. cit.) menambahkan
syarat bahwa lubang tersebut "mampu
menyimpan sejumlah batu" (p. 46). Melzak
dan Lambek muncul di The Canadian
Mathematical Bulletin, vol. 4, no. 3,
September 1961.
31. ^ Jika tidak ada kebingungan yang
dihasilkan, kata "penghitung" bisa
dihiraukan, dan sebuah lokasi bisa
dikatakan mengandung sebuah "angka".
32. ^ "Kita mengatakan bahwa instruksi
adalah efektif bila ada sebuah prosedur
yang robot dapat ikuti supaya dapat
menentukan secara tepat bagaimana
mematuhi instruksi." (Stone 1972:6)
33. ^ cf Minsky 1967: Chapter 11
"Computer models" and Chapter 14 "Very
Simple Bases for Computability" pp. 255–
281 in particular
34. ^ cf Knuth 1973:3.
35. ^ Tapi selalu diikuti oleh IF-THEN untuk
menghindari pengurangan yang tidak
sesuai.
36. ^ Namun, beberapa instruksi
penetapan berbeda (misalnya,
DECREMENT, INCREMENT, dan
ZERO/CLEAR/EMPTY untuk mesin
Minsky) juga dibutuhkan untuk
kekomplitan-Turing; spesifikasi
lengkapnya tergantung kepada perancang.
GOTO tak bersyarat cukup mudah; ia
dapat dibentuk dengan menginisialisasi
suatu lokasi tertentu dengan nol,
misalnya, instruksi "Z ← 0"; oleh karena itu
instruksi IF Z=0 THEN GOTO xxx adalah
tak bersyarat.
37. ^ Knuth 1973:4
38. ^ Strone 1972:5. Metode untuk
mendapatkan akar tidaklah biasa: lihat
Metode untuk menghitung akar kuadrat.
39. ^ Leeuwen, Jan (1990). Handbook of
Theoretical Computer Science: Algorithms
and complexity. Volume A . Elsevier.
hlm. 85. ISBN 978-0-444-88071-0.
40. ^ John G. Kemeny and Thomas E.
Kurtz 1985 Back to Basic: The History,
Corruption, and Future of the Language,
Addison-Wesley Publishing Company, Inc.
Reading, MA, ISBN 0-201-13433-0.
41. ^ Tausworthe 1977:101
42. ^ Tausworthe 1977:142
43. ^ Knuth 1973 bagian 1.2.1,
dikembangkan oleh Tausworthe 1977 di
halaman 100ff dan Bab 9.1
44. ^ cf Tausworthe 1977
45. ^ Heath 1908:300; Hawking's Dover
2005 edisi diambil dari Heath.
46. ^ "'Biarkan CD, mengukur BF,
meninggalkan FA kurang darinya.' Hal ini
merupakan singkatan cerdik untuk
mengatakan, ukur pada BA panjang yang
sama dengan CD sampai titik F sehingga
sisa panjang FA kurang dari CD; dengan
kata lain, misalkan BF adalah yang
kelipatan terbesar dari CD yang terdapat
dalam BA" (Heath 1908:297)
47. ^ Untuk percobaan moden
menggunakan pembagian dalam
algoritme lihat Hardy dan Wright
1979:180, Knuth 1973:2 (Volume 1),
ditambah diskusi tentang algoritme Euclid
dalam Knuth 1969:293-297 (Volume 2).
48. ^ Euclid mengungkapkan pertanyaan
ini dalam Proposisi 1 nya.
49. ^ "Euclid's Elements, Book VII,
Proposition 2" . Aleph0.clarku.edu.
Diakses tanggal May 20, 2012.
50. ^ Knuth 1973:13-18. Dia memuji
"formulasi pembuktian-algoritme dalam
makan asersi dan induksi" kepada R. W.
Floyd, Peter Naur, C. A. R. Hoare, H. H.
Goldstine dan J. von Neumann. Tausworth
1977 meminjam contoh Euclid Knuth dan
mengembangkan metode Knuth di bab 9.1
dari Formal Proofs (pages 288–298).
51. ^ Tausworthe 1997:294
52. ^ cf Knuth 1973:7 (Vol. I), and his
more-detailed analyses on pp. 1969:294-
313 (Vol II).
53. ^ Kesalahan terjadi saat sebuah
algoritme mencoba memadatkan dirinya
sendiri. Keberhasilan akan memecahkan
permasalahan perhentian.
54. ^ Gillian Conahan (January 2013).
"Better Math Makes Faster Data
Networks" . discovermagazine.com.
55. ^ Haitham Hassanieh, Piotr Indyk, Dina
Katabi, and Eric Price , "ACM-SIAM
Symposium On Discrete Algorithms
(SODA) , Kyoto, January 2012. Lihat juga
sFFT Web Page .
56. ^ Kowalski 1979
57. ^ Carroll, Sue; Daughtrey, Taz (July 4,
2007). Fundamental Concepts for the
Software Quality Engineer . American
Society for Quality. hlm. 282 et seq.
ISBN 978-0-87389-720-4.
58. ^ Misalnya, volume dari suatu politop
kompleks (dijelaskan menggunakan
sebuah keanggotaan oracle) dapat
diperkirakan sampai keakuratan yang
tinggi dengan mengacak algoritme waktu
polinomial, bukan dengan deterministik;
lihat Dyer, Martin; Frieze, Alan; Kannan,
Ravi (January 1991), "A Random
Polynomial-time Algorithm for
Approximating the Volume of Convex
Bodies", J. ACM, New York, NY, USA: ACM,
38 (1): 1–17,
doi:10.1145/102782.102783 .
59. ^ George B. Dantzig and Mukund N.
Thapa. 2003. Linear Programming 2:
Theory and Extensions. Springer-Verlag.
60. ^ Tsypkin (1971). Adaptation and
learning in automatic systems . Academic
Press. hlm. 54. ISBN 978-0-08-095582-7.
61. ^ Brezina, Corona (2006). Al-
Khwarizmi: The Inventor Of Algebra . The
Rosen Publishing Group. ISBN 978-1-4042-
0513-0.
62. ^ Foremost mathematical texts in
history , according to Carl B. Boyer.
63. ^ Etymology of algorithm at
Dictionary.Reference.com
64. ^ Becker O (1933). "Eudoxus-Studien I.
Eine voreuklidische Proportionslehre und
ihre Spuren bei Aristoteles und Euklid".
Quellen und Studien zur Geschichte der
Mathematik B 2: 311–333.
65. ^ "History of Algorithms and
Algorithmics" . Scriptol.com. Diakses
tanggal November 7, 2012.
66. ^ Davis 2000:18
67. ^ Bolter 1984:24
68. ^ Bolder 1984:26
69. ^ Bolter 1984:33–34, 204–206.
70. ^ All quotes from W. Stanley Jevons
1880 Elementary Lessons in Logic:
Deductive and Inductive, Macmillan and
Co., London and New York. Republished
as a googlebook; cf Jevons 1880:199–
201. Louis Couturat 1914 the Algebra of
Logic, The Open Court Publishing
Company, Chicago and London.
Republished as a googlebook; cf Couturat
1914:75–76 gives a few more details;
interestingly he compares this to a
typewriter as well as a piano. Jevons
states that the account is to be found at
Jan . 20, 1870 The Proceedings of the
Royal Society.
71. ^ Bell and Newell diagram 1971:39, cf.
Davis 2000
72. ^ * Melina Hill, Valley News
Correspondent, A Tinkerer Gets a Place in
History, Valley News West Lebanon NH,
Thursday March 31, 1983, page 13.
73. ^ Davis 2000:14
74. ^ van Heijenoort 1967:81ff
75. ^ van Heijenoort's commentary on
Frege's Begriffsschrift, a formula
language, modeled upon that of
arithmetic, for pure thought in van
Heijenoort 1967:1
76. ^ Dixon 1906, cf. Kleene 1952:36–40
77. ^ cf. footnote in Alonzo Church 1936a
in Davis 1965:90 and 1936b in Davis
1965:110
78. ^ Kleene 1935–6 in Davis 1965:237ff,
Kleene 1943 in Davis 1965:255ff
79. ^ Church 1936 in Davis 1965:88ff
80. ^ cf. "Formulation I", Post 1936 in
Davis 1965:289–290
81. ^ Turing 1936–7 in Davis 1965:116ff
82. ^ Rosser 1939 in Davis 1965:226
83. ^ Kleene 1943 in Davis 1965:273–274
84. ^ Kleene 1952:300, 317
85. ^ Kleene 1952:376
86. ^ Turing 1936–7 in Davis 1965:289–
290
87. ^ Turing 1936 in Davis 1965, Turing
1939 in Davis 1965:160
88. ^ Hodges, p. 96
89. ^ Turing 1936–7:116
90. ^ a b Turing 1936–7 in Davis 1965:136
91. ^ Turing 1939 in Davis 1965:160

Bacaan lanjutan
Axt, P. (1959) On a Subrecursive Hierarchy
and Primitive Recursive Degrees,
Transactions of the American Mathematical
Society 92, pp. 85–105
Bell, C. Gordon and Newell, Allen (1971),
Computer Structures: Readings and
Examples, McGraw-Hill Book Company,
New York. ISBN 0-07-004357-4.
Bellah, Robert Neelly (1985). Habits of the
Heart: Individualism and Commitment in
American Life . Berkeley: University of
California Press. ISBN 978-0-520-25419-0.
Blass, Andreas; Gurevich, Yuri (2003).
"Algorithms: A Quest for Absolute
Definitions" (PDF). Bulletin of European
Association for Theoretical Computer
Science. 81. Includes an excellent
bibliography of 56 references.
Boolos, George; Jeffrey, Richard (1974,
1999). Computability and Logic (edisi ke-
4th). Cambridge University Press, London.
ISBN 0-521-20402-X. : cf. Chapter 3 Turing
machines where they discuss "certain
enumerable sets not effectively
(mechanically) enumerable".
Burgin, Mark (2004). Super-Recursive
Algorithms. Springer. ISBN 978-0-387-
95569-8.
Campagnolo, M.L., Moore, C., and Costa,
J.F. (2000) An analog characterization of
the subrecursive functions. In Proc. of the
4th Conference on Real Numbers and
Computers, Odense University, pp. 91–109
Church, Alonzo (1936a). "An Unsolvable
Problem of Elementary Number Theory".
The American Journal of Mathematics. 58
(2): 345–363. doi:10.2307/2371045 .
JSTOR 2371045 . Reprinted in The
Undecidable, p. 89ff. The first expression of
"Church's Thesis". See in particular page
100 (The Undecidable) where he defines the
notion of "effective calculability" in terms of
"an algorithm", and he uses the word
"terminates", etc.

Pranala luar
Lihat informasi mengenai
algoritme di Wiktionary.

Wikibuku memiliki buku bertajuk


Algorithma

(Indonesia) Pengertian Algoritme

(Inggris) Hazewinkel, Michiel, ed.


(2001) [1994], "Algorithm" ,
Encyclopedia of Mathematics, Springer
Science+Business Media B.V. / Kluwer
Academic Publishers, ISBN 978-1-
55608-010-4
Algorithms di Curlie (dari DMOZ)
(Inggris) Eric W. Weisstein, Algorithm
di MathWorld.
(Inggris) Dictionary of Algorithms and
Data Structures —National Institute of
Standards and Technology
(Inggris) Algorithms and Data
Structures by Dr Nikolai Bezroukov

Diperoleh dari
"https://id.wikipedia.org/w/index.php?
title=Algoritme&oldid=14843771"

Terakhir disunting 1 bulan yang lal…


Konten tersedia di bawah CC BY-SA 3.0 kecuali
dinyatakan lain.

Anda mungkin juga menyukai