[[Berkas:Euclid flowchart 1.png |jmpl|lright | [[Diagram alur]] dari sebuah algoritmealgoritma ([[AlgoritmeAlgoritma EuclidEuklides]]) untuk menghitung faktor persekutuan terbesar (f.p.b.) dari dua angka ''a'' dan ''b'' dalam lokasi bernama A dan B. AlgoritmeAlgoritma 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, algoritmealgoritma 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. (AlgoritmeAlgoritma tersebut diambil dari Scott 2009:13; simbol dan gaya penggambaran dari Tausworthe 1977).]]
Dalam [[matematika]] dan [[ilmu komputer]], '''algoritmealgoritma''' diambil dari bahasa Arab merujuk kepada sang penemu dari algoritme itu sendiri yaitu Muhammad Ibn Musa al-Khwarizmi/الخوارزمي (lihat bagian sejarah) 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 karakteristik manusia sebagai deskriptor mesin secara metaforis telah dipraktekkan oleh [[Alan Turing]] dengan terminologi seperti "memory", "search" dan "stimulus".<ref>Blair, Ann, Duguid, Paul, Goeing, Anja-Silvia and Grafton, Anthony. Information: A Historical Companion, Princeton: Princeton University Press, 2021. p. 247</ref> mama nya Yonathan Michael Faniano adalah Lily itu adalah contoh Algoritma. lalu Lily di ewe sama Yohan
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.<ref>David A. Grossman, Ophir Frieder, ''Information Retrieval: Algorithms and Heuristics'', 2nd edition, 2004, {{isbn|1402030045}}</ref>
Sebagai metode yang efektif, algoritma dapat diekspresikan dalam jumlah ruang dan waktu yang terbatas,<ref>"Any classical mathematical algorithm, for example, can be described in a finite number of English words" (Rogers 1987:2).</ref> dan dalam bahasa formal yang terdefinisi dengan baik<ref>Well defined with respect to the agent that executes the algorithm: "There is a computing agent, usually human, which can react to the instructions and carry out the computations" (Rogers 1987:2).</ref> untuk menghitung suatu [[Fungsi (matematika)|fungsi]].<ref>"an algorithm is a procedure for computing a ''function'' (with respect to some chosen notation for integers) ... this limitation (to numerical functions) results in no loss of generality", (Rogers 1987:1).</ref> Dimulai dari tataran awal dan input awal (bisa jadi kosong),<ref>"An algorithm has [[zero]] or more inputs, i.e., [[Quantity|quantities]] which are given to it initially before the algorithm begins" (Knuth 1973:5).</ref> instruksi-instruksi yang ada menggambarkan sebuah komputasi yang, ketika dieksekusi, berjalan melalui sejumlah tataran dengan jumlah terhingga yang terdefinisi dengan baik,<ref>"A procedure which has all the characteristics of an algorithm except that it possibly lacks finiteness may be called a 'computational method{{'"}} (Knuth 1973:5).</ref> yang pada akhirnya menghasilkan "output"<ref>"An algorithm has one or more outputs, i.e. quantities which have a specified relation to the inputs" (Knuth 1973:5).</ref> dan berakhir pada tataran final akhir. Transisi dari satu tataran ke tataran berikutnya tidak selalu bersifat menentukan; beberapa algoritmealgoritma, yang dikenal sebagai algoritmealgoritma acak, menggabungkan input acak.<ref>Whether or not a process with random interior processes (not including the input) is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without the use of continuous methods or analogue devices ... carried forward deterministically, without resort to random methods or devices, e.g., dice" (Rogers 1987:2).</ref>
== Sejarah ==
Konsep algoritma telah ada sejak zaman prasejarah. Algoritma [[Aritmetika|aritmatika]], seperti algoritma divisi, digunakan oleh matematikawan [[Babilonia (kota kuno)|Babilonia]] kuno sekitar tahun 2500 [[SM]] dan matematikawan [[Mesir Kuno|Mesir]] sekitar tahun 1550 SM. Matematikawan [[Yunani Kuno|Yunani]] kemudian juga menggunakan algoritma pada 240 SM sebagaimana yang terdapat pada [[Tapis Eratosthenes]] untuk menemukan bilangan prima, dan [[AlgoritmeAlgoritma Euklides|Algoritma Euklides]] untuk menemukan pembagi persekutuan terbesar dari dua bilangan.<ref name="Cooke2005">{{cite book|last=Cooke|first=Roger L.|date=2005|title=The History of Mathematics: A Brief Course|url=https://archive.org/details/historyofmathema0000cook_o3g3|publisher=John Wiley & Sons|isbn=978-1-118-46029-0}}</ref> 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-Khawārizmī|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).<ref>{{cite web|title=Al-Khwarizmi biography|url=http://www-history.mcs.st-andrews.ac.uk/Biographies/Al-Khwarizmi.html|website=www-history.mcs.st-andrews.ac.uk|archive-url=https://web.archive.org/web/20190802091553/http://www-history.mcs.st-andrews.ac.uk/Biographies/Al-Khwarizmi.html|archive-date=August 2, 2019|access-date=May 3, 2017|url-status=live}}</ref><ref>{{cite web|title=Etymology of algorithm|url=http://chambers.co.uk/search/?query=algorithm&title=21st|website=Chambers Dictionary|archive-url=https://web.archive.org/web/20190331204600/https://chambers.co.uk/search/?query=algorithm&title=21st|archive-date=March 31, 2019|access-date=December 13, 2016|url-status=live}}</ref> Namanya bermakna 'yang berasal dari (daerah) [[Khwarezmia]]', sebuah daerah yang dulunya merupakan bagian dari [[Iran Raya]] dan sekarang sebagai bagian dari [[Uzbekistan]].<ref name="Hogendijk2">{{cite journal|last=Hogendijk|first=Jan P.|year=1998|title=al-Khwarzimi|url=http://www.kennislink.nl/web/show?id=116543|journal=Pythagoras|volume=38|issue=2|pages=4–5|archive-url=https://web.archive.org/web/20090412193516/http://www.kennislink.nl/web/show?id=116543|archive-date=April 12, 2009|url-status=dead}}</ref><ref name="Oaks2">{{cite web|last=Oaks|first=Jeffrey A.|title=Was al-Khwarizmi an applied algebraist?|url=http://facstaff.uindy.edu/~oaks/MHMC.htm|publisher=[[University of Indianapolis]]|archive-url=https://web.archive.org/web/20110718094835/http://facstaff.uindy.edu/~oaks/MHMC.htm|archive-date=July 18, 2011|access-date=May 30, 2008|url-status=dead|df=mdy-all}}</ref> Sekitar tahun 825, Al-Khwarizmi menulis sebuah risalah [[Bahasa Arab|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.<ref>{{cite book|last=Brezina|first=Corona|year=2006|url=https://books.google.com/books?id=955jPgAACAAJ|title=Al-Khwarizmi: The Inventor Of Algebra|publisher=The Rosen Publishing Group|isbn=978-1-4042-0513-0}}</ref> Bukunya yang bernama Aljabar menjadi salah satu buku matematikawan yang paling banyak dibaca di Eropa pada abad pertengahan.<ref>[http://www-history.mcs.st-and.ac.uk/Extras/Boyer_Foremost_Text.html Foremost mathematical texts in history] {{Webarchive|url=https://web.archive.org/web/20110609224820/http://www-history.mcs.st-and.ac.uk/Extras/Boyer_Foremost_Text.html|date=June 9, 2011}}, according to [[Carl B. Boyer]].</ref> Dalam bahasa Latin abad pertengahan, kata ''algorismus,'' yang merupakan pengadaptasian dari namanya, menjadi kata yang bermakna "sistem bilangan desimal".<ref>{{Citation|title=algorismic|url=https://www.thefreedictionary.com/algorismic|work=The Free Dictionary|access-date=2019-11-14|archive-url=https://web.archive.org/web/20191221200124/https://www.thefreedictionary.com/algorismic|archive-date=December 21, 2019|url-status=live}}</ref> Pada abad ke-15, di bawah pengaruh kata Yunani ἀριθμός (arithmos), 'angka' (lih. 'aritmatika'), kata Latin-nya diubah menjadi algorithmus.<ref>''[[Oxford English Dictionary]]'', Third Edition, 2012 [http://www.oed.com/view/Entry/4959 ''s.v.'']</ref> Dalam bahasa Inggris, kata algorithm pertama kali digunakan pada sekitar tahun 1230 dan kemudian oleh [[Geoffrey Chaucer|Chaucer]] pada 1391. Bahasa Inggris mengadopsi istilah tersebut dari bahasa Prancis, akan tetapi baru pada abad ke-19 lah kata "algorithm" mulai memiliki makna seperti sekarang yang ada dalam bahasa Inggris modern.<ref>{{Cite journal|last=Mehri|first=Bahman|date=2017|title=From Al-Khwarizmi to Algorithm|journal=Olympiads in Informatics|volume=11|issue=2|pages=71–74|doi=10.15388/ioi.2017.special.11}}</ref>
== Definisi informal ==
{{about||penjelasan lebih rinci dari berbagai sudut pandang mengenai definisi "algoritmealgoritma" |Karakterisasi AlgoritmeAlgoritma }}
Definisi informalnya bisa berarti "sekumpulan aturan yang secara tepat menentukan seurutan operasi".
<ref>Stone 1973:4</ref>
yang mengikutkan semua program komputer, termasuk program yang tidak melakukan perhitungan numerik.
Secara umum, sebuah program hanyalah sebuah algoritmealgoritma jika ia akan berhenti nantinya.
<ref>
Stone secara sederhana membutuhkan "harus berhenti dalam sejumlah langkah" (Stone 1973:7-8).
</ref>
Sebuah contoh prototipikal dari suatu algoritmealgoritma adalah [[algoritmealgoritma 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.
{{Harvtxt|Boolos|Jeffrey|1974, 1999}} memberikan sebuah makna informal dari kata algoritmealgoritma dalam persamaan berikut:
<blockquote>
Suatu "bilangan tak-terbatas" adalah bilangan yang elemen-elemenya bisa berkorespondensi satu-ke-satu dengan integer.
Maka, Boolos dan Jeffrey mengatakan bahwa sebuah algoritmealgoritma berarti instruksi bagi sebuah proses yang "membuat" keluaran integer dari sebuah "masukan" ''acak'' integer yang, secara teori, bisa sangat besar.
Maka sebuah algoritmealgoritma 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 algoritmealgoritma mengandung lebih dari itu, sesuatu yang kurang lebih (untuk contoh penjumlahan):
:Instruksi rinci dan tepat (dalam bahasa yang dipahami oleh "komputer")<ref>cf Stone 1972:5</ref> untuk proses yang cepat, efisien, "baik"<ref>Knuth 1973:7 menyatakan: "Pada praktiknya kita tidak hanya menginginkan algoritmealgoritma, kita menginginkan algoritam yang ''baik'' ... salah satu kriteria dari kebaikannya adalah lama waktu yang digunakan untuk menjalankan algoritmealgoritma ... kriteria lainnya adalah kemampuan adaptasi dari algoritmealgoritma ke komputer, kesederhanaan dan elegan, dll."</ref> yang menentukan "pergerakan" dari "komputer" (mesin atau manusia, dibekali dengan informasi dan kemampuan internal yang dibutuhkan)<ref>cf Stone 1973:6</ref> untuk menemukan, dekode, dan kemudian mengolah masukan integer/simbol '''m''' dan '''n''', simbol '''+''' dan '''=''' ... dan "secara efektif"<ref>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.</ref> menghasilkan, dalam waktu yang "masuk akal",<ref>Knuth, loc. cit</ref> keluaran integer '''y''' pada tempat dan format tertentu.
Konsep dari ''algoritmealgoritma'' juga digunakan untuk mendefinisikan notasi dari [[desidabilitas (logika)|desidabilitas]].
Notasi tersebut adalah pusat untuk menjelaskan bagaimana [[sistem formal]] berasal dari sejumlah kecil [[aksioma]] dan aturan.
Dalam [[logika]], waktu dari sebuah algoritmealgoritma 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 ''algoritmealgoritma'' yang sesuai dengan konkret (pada tingkat tertentu) dan penggunaan secara abstrak dari istilah tersebut.
== Formalisasi ==
AlgoritmeAlgoritma sangat penting bagi cara komputer mengolah data.
Banyak [[program komputer]] mengandung algoritmealgoritma 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 algoritmealgoritma bisa dianggap sebagai urutan operasi yang bisa disimulasikan oleh sebuah sistem [[Kelengkapan Turing|Turing-lengkap]].
Penulis yang mendukung tesis ini termasuk Minsky (1967), Savage (1987), dan Gurevich (2000):
<blockquote>
<blockquote>
Gurevich: "... argumen informal Turing untuk menyokong tesis ini membenarkan tesis yang lebih kuat: setiap algoritmealgoritma bisa disimulasikan oleh sebuah mesin Turing ... menurut Savage [1987], sebuah algoritmealgoritma adalah sebuah proses penghitungan yang ditentukan oleh sebuah mesin Turing".
<ref>
Gurevich 2000:1, 3
</blockquote>
Biasanya, bila sebuah algoritmealgoritma 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 algoritmealgoritma.
Pada praktiknya, keadaan tersebut disimpan pada satu atau lebih [[struktur data]].
Untuk beberapa proses komputasi, algoritmealgoritma 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 algoritmealgoritma adalah kumpulan dari langkah-langkah yang tepat, urutan dari komputasi selalu penting bagi berfungsinya algoritmealgoritma.
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 algoritmealgoritma 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 algoritmealgoritma 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 algoritmealgoritma lihat [[pemrograman fungsional]] dan [[pemrograman logika]].
=== Menggambarkan algoritmealgoritma ===
AlgoritmeAlgoritma dapat digambarkan dengan banyak notasi, termasuk [[bahasa alamiah]], [[pseudokode]], [[diagram alur]], [[DRAKON|bagan drakon]], [[bahasa pemrograman]] atau [[tabel kontrol]] (diproses oleh [[penerjemah (komputasi)|penerjemah]]).
Ekspresi bahasa alamiah terhadap algoritmealgoritma condong lebih banyak dan rancu, dan jarang digunakan untuk algoritmealgoritma yang kompleks dan teknis.
Pseudokode, diagram alur, bagan drakon, dan tabel kontrol adalah cara yang terstruktur untuk menggambarkan algoritmealgoritma yang mencegah banyaknya kerancuan pada pernyataan-pernyataan bahasa alamiah.
Bahasa pemrograman ditujukan untuk mengekspresikan algoritmealgoritma dalam sebuah bentuk yang dapat dieksekusi oleh komputer, tetapi sering kali digunakan sebagai suatu cara untuk menentukan atau mendokumentasikan algoritmealgoritma.
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 algoritmealgoritma dapat dikelompokan ke dalam tiga tingkatan dari deskripsi mesin Turing:
<ref>Sipser 2006:157</ref>
; '''1 Deskripsi tingkat-tinggi'''
: "... ditujukan untuk menjelaskan algoritmealgoritma, 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."
: Lebih rinci, "tingkat paling rendah", menjelaskan "tabel kondisi" dari mesin Turing.
Sebagai contoh dari algoritmealgoritma sederhana "Penjumlahan m+n" dijelaskan dalam tiga tingkatan tersebut lihat [[contoh algoritmealgoritma]].
== Implementasi ==
Kebanyakan algoritmealgoritma ditujukan untuk diimplementasikan sebagai [[program komputer]].
Namun, algoritmealgoritma 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.
== AlgoritmeAlgoritma komputer ==
[[Berkas:Euclid's algorithm structured blocks 1.png |jmpl|ka|493x493px|Contoh diagram alur dari [[Teorema program terstruktur|struktur Bohm-Jacopini]]: URUTAN (segi empat), WHILE-DO dan IF-THEN-ELSE. Ketiga struktur dibentuk dari kondisi primitif GOTO (<code> IF ''test''=true THEN GOTO step xxx </code>) (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 algoritmealgoritma 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 algoritmealgoritma yang ''baik'' dalam definisi estetika sederhana. Salah satu kriterianya ... adalah waktu yang dibutuhkan untuk berjalannya algoritmealgoritma ... Kriteria yang lain adalah adaptasi dari algoritmealgoritma ke komputer, kesederhanaan dan elegan, dll"<ref>Knuth 1973:7</ref>
:Chaitin: "... sebuah program adalah 'elegan'', maksud saya adalah ia merupakan program terkecil untuk menghasilkan keluaran."<ref>Chaitin 2005:32</ref>
Chaitin membuka definisinya dengan: "Saya akan perlihatkan bahwa anda tidak dapat membuktikan sebuah program adalah 'elegan'"—bukti tersebut akan menyelesaikan [[permasalahan perhentian]] (ibid).
''AlgoritmeAlgoritma terhadap fungsi yang dapat dihitung oleh algoritmealgoritma'': Untuk sebuah fungsi bisa ada beberapa algoritmealgoritma.
Hal ini benar, bahkan tanpa mengembangkan kumpulan instruksi yang ada bagi programmer.
Rogers mengamati bahwa "Sangat ... penting untuk membedakan antara pengertian ''algoritmealgoritma'', misalnya prosedur dan pernyataan ''fungsi yang dihitung oleh algoritmealgoritma'', misalnya pemetaan hasil dari prosedur.
Fungsi yang sama bisa memiliki beberapa algoritmealgoritma berbeda".
<ref>
Rogers 1987:1-2
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 algoritmealgoritma Euclid bisa dilihat di bawah.
''Komputer (dan komputor), model dari komputasi'': Sebuah komputer (atau manusia "komputor"
</ref>
''Simulasi dari sebuah algoritmealgoritma: bahasa komputer (komputor)'': Knuth menganjurkan pembaca bahwa "cara terbaik untuk belajar algoritmealgoritma dalah mencobanya ... langsung ambil pulpen dan kertas dan bekerja lewat contoh".
<ref>Knuth 1973:4</ref>
Lalu bagaimana dengan simulasi atau eksekusi yang sebenarnya?
Programmer harus menerjemahkan algoritmealgoritma 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 algoritmealgoritma dapat efektif ia harus menyediakan sejumlah aturan untuk mengekstrak akar kuadrat.
<ref>
Strone 1972:5. Metode untuk mendapatkan akar tidaklah biasa: lihat [[Metode untuk menghitung akar kuadrat]].
</ref>
Bila kecepatan yang dihitung, jumlah instruksi berpengaruh.
Sebagai contohnya, subprogram dalam algoritmealgoritma Euclid untuk menghitung sisa akan berjalan lebih cepat jika programmer memiliki instruksi "modulus" (sisa pembagian) bukannya dengan pengurangan (atau lebih parah: hanya "penurunan").
''Pemrograman terstruktur, struktur kanonikal'': Menurut [[Tesis Church-Turing]] setiap algoritmealgoritma 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".
</ref>
''Simbol diagram alur<ref>cf Tausworthe 1977</ref>'': Pembantu grafik yang disebut [[diagram alur]] memberikan suatu cara untuk menjelaskan dan mendokumentasikan sebuah algoritmealgoritma (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).
== Contoh ==
{{Further2|[[Contoh algoritmealgoritma]]}}
=== Contoh AlgoritmeAlgoritma ===
[[Berkas:Sorting quicksort anim.gif |jmpl| Animasi dari [[algoritmealgoritma quicksort]] mengurutkan larik dari nilai acak. Batang merah menandakan elemen pivot; pada awal animasi, elemen paling kanan dipilih sebagai pivot.]]
Salah satu dari algoritmealgoritma 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 algoritmealgoritma sederhana, yang bisa dinyatakan dalam kalimat bahasa deskripsi tingkat-tinggi, sebagai:
''Deskripsi tingkat-tinggi:''
''Deskripsi (Quasi-)formal:''
Ditulis dalam kalimat yang lebih dekat dengan bahasa tingkat-tinggi dari program komputer, berikut ini adalah kode formal dari algoritmealgoritma dalam [[pseudokode]] atau [[kode pijin]]:
{{algorithm-begin|name=LargestNumber}}
{{algorithm-end}}
=== AlgoritmeAlgoritma Euclid ===
{{Further2|[[AlgoritmeAlgoritma Euklid]]}}
[[Berkas:Euclid's algorithm Book VII Proposition 2 2.png | 250px|jmpl|kiri| Contoh diagram dari algoritmealgoritma 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).]]
AlgoritmeAlgoritma [[Euclid]] muncul sebagai Proposisi II dalam Book VII ("Elementary Number Theory") dari ''[[Euclid's Elements|Elements]]''.
<ref>
Heath 1908:300; Hawking's Dover 2005 edisi diambil dari Heath.
Dalam dunia modern, sisa ''r = l - q*s'', ''q'' sebagai hasil bagi, atau sisa ''r'' adalah "modulus", bagian sisa-integer yang tersisa setelah pembagian.
<ref>
Untuk percobaan moden menggunakan pembagian dalam algoritmealgoritma lihat Hardy dan Wright 1979:180, Knuth 1973:2 (Volume 1), ditambah diskusi tentang algoritmealgoritma Euclid dalam Knuth 1969:293-297 (Volume 2).
</ref>
Euclid mengungkapkan pertanyaan ini dalam Proposisi 1 nya.
</ref>
Walau algoritmealgoritma Nicomachus sama dengan Euclid, bila kedua bilangan prima maka menghasilkan angka "1" untuk bilangan pembagi terbesar.
Jadi untuk lebih jelasnya algoritmealgoritma berikut adalah algoritmealgoritma Nicomachus.
==== Contoh ====
[[File:Euclids-algorithm-example-1599-650.gif | 350px |jmpl|ka| Ekspresi grafik dari algoritmealgoritma Euclid menggunakan contoh dengan 1599 dan 650.
<syntaxhighlight lang="text" highlight="1,5">
</syntaxhighlight>]]
==== Bahasa komputer untuk algoritmealgoritma Euclid ====
Hanya beberapa ''tipe'' instruksi yang dibutuhkan untuk mengeksekusi algoritme—beberapaalgoritma—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 algoritmealgoritma Euclid ====
[[File:Euclid's algorithm Inelegant program 1.png|jmpl|163px|ka|"Inelegan" adalah terjemahan dari versi Knuth terhadap algoritmealgoritma 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".]]
AlgoritmeAlgoritma 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:
GOTO [[#7|7]].
'''E2: [Apakah sisa 0?]''': APAKAH (i) pengukuran terakhir adalah sama dan sisa di R adalah 0 program dapat berhenti, ATAU (ii) algoritmealgoritma harus terus jalan: hasil pengukuran meninggalkan sisa di R kurang dari angka pengukuran dalam S.
{{vanchor|10|el10}} IF R = 0 THEN
selesai jadi
lanjut ke langkah [[#11|11]],
'''E3: [Interchange ''s'' dan ''r'']''': Sulitnya algoritmealgoritma Euclid. Menggunakan sisa ''r'' untuk mengukur angka terkecil sebelumnya ''s'':; L sebagai lokasi sementara.
{{vanchor|11|el11}} L ← S
{{vanchor|12|el12}} R ← S
{{vanchor|16|el16}} HALT, END, STOP.
==== Program elegan untuk algoritmealgoritma Euclid ====
Versi algoritmealgoritma 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 [[AlgoritmeAlgoritma Euclid]] untuk [[faktor persekuturan terbesar]]
6 PRINT "Masukan dua integer besar dari 0"
10 INPUT A,B
dengan kata lain "arti" dari pengurangan dibalik.
=== Menguji algoritmealgoritma Euclid ===
Apakah algoritmealgoritma berjalan seperti yang penulis inginkan?
Beberapa kasus uji cukup menentukan fungsi inti.
Sumber pertama
Apa yang terjadi bila angka ''negatif'' dimasukan?
Angka desimal?
Bila angka masukan, misalnya [[domain (matematika)|domain]] dari fungsi yang dihitung oleh algoritmealgoritma/program, mengikutkan hanya integer positif termasuk 0, maka kegagalan pada nol mengindikasikan bahwa algoritmealgoritma (dan program [[instansi (ilmu komputer)|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 algoritmealgoritma Euclid, dan dia mengajukan "metode umum yang digunakan untuk membuktikan validitas dari setiap algoritmealgoritma."
<ref>
Knuth 1973:13-18. Dia memuji "formulasi pembuktian-algoritmealgoritma 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).
</ref>
Tausworthe mengajukan bahwa sebuah pengukuran dari kompleksitas dari sebuah program adalah panjang dari pembuktian kebenarannya.
</ref>
=== Menghitung dan meningkatkan algoritmealgoritma 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 algoritmealgoritma]]
<ref>
cf Knuth 1973:7 (Vol. I), and his more-detailed analyses on pp. 1969:294-313 (Vol II).
</ref>
mengindikasikan kenapa hal tersebut terjadi: "Elegan" melakukan pengujian kondisi ''dua'' kali disetiap pengulangan pengurangan, sementara "inelegan" hanya sekali.
Bila algoritmealgoritma (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 algoritmealgoritma 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 algoritmealgoritma tidak bisa diotomatiskan dengan algoritmealgoritma generalisasi;
<ref>
Kesalahan terjadi saat sebuah algoritmealgoritma mencoba memadatkan dirinya sendiri.
Keberhasilan akan memecahkan [[permasalahan perhentian]].
</ref>
untuk setiap angka pada A, B dan R, S hal ini selalu merupakan kasus yang membutuhkan analisis yang mendalam.
== Analisis AlgoritmeAlgoritma ==
{{Main|Analisis algoritmealgoritma}}
Sangat penting untuk mengetahui berapa banyak sumber tertentu (seperti waktu dan tempat penyimpanan) secara teoretis diperlukan untuk sebuah algoritmealgoritma.
Metode-metode telah dikembangkan untuk [[analisis algoritmealgoritma]] untuk mendapatkan jawaban kuantitatif (estimasi);
sebagai contohnya, algoritmealgoritma pengurutan di atas memerlukan waktu O(''n''), menggunakan [[notasi O besar]] dengan ''n'' sebagai panjang deret (yang akan diurut).
Setiap saat algoritmealgoritma 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.
AlgoritmeAlgoritma berbeda mungkin menyelesaikan pekerjaan yang sama dengan kumpulan instruksi yang berbeda dengan waktu, ruang, atau '[[efisiensi algoritmik|usaha]]' lebih sedikit atau banyak dari yang lain.
Sebagai contohnya, algoritmealgoritma [[pencairan binari]] biasanya mengungguli pencarian berderet secara [[pencarian paksa|paksa]] bila digunakan untuk [[tabel pencarian]] pada deret terurut.
=== Formal lawan empiris ===
{{Main|AlgoritmeAlgoritma empiris|Profiling (pemrograman komputer)|Optimisasi program}}
[[analisis algoritmealgoritma|Analisis dan kajian algoritmealgoritma]] adalah bidang dari ilmu komputer, dan biasanya dilakukan secara abstrak tanpa menggunakan [[bahasa pemrograman]] tertentu atau implementasi.
Dalam artian, analisis algoritmealgoritma mirip dengan bidang matematika lainnya yang mana fokus pada properti yang mendasari algoritmealgoritma dan bukan pada implementasi tertentu.
Biasanya [[pseudokode]] digunakan pada analisis karena merupakan representasi paling umum dan sederhana.
Namun, pada akhirnya, kebanyakan algoritmealgoritma diimplementasikan di perangkat keras / lunak tertentu dan [[efisiensi algoritmik]] mereka akhirnya diuji menggunakan kode yang sebenarnya.
Untuk solusi dari sebuah masalah, efisiensi dari algoritmealgoritma tertentu mungkin tidak terlalu berpengaruh (kecuali n sangat besar) tetapi bagi algoritmealgoritma 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 algoritmealgoritma yang tidak berbahaya.
Pengujian empiris berguna karena bisa membuka interaksi tak terduga yang mempengaruhi performa.
[[Benchmark (komputasi)|Benchmark]] bisa digunakan untuk membandingkan potensi kenaikan sebelum/sesudah algoritmealgoritma setelah optimisasi program dilakukan.
==== Efisiensi eksekusi ====
{{Main|Efisiensi algoritmik}}
Untuk menggambarkan kemungkinan potensi peningkatan bahkan pada algoritmealgoritma yang sudah teruji, inovasi terbaru, berkaitan dengan algoritmealgoritma [[Transformasi Fourier Cepat|FFT]] (banyak digunakan di bidang pemrosesan gambar), bisa menurunkan waktu pemrosesan dengan faktor sampai 1.000 untuk aplikasi seperti pencitraan medis.
<ref>{{cite web
| title=Better Math Makes Faster Data Networks
== Klasifikasi ==
Salah satu cara mengklasifikasikan algoritmealgoritma yaitu dengan cara implementasi.
; Rekursi atau iterasi
: Sebuah [[algoritmealgoritma rekursi]] yaitu algoritmealgoritma yang memanggil dirinya sendiri berulang kali sampai kondisi tertentu tercapai, ini merupakan metode umum bagi [[pemrograman fungsional]]. AlgoritmeAlgoritma [[Iterasi|iteratif]] menggunakan konstruksi berulang seperti [[Pengulangan program|pengulangan]] dan terkadang struktur data tambahan seperti [[Tumpukan (struktur data)|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 algoritmealgoritma bisa dilihat sebagai [[Penalaran deduktif|logika deduksi]] terkontrol. Pernyataan ini diekspresikan sebagai: '''AlgoritmeAlgoritma = logika + kontrol'''.<ref>Kowalski 1979</ref> 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 algoritmealgoritma ditentukan dengan memberikan hanya komponen logikanya. Daya tarik dari pendekatan ini adalah [[Semantik formal dari bahasa pemrograman|semantik]] elegan: sebuah perubahan dalam aksioma memiliki perubahan dalam algoritmealgoritma.
; Serial, paralel atau terdistribusi
: AlgoritmeAlgoritma biasanya dibicarakan dengan asumsi bahwa komputer menjalankan satu instruksi algoritmealgoritma setiap waktu. Komputer tersebut terkadang disebut dengan komputer serial. [[Rancang algoritmealgoritma|Rancangan algoritmealgoritma]] untuk lingkungan tersebut disebut dengan algoritmealgoritma serial, terbalik dengan [[algoritmealgoritma paralel]] atau [[algoritmealgoritma terdistribusi]]. AlgoritmeAlgoritma paralel memanfaatkan arsitektur komputer yang mana beberapa prosesor bisa mengerjakan masalah pada waktu yang sama, selain itu algoritmealgoritma terdistribusi memanfaatkan banyak mesin yang terhubung dengan [[Jaringan komputer|jaringan]]. AlgoritmeAlgoritma paralel atau terdistribusi membagi permasalahan menjadi banyak sub-masalah simetris atau asimetris dan mengumpulkan hasilnya kembali. Konsumsi sumber pada algoritmealgoritma tersebut tidak hanya perputaran prosesor disetiap prosesor tetapi juga daya komunikasi antara prosesor. AlgoritmeAlgoritma pengurutan bisa diparalelkan secara efisien, tetapi biaya komunikasinya sangat mahal. AlgoritmeAlgoritma iteratif secara umum bisa diparalelkan. Beberapa permasalahan tidak ada algoritmealgoritma paralelnya, dan disebut dengan permasalahan serial lahiriah.
; Deterministik atau non-deterministik
: [[AlgoritmeAlgoritma deterministik]] menyelesaikan masalah dengan keputusan yang tepat disetiap langkah dari algoritmealgoritma sedangkan [[algoritmealgoritma non-deterministik]] menyelesaikan masalah lewat penerkaan walaupun penerkaan biasanya lebih akurat dengan menggunakan [[heuristik]].
; Tepat atau perkiraan
: Bila banyak algoritmealgoritma sampai pada solusi yang tepat, [[algoritmealgoritma perkiraan]] mencari sebuah perkiraan yang terdekat dengan solusi benarnya. Perkiraan bisa menggunakan baik strategi deterministik atau acak. AlgoritmeAlgoritma seperti itu memiliki nilai guna untuk banyak permasalahan sulit.
; [[AlgoritmeAlgoritma quantum]]
: Berjalan di model realistik dari [[komputasi quantum]]. Istilah ini biasanya digunakan untuk algoritmealgoritma yang tampak pada dasarnya quantum, atau menggunakan beberapa fitur penting komputasi quantum seperti [[superposisi quantum]] atau [[belitan quantum]].
== Paradigma secara rancangan ==
Cara lain mengklasifikasikan algoritmealgoritma adalah dengan metodologi rancangannya atau paradigma.
Ada sejumlah paradigma, tiap-tiapnya berbeda dari yang lain.
Lebih lanjut, setiap kategori tersebut mengikutkan banyak tipe algoritmealgoritma yang berbeda.
Beberapa paradigma umum termasuk:
; Membagi dan menaklukan (''Divide and conqueror'')
: [[AlgoritmeAlgoritma 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 [[mergesort|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 '''algoritmealgoritma 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 algoritmealgoritma kurang-dan-taklukan. Sebuah contoh dari algoritmealgoritma kurang-dan-taklukan adalah [[algoritmealgoritma pencarian binari]].
; Pencarian dan enumerasi
: Banyak masalah (seperti bermain [[catur]]) bisa dimodelkan sebagai masalah dalam [[teori grafik|grafik]]. Sebuah [[algoritmealgoritma eksplorasi grafik]] menentukan aturan-aturan untuk bergerak disekitar grafik dan berguna bagi masalah tersebut. Kategori ini juga mengikutkan [[algoritmealgoritma pencarian]], enumerasi [[batas dan cabang]] dan [[backtracking]].
; [[AlgoritmeAlgoritma pengacakan]]
: AlgoritmeAlgoritma 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]].<ref>Misalnya, [[volume]] dari suatu [[politop kompleks]] (dijelaskan menggunakan sebuah keanggotaan oracle) dapat diperkirakan sampai keakuratan yang tinggi dengan mengacak algoritmealgoritma waktu polinomial, bukan dengan deterministik; lihat {{citation|last1=Dyer|first1=Martin|last2=Frieze|first2=Alan|last3=Kannan|first3=Ravi|date=January 1991|doi=10.1145/102782.102783|issue=1|journal=J. ACM|location=New York, NY, USA|pages=1–17|publisher=ACM|title=A Random Polynomial-time Algorithm for Approximating the Volume of Convex Bodies|volume=38}}.</ref> Apakah algoritmealgoritma pengacakan dengan [[P (kompleksitas)|kompleksitas waktu polinomial]] bisa menjadi algoritmealgoritma tercepat untuk beberapa masalah masih menjadi pertanyaan terbukan yang dikenal sebagai [[Masalah P versus NP]]. Ada dua kelas besar dari algoritmealgoritma ini:
# [[AlgoritmeAlgoritma Monte Carlo]] mengembalikan jawaban yang benar dengan probabilitas-tinggi. Misalnya, [[RP (kompleksitas)|RP]] adalah sub-klas dari algoritmealgoritma ini yang berjalan dalam [[waktu polinomial]])
# [[AlgoritmeAlgoritma Las Vegas]] selalu mengembalikan jawaban yang benar, tetapi waktu prosesnya adalah hanya terikat secara probabilistik, misalnya [[Waktu Probabilistik Polinomial Galat-Nol|ZPP]].
; [[Reduksi (kompleksitas)|Reduksi]]
: Teknik ini menyelesaikan masalah sulit dengan mengubahnya menjadi permasalahan yang lebih diketahui yang mana kita (berharap) memiliki algoritmealgoritma [[asimptotikal optimal]]. Tujuannya yaitu untuk menemukan sebuah algoritmealgoritma reduksi yang [[teori kompleksitas komputasi|kompleksitasnya]] tidak didominasi oleh algoritmealgoritma hasil reduksi. Sebagai contoh, [[algoritmealgoritma 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 algoritmealgoritma yang dapat memecahkan setiap permasalahan dalam kategori ini, seperti [[algoritmealgoritma simpleks]] yang terkenal.<ref>
[[George B. Dantzig]] and Mukund N. Thapa. 2003. ''Linear Programming 2: Theory and Extensions''. Springer-Verlag.</ref> 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]]. AlgoritmeAlgoritma 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, algoritmealgoritma yang dikhususkan atau algoritmealgoritma 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, [[algoritmealgoritma Floyd-Warshall]], jalan terpendek ke tujuan dari sebuah vertex dalam [[grafik (matematika)|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 matematis|tabel]] dari submasalah yang telah diselesaikan, pemrograman dinamis mereduksi eksponensial dari banyak permasalahan menjadi kompleksitas polinomial.
; Metode rakus
: Sebuah [[algoritmealgoritma rakus]] mirip dengan [[pemrograman dinamis|algoritmealgoritma 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. AlgoritmeAlgoritma ini tidak terlalu mendalam, dan tidak memberikan jawaban yang akurat terhadap banyak permasalahan. Tapi bila ia bekerja, ia menjadi metode yang paling cepat. AlgoritmeAlgoritma rakus paling terkenal adalah menemukan rentang pohon minimal seperti pada [[pengkodean Huffman|Pohon Huffman]], [[AlgoritmeAlgoritma Kruskal|Kruskal]], [[AlgoritmeAlgoritma Prim|Prim]], [[AlgoritmeAlgoritma Sollin|Sollin]].
; Metode heuristik
: Dalam [[masalah optimisasi]], [[algoritmealgoritma heuristik]] bisa digunakan untuk menemukan suatu solusi yang terdekat dengan solusi optimal jika seandainya menemukan solusi optimal tidak praktis. AlgoritmeAlgoritma 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. AlgoritmeAlgoritma tersebut termasuk [[pencarian lokal (optimisasi)|pencarian lokal]], [[pencarian tabu]], [[simulasi pelunakan]], dan [[algoritmealgoritma genetik]]. Beberapa dari mereka, seperti simuasi pelunakan, adalah algoritmealgoritma non-deterministik sementara yang lainnya, seperti pencarian tabu, adalah deterministik. Saat batas dari galat dari solusi non-optimal diketahui, algoritmealgoritma kemudia dikategorikan sebagai [[algoritmealgoritma pendekatan]].
=== Berdasarkan bidang kajian ===
{{Lihat pula|Daftar algoritmealgoritma}}
Setiap bidang sains memiliki permasalahannya sendiri dan membutuhkan algoritmealgoritma yang efisien. Masalah yang berkaitan di satu bidang terkadang dipelajari bersama. Beberapa contoh yaitu [[algoritmealgoritma pencarian]], [[algoritmealgoritma penggabungan]], [[analisis numerik|algoritmealgoritma numerik]], [[teori grafik|algoritmealgoritma grafik]], [[algoritmealgoritma deret]], [[geometri komputasi|algoritmealgoritma komputasi geometri]], [[kombinatorial|algoritmealgoritma kombinatorial]], [[algoritmas medis]], [[mesin belajar]], [[kriptografi]], algoritmealgoritma [[kompresi data]] dan [[penguraian|teknik penguraian]].
Terkadang bidang-bidang tersebut saling tumpang tindih, dan perkembangan algoritmealgoritma 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 ===
{{Lihat pula|kelas kompleksitas|Kompleksitas parameterisasi}}
AlgoritmeAlgoritma bisa diklasifikasikan berdasarkan jumlah waktu yang dibutuhkan untuk selesai dibandingkan dengan ukuran inputnya. Ada berbagai varietas: beberapa algoritmealgoritma 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 algoritmealgoritma dengan kompleksitas yang berbeda, sementara permasalahan yang lain bisa saja tidak memiliki algoritmealgoritma atau tidak diketahui algoritmanya yang efisien. Ada juga pemetaan dari beberapa algoritmealgoritma terhadap permasalahan lain. Karena itu, lebih cocok untuk mengklasifikasikan permasalahan itu sendiri bukannya algoritmealgoritma menjadi kelas-kelas yang sama berdasarkan kompleksitas dari kemungkinan algoritmealgoritma terbaik baginya.
Burgin (2005, p. 24) menggunakan definisi algoritmealgoritma secara umum yang melonggarkan kebutuhan bersama yang keluaran dari algoritmealgoritma yang menjalankan sebuah fungsi harus ditentukan setelah sejumlah langkah. Dia mendefinisikan kelas super-rekursif dari algoritmealgoritma sebagai "sebuah kelas algoritmealgoritma 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 ===
{{Lihat pula|Keragaman evaluatif}}
Untuk menjaga keseimbangan saat mengintegrasikan mesin ke dalam masyarakat, seseorang bisa mengklasifikasikan algoritmealgoritma 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 algoritmealgoritma pembuat-keputusan menjadi tiga tipe evaluatif: AlgoritmeAlgoritma bottom-up membuat penilaian tidak terprediksi bagi pemrogram (misalnya, perangkat lunak yang berevolusi).
Yang lainnya (top-down) dibagi menjadi [[etika deontologikal|deontologikal]] (yang dapat bergantung pada implementasi aturan pemrograman) lawan [[Konsekuensialism|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 algoritmealgoritma, dan membagi kelas bottom-up menjadi "[[Etika pengganggu|pengganggu]]" (algoritmealgoritma yang tidak terprediksi karena menggunakan generator pengacakan) lawan "[[Etika peran|relasional]]" (algoritmealgoritma 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 algoritmealgoritma terkadang memiliki subkomponen dari tipe lainnya.
Sebagai contohnya, negosiator perdagangan saham bisa mengimplementasikan sebuah algoritmealgoritma 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).
== AlgoritmeAlgoritma berkelanjutan ==
Kata sifat "berkelanjutan" bila diterapkan pada kata "algoritmealgoritma" bisa berarti:
* Sebuah algoritmealgoritma beroperasi pada data yang merepresentasikan kuantitas yang berkelanjutan, walaupun data tersebut direpresentasikan oleh pendekatan diskrit—seperti algoritmealgoritma yang dipelajari dalam [[analisis numerik]]; atau
* Sebuah algoritmealgoritma dalam bentuk dari [[persamaan diferensial]] yang beroperasi secara berkelanjutan terhadap data, berjalan dalam sebuah [[komputer analog]].
<ref>{{cite book
|author = Tsypkin
== Isu legalitas ==
:''Lihat pula: [[Paten perangkat lunak]] untuk pendahuluan umum dari paten pada perangkat lunak, termasuk algoritmealgoritma untuk diimplementasikan pada komputer.''
AlgoritmeAlgoritma 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 algoritmealgoritma tidak bisa dipatenkan (sebagaimana dalam [[Gottschalk v. Benson]]).
Namun, penerapan praktis dari algoritmealgoritma terkadang dipatenkan.
Sebagai contohnya, dalam [[Diamond v. Diehr]], aplikasi dari algoritmealgoritma [[umpan-balik]] sederhana untuk membantu dalam menyembuhkan [[karet sintetis]] dianggap dapat dipatenkan.
[[Debat paten perangkat lunak|Mematenkan perangkat lunak]] sangat kontroversial, dan ada paten yang mengikutkan algoritmealgoritma yang sangat dikritisi, terutama algoritmealgoritma [[kompresi data]], seperti [[Graphics Interchange Format|Format Grafiknya]] [[Unisys]].
Sebagai tambahan, beberapa algoritmealgoritma kriptografi memiliki batasan ekspor (lihat [[ekspor dari kriptografi]]).
== Etimologi ==
Kata ''"AlgoritmeAlgoritma"'', atau ''"[[Algorisma]]"'' pada versi penulisan lain, datang dari nama [[al-Khwarizmi]]. dieja dalam Arab klasik sebagai Al-Khwarithmi. Al-khwarizmi ({{lang-fa|خوارزمي}}, 780-850) adalah [[matematikawan]], [[ahli astronomi]], [[ahli geografi]] dari [[orang Persia|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]].
<ref name="Hogendijk">{{cite journal|last=Hogendijk|first=Jan P.|year=1998|title=al-Khwarzimi|url=http://www.kennislink.nl/web/show?id=116543|dead-url=yes|format=|journal=Pythagoras|volume=38|issue=2|pages=4–5|issn=0033–4766|archive-url=https://web.archive.org/web/20080319024147/http://www.kennislink.nl/web/show?id=116543|archive-date=2008-03-19|access-date=2014-08-28|ref=harv}}</ref>
<ref name="Oaks">{{cite web|last=Oaks|first=Jeffrey A.|title=Was al-Khwarizmi an applied algebraist?|url=http://facstaff.uindy.edu/~oaks/MHMC.htm|publisher=[[University of Indianapolis]]|archive-url=https://www.webcitation.org/5uGLbfttF?url=http://facstaff.uindy.edu/~oaks/MHMC.htm|archive-date=2010-11-15|dead-url=yes|accessdate=2008-05-30}}</ref>
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 algoritmealgoritma 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.
AlgoritmeAlgoritma paling tua yang dikenal sekarang adalah [[AlgoritmeAlgoritma Euklid]] (lihat juga [[Pengembangan algoritmealgoritma Euklid]]).
Sebelum ditemukan istilah ''algorithm'' orang Yunani menyebutnya ''anthyphairesis'' secara harfiah berarti anti-substraksi atau substraksi timbal-balik (untuk bacaan lebih lanjut [[David Fowler (matematikawan)|disini]] dan [http://livetoad.org/Courses/Documents/bb63/Notes/continued_fractions.pdf ini] {{Webarchive|url=https://web.archive.org/web/20131103100608/http://livetoad.org/Courses/Documents/bb63/Notes/continued_fractions.pdf |date=2013-11-03 }}.
AlgoritmeAlgoritma dikenal oleh orang Yunani berabad sebelum
<ref>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.</ref>
Euclid.
Bukannya kata ''algebra'' orang Yunani menggunakan istilah ''arithmetica''(ἀριθμητική, yaitu dalam karya [[Diophantus]] yang dikenal "[[Arithmetica|bapak dari Aljabar]]" - lihat juga artikel Wikipedia [[persamaan Diophantine]] dan [[Eudoxus dari Cnidus|Eudoxos]]).
== Sejarah: Perkembangan dari kata "algoritmealgoritma" ==
=== Asal mula ===
Bukti terawal tentang algoritma ditemukan dalam matematika [[Babilonia (kota kuno)|Babilonia]] di [[Mesopotamia]] kuno (saat ini merupakan bagian dari [[Irak]]). Sebuah tablet tanah liat [[Sumeria]] yang ditemukan di Shuruppak dekat [[Bagdad|Baghdad]] dan berasal dari sekitar tahun 2500 SM menjelaskan algoritma divisi yang paling awal.<ref name="Springer Science & Business Media">{{cite book|last1=Chabert|first1=Jean-Luc|date=2012|title=A History of Algorithms: From the Pebble to the Microchip|publisher=Springer Science & Business Media|isbn=9783642181924|pages=7–8}}</ref> Selama dinasti Hammurabi sekitar 1800-1600 SM, tablet tanah liat Babilonia menjabarkan algoritma untuk rumus-rumus komputasi.<ref>{{cite journal|last1=Knuth|first1=Donald E.|date=1972|title=Ancient Babylonian Algorithms|url=http://steiner.math.nthu.edu.tw/disk5/js/computer/1.pdf|journal=Commun. ACM|volume=15|issue=7|pages=671–677|doi=10.1145/361454.361514|issn=0001-0782|archive-url=https://web.archive.org/web/20121224100137/http://steiner.math.nthu.edu.tw/disk5/js/computer/1.pdf|archive-date=2012-12-24|s2cid=7829945|url-status=dead}}</ref> Algoritma juga digunakan dalam astronomi Babilonia. Tablet tanah liat Babilonia menguraikan dan menggunakan prosedur algoritmik untuk menghitung waktu dan tempat peristiwa astronomi yang signifikan.<ref>{{Citation|last=Aaboe|first=Asger|author-link=Asger Aaboe|date=2001|title=Episodes from the Early History of Astronomy|publisher=Springer|place=New York|pages=40–62|isbn=978-0-387-95136-2}}</ref>
Algoritma untuk aritmatika juga ditemukan dalam matematika Mesir kuno, yang terdapat pada Papirus Matematika Rhind yang berasar dari sekitar tahun 1550 SM.<ref name="Springer Science & Business Media2" /> Algoritma kemudian digunakan dalam matematika [[Periode Helenistik|Helenistik]] kuno. Dua contohnya adalah [[Tapis Eratosthenes]], yang dijelaskan dalam Pengenalan Aritmatika oleh [[Nicomachus]],<ref>{{cite web|last=Ast|first=Courtney|title=Eratosthenes|url=http://www.math.wichita.edu/history/men/eratosthenes.html|publisher=Wichita State University: Department of Mathematics and Statistics|archive-url=https://web.archive.org/web/20150227150653/http://www.math.wichita.edu/history/men/eratosthenes.html|archive-date=February 27, 2015|access-date=February 27, 2015|url-status=live}}</ref><ref name="Cooke20052" />{{rp|Ch 9.2}} dan [[AlgoritmeAlgoritma Euklides|Algoritma Euklides]], yang pertama kali dipaparkan dalam Euclid's Elements (sekitar 300 SM).<ref name="Cooke20052" />{{rp|Ch 9.1}}
=== Simbol diskrit dan yang dapat dibedakan ===
=== Manipulasi simbol sebagai "penampung" bilangan: aljabar ===
Karya dari [[matematika Yunani|Geometer Yunani]] kuno ([[algoritmealgoritma Euklid]]), [[Daftar matematikawan India|matematikawan India]] [[Brahmagupta]], dan [[matematika Islam|matematikawan Persia]] [[Muhammad ibnu Musa al-Khwarizmi|Al-Khwarizmi]] (yang darinya isitlah "[[algorism]]" dan "algoritmealgoritma" diturunkan), dan matematikawan Eropa Barat memuncak dalam notasi [[Gottfried Leibniz|Leibniz]] dari [[rasiosinator kalkulus]] (sekitar 1680-an):
{{quote|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.<ref>Davis 2000:18</ref>}}
mengarah langsung pada "[[teori otomata|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.
<ref>Bolter 1984:33–34, 204–206.</ref>
Lovelace dikreditkan sebagai yang pertama menciptakan algoritmealgoritma 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]].
''[[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 algoritmealgoritma''... Dalam menyiapkan sebuah teori algoritmealgoritma 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 "algoritmealgoritma", 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 algoritmealgoritma]].
== Lihat juga ==
* [[Pemerintahan algoritmik]]
* [[Mesin abstrak]]
* [[Rekayasa algoritmealgoritma]]
* [[Komposisi algoritmik]]
* [[Sintesis algoritmik]]
* [[AlgoritmeAlgoritma trading]]
* [[Sampah masuk, sampah keluar]]
* ''[[Pendahuluan untuk AlgoritmeAlgoritma]]''
* [[Daftar topik algoritmealgoritma umum]]
* [[Daftar publikasi penting dalam ilmu komputer teoretis#AlgoritmeAlgoritma|Daftar publikasi penting dalam ilmu komputer teoretis - AlgoritmeAlgoritma]]
* [[Numerical Mathematics Consortium]]
* [[Teori komputasi]]
{{wiktionary}}
{{wikibooks|Algorithma}}
* {{id}} [http://www.abstrak.web.id/pengertian_algoritmepengertian_algoritma/ Pengertian AlgoritmeAlgoritma]{{Pranala mati|date=Februari 2021 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{en}} {{springer|title=Algorithm|id=p/a011780}}
* {{dmoz|Computers/Algorithms/|Algorithms}}
* {{en}} [http://www.softpanorama.org/Algorithms/index.shtml Algorithms and Data Structures by Dr Nikolai Bezroukov]
[[Kategori:AlgoritmeAlgoritma| ]]
[[Kategori:Logika matematika]]
[[Kategori:Ilmu komputer teoretis]]
|