Apa sebenarnya algoritma itu?

12

Saya tahu bahwa ini mungkin terdengar agak keluar dari kotak, sebenarnya saya dulu selalu berpikir di dalam kotak, tetapi baru-baru ini saya telah berpikir, mungkin karena ilmu komputer memberikan kebebasan tingkat tinggi, tentang cara-cara untuk merancang program selain yang diajarkan di universitas.

Pertimbangkan fungsi faktorial. Biasanya kami mendefinisikan fungsi ini seperti

 int fact(int n) 
 { 
 int r = 1; 
 for(int i=2;i<=n;i++) 
 r = r*i; 
 return r; 
 } 

Saya akan menyebut ini sebuah algoritma dan tidak ragu bahwa ini adalah cara yang tepat untuk melakukannya. Lalu, saya bertanya-tanya "bisakah saya melakukan ini dalam waktu yang konstan?", Yang memungkinkan untuk ide berikut: bagaimana jika saya memiliki array bilangan bulat di mana array [n] menampung faktorial dari n? Setelah array ini diisi, saya cukup mendefinisikan fakta sebagai:

 int fact(int n) 
 { 
 return array[n]; 
 } 

Masih saya tidak bisa menghitung ini suatu algoritma, meskipun ia memberikan hasil yang benar dan beroperasi dalam waktu O konstan (1) Bisakah ini disebut algoritma? Kalau tidak, mengapa tidak? Saya bisa berpendapat bahwa mengisi array akan membutuhkan algoritma untuk beroperasi pada suatu waktu, bahkan jika itu ada di otak kita agar kita dapat mengisi array, tetapi bisakah ini menjadi kriteria? Bagaimana aspek-aspek ini ditangani secara formal?

Perhatikan bahwa konsep ini dapat diperluas ke fungsi apa pun yang beroperasi di atas bilangan bulat secara independen dari jumlah argumennya, saya hanya perlu menggunakan matriks jika fungsi tersebut memiliki 2 argumen, atau 3 jika fungsi tersebut memiliki 3 argumen, dan sebagainya. Juga, bukankah solusi ini digunakan hanya karena konsumsi memori?

Selain itu, tidak semua fungsi dapat mencakup program apa pun dengan keluaran, karena saya dapat menemukan cara untuk mengindeks setiap keluaran yang mungkin disediakan oleh suatu program.

Sebagai contoh lain, pertimbangkan penggunaan umum array: i mengalokasikan array awalnya ukuran N, kemudian saya menambahkan elemen ke array dengan menyimpan nilai pada indeks n dan meningkatkan n oleh satu unit. Kemudian, jika saya ingin mencari elemento, saya tidak bisa melakukan pencarian linear atas array. Jika saya membuat array ukuran, misalnya, Integer.MAXVALUE, untuk menyimpan integer, diinisialisasi dengan nol, saya bisa menyimpan integer dengan menempatkan 1 pada indeksnya. Maka saya bisa mencari keberadaannya di array dalam O (1) waktu. Bagaimana jika saya ingin dapat menempatkan beberapa unit dari nomor yang sama? Tidak masalah, saya hanya akan meningkatkan nilai yang disimpan di indeks integer.

Penyortiran akan sedikit lebih rumit, namun demikian pencarian dan penambahan dapat dilakukan dalam waktu O (1).

Devian Dover
sumber
Fungsi kedua Anda harus memiliki array sebagai parameter. Kalau tidak, Anda tersesat dalam perangkap imperatif keadaan implisit, yang berguna dalam pemrograman tetapi dapat membuat kode Anda sangat sulit untuk dipikirkan.
jmite
Ya, kode kedua Anda dapat disebut algoritma yang inputnya adalah angka n dan array yang memiliki semua faktorial. Dalam kode pertama algoritma hanya memiliki satu input yaitu angka n.
Ankur
Wajib: Saya hari ini tidak akan berusaha lebih jauh untuk mendefinisikan jenis-jenis materi yang saya pahami untuk dianut dalam deskripsi singkat ["algoritma"], dan mungkin saya tidak akan pernah berhasil melakukannya secara cerdas. Tapi saya tahu ketika saya melihatnya, dan hal - hal yang dijelaskan dalam posting di bawah ini bukan itu.
Patrick87
Terkait dengan pertanyaan ini (tetapi tidak langsung menjawabnya), juga menarik untuk membaca "Apa itu algoritma?" oleh Yuri Gurevich, Penelitian Microsoft, Laporan Teknis MSR-TR-2011-116 research.microsoft.com/pubs/155608/209-3.pdf
godfatherofpolka
Anda mengatakan: "... bagaimana jika saya memiliki array bilangan bulat di mana array [n] menampung faktorial dari n? Setelah array ini diisi ....". Bagaimana Anda akan mengisi array dengan faktorial semua bilangan bulat? Array ini akan memiliki ukuran yang tak terbatas dan akan membutuhkan waktu tak terbatas untuk diisi. Karena itu pertanyaan Anda tidak benar.
AP

Jawaban:

9

Definisi informal dari suatu algoritma dalam buku teks populer berbunyi seperti:

Algoritma adalah (1) prosedur komputasi yang terdefinisi dengan baik (2) yang mengambil beberapa input dan (3) menghasilkan beberapa output (4) untuk masalah komputasi yang terdefinisi dengan baik.

Dalam kasus pertama Anda, Anda memiliki kode algoritma di mana: Masalahnya adalah untuk menemukan faktorial (bagian 4 dari definisi), diberikan int n sebagai input (bagian 2 dari definisi), kode menjelaskan perhitungan yang akan dilakukan (bagian 1 dari definisi ), outputnya adalah faktorial (bagian 3 dari definisi).

Dalam kasus kedua Anda: Masalahnya adalah untuk menemukan elemen array di posisi n (bagian 4 dari definisi), diberikan n sebagai input (bagian 3 dari definisi), kode menjelaskan perhitungan yang akan dilakukan (bagian 2 dari definisi), output adalah elemen pada posisi n (bagian 1 dari definisi).

Anda telah menyimpan faktorial di sana sehingga memberi Anda faktorial. Jika Anda menyimpan kuadrat atau kubus di sana Anda akan mendapatkan kuadrat atau kubus, sehingga tidak dapat dikatakan bahwa potongan kedua dengan sendirinya adalah algoritma untuk menghitung faktorial.

Dan jika Anda mengatakan bahwa array melihat ke atas bersama dengan array yang memiliki f (n) di posisi n adalah algoritma untuk menghitung f (n) maka Anda telah pergi begitu dalam sehingga tidak ada lagi perhitungan di bawah ini. Prosedur komputasi yang terdefinisi dengan baik harus menjadi informasi yang terbatas. Jika array faktorial yang tak terbatas adalah bagian dari prosedur komputasi, ini tidak berlaku. Sehingga tidak akan menjadi algoritma untuk menghitung faktorial.

Ranbir
sumber
Masalah sebenarnya dengan saran OP adalah bahwa deskripsi "prosedur komputasi yang terdefinisi dengan baik" tidak terbatas. Tentu saja, kecuali kita menjelaskan apa yang kita maksud dengan "prosedur komputasi yang terdefinisi dengan baik", kita tidak dapat mengatakan sebelumnya apakah algoritma OP itu sah atau tidak. Ini sebenarnya adalah "prosedur komputasi yang terdefinisi dengan baik" mengingat array yang tak terbatas, jadi mengapa ini ilegal? OP bahkan dapat menjelaskan dalam istilah terbatas bagaimana mengisi array. Lalu apa yang salah? Definisi informal Anda tidak dapat membedakan antara komputasi hyper dan komputasi (Turing).
Yuval Filmus
Prosedur komputasi yang terdefinisi dengan baik harus dapat dinyatakan sebagai informasi yang terbatas. Jika sebuah array faktorial yang tak terbatas adalah bagian darinya, ini tidak berlaku.
Ranbir
2
{(n,n!):nN}
Deskripsi array dapat diekspresikan sebagai informasi yang terbatas tetapi array itu sendiri tidak.
Ranbir
Saya berpendapat bahwa kedua contoh OP adalah algoritma , dan tidak ada yang menghitung faktorial untuk semua bilangan bulat. Tapi itu hanya pilih-pilih, kurasa.
Patrick87
5

Paling umum, suatu algoritma adalah serangkaian langkah untuk menyelesaikan suatu masalah .

Dalam CS, berikut ini biasanya dipahami / diasumsikan ketika menggunakan algoritma istilah:

  • Algoritma ini memiliki deskripsi yang terbatas dan prosedur yang terdefinisi dengan baik untuk melakukan langkah-langkahnya dengan memberikan contoh masalah. (Lebih lanjut di bawah.)
  • Contoh masalah diberikan sebagai string hingga (urutan simbol input), dan output dari algoritma dapat dikodekan sebagai string terbatas.
  • Masalah adalah kumpulan instance masalah bersama dengan kemungkinan output "benar" untuk setiap instance. "Memecahkan" berarti menghasilkan output yang benar.
  • (Biasanya) instans masalah bisa besar secara arbitrer (ada jumlah tak terhingga dari kemungkinan instans yang harus dipecahkan oleh algoritma terbatas Anda).

Sebelum CS didirikan, matematikawan memiliki jenis kekhawatiran yang sama dengan yang Anda ajukan, dan memperkenalkan definisi formal perhitungan untuk mengatasi masalah ini. Dengan demikian, saat ini, kita dapat memformalkan semua asumsi di atas dengan hanya mengatakan "algoritma adalah prosedur yang dapat diimplementasikan pada mesin Turing" . Ini mungkin jawaban formal terbaik untuk pertanyaan Anda.

Perhatikan bahwa tesis Church-Turing mengatakan bahwa kami pikir tidak ada formalisasi algoritma yang "lebih kuat" daripada Mesin Turing.

Contoh faktorial masuk ke model perhitungan yang berbeda, yang disebut perhitungan tidak seragam. Mesin Turing adalah contoh model komputasi yang seragam : Ini memiliki deskripsi tunggal, terbatas, dan berfungsi untuk input ukuran besar yang sewenang-wenang. Dengan kata lain, ada TM yang memecahkan masalah untuk semua ukuran input.

Sekarang, kita dapat mempertimbangkan perhitungan sebagai berikut: Untuk setiap ukuran input, terdapat TM (atau perangkat komputasi lain) yang memecahkan masalah. Ini pertanyaan yang sangat berbeda. Perhatikan bahwa satu TM tidak dapat menyimpan faktorial dari setiap integer tunggal, karena TM memiliki deskripsi yang terbatas. Namun, kita dapat membuat TM (atau program dalam C) yang menyimpan faktorial semua angka di bawah 1000. Kemudian, kita bisa membuat program yang menyimpan faktorial semua angka antara 1000 dan 10.000. Dan seterusnya.

Jenis-jenis perhitungan yang tidak seragam biasanya dimodelkan dalam CS teoritis oleh sirkuit. Anda mempertimbangkan konstruksi sirkuit yang berbeda untuk setiap ukuran input yang memungkinkan.

Model perhitungan yang tidak seragam umumnya tidak dianggap sebagai algoritma , meskipun mungkin cocok dengan kalimat pertama saya. Alasannya adalah bahwa mereka tidak sesuai dengan asumsi utama kami: mereka tidak memiliki deskripsi yang terbatas yang dapat diimplementasikan untuk memecahkan masalah "keseluruhan" untuk ukuran input apa pun. Sebaliknya, mereka membutuhkan deskripsi yang lebih besar dan lebih besar karena masalahnya semakin besar (seperti membutuhkan tabel pencarian yang lebih besar). Namun, mereka masih merupakan model komputasi yang menarik.

usul
sumber
Saya pikir model komputasi berbasis sirkuit Anda tidak pantas. Seperti yang Anda katakan, TM memiliki deskripsi yang terbatas. Tapi itu tidak menghalangi memiliki kaset tambahan yang diisi dengan versi faktorial tabulasi. Seseorang bahkan dapat melakukan "lebih buruk" dan masih memiliki deskripsi yang terbatas. Tetapi sebenarnya yang Anda butuhkan adalah deskripsi yang dapat dihitung, yang pada akhirnya pasti terbatas. Ada banyak cara komputasi yang seragam untuk mendefinisikan mesin Turing dengan faktorial yang ditabulasi, tidak ada yang dapat benar-benar meningkatkan kekuatan komputasi TM. Oleh karena itu kesimpulan Anda tidak berlaku.
babou
@ Babou, saya tidak mengerti apa yang Anda maksud. Apa yang Anda maksud dengan "tidak pantas" dan kesimpulan mana yang saya buat itu salah? Catatan: Saya tidak menemukan model rangkaian. Mungkin saya tidak melakukan pekerjaan dengan baik untuk menggambarkannya. Poin kuncinya adalah bahwa, untuk setiap input, kami mengizinkan perangkat komputasi yang berbeda (TM atau sirkuit), yang berarti bahwa mungkin tidak ada algoritma seragam yang menghasilkan semua perangkat ini (untuk semua ukuran input), atau dengan kata lain, mungkin ada tidak ada deskripsi terbatas yang menggambarkan semuanya.
usul
Melihat tabulasi fungsi faktorial sebagai perhitungan yang tidak seragam tampaknya bagi saya bukanlah cara yang tepat untuk melakukannya. Ini sebenarnya sangat seragam, sedemikian rupa sehingga segmen yang terbatas dapat dilihat sebagai kontinu dengan batas tak terhingga yang merupakan seluruh tabel. Itulah yang dilakukan dengan semantik Scott. Selanjutnya seluruh tabel sebenarnya dapat dijelaskan secara halus dengan cara yang dapat dihitung, sehingga akan masuk akal secara komputasi untuk mempertimbangkan TM dengan pita tambahan yang berisi tabel yang dikomputasi. Jawaban Anda tampaknya menyimpulkan bahwa tabel yang dihitung sebelumnya tidak dapat dianggap sebagai algoritma.
babou
Setiap tabel prekomputasi tertentu mungkin menjadi bagian dari suatu algoritma, dan untuk urutan tak terbatas dari tabel prakomputasi yang semakin berukuran, Anda dapat menghasilkan ini salah satu dari hal-hal ini menggunakan algoritma. Tapi saya tidak akan mempertimbangkan satu set tak terbatas dari tabel pencarian yang semakin berukuran, dengan sendirinya, sebuah algoritma atau perhitungan yang seragam karena itu tak terbatas dalam ukuran.
usul
Anda tidak akan menganggapnya sebagai algoritma. Ini subjektif. Yang penting adalah mengetahui mengapa Anda tidak harus. Dan tidak ada alasan yang bisa saya lihat. Konsep apa pun yang masuk akal untuk algoritme terus masuk akal dalam kasus itu. Yang dilakukannya hanyalah mengabstraksi pembuatan tabel, meskipun itu bisa dipertanggungjawabkan secara terpisah. Sebenarnya ini adalah masalah semantik murni, karena mempertimbangkan urutan yang meningkat seperti itu, atau menggantinya dengan batas tak terbatas, secara matematis sama. Dan teori komputasi semantik mempertimbangkan batas tak terbatas seperti itu, bagaimanapun diproduksi atau diwakili.
babou
4

Algoritma adalah program yang ditulis dalam C yang harus bekerja untuk semua input (dengan asumsi memori tak terbatas dan bilangan bulat tak terbatas). Dalam contoh Anda, jika kami ingin program bekerja untuk semua panjang input, maka tabel di mana hasil disimpan akan sangat besar; program dalam C selalu terbatas, sehingga pendekatan ini tidak dapat digunakan.

n!n!) dapat dihitung di dalamnya jauh lebih efisien, dibandingkan dengan C.

Ketika khawatir tentang waktu menjalankan aktual pada komputer yang sebenarnya kita harus lebih berhati-hati, tetapi ini biasanya di luar batas ilmu komputer teoritis, sayangnya.


nn!

Gagasan algoritma apa yang harus kita gunakan? Satu saran, diuraikan di atas, adalah menggunakan program C. Kita dapat menyebut gagasan ini perhitungan-C. Turing-komputasi adalah apa yang Anda dapatkan ketika Anda menggunakan mesin Turing. Ternyata suatu fungsi adalah C-computable jika dan hanya jika itu Turing-computable. Dalam pengertian inilah kedua model komputasi ini setara. Memang, banyak model lain yang setara, misalnya semua bahasa pemrograman yang umum digunakan (dengan asumsi memori tak terbatas dan variabel tidak terikat).

Kami mengatakan bahwa bahasa pemrograman P adalah Turing-complete adalah fungsi adalah P-computable jika dan hanya jika Turing-computable. Hipotesa Church-Turing adalah pernyataan informal yang menyatakan bahwa semua model perhitungan yang masuk akal memiliki deskripsi hingga dan mengambil waktu yang terbatas adalah Turing-complete. Model Anda memiliki deskripsi hingga tetapi tidak membutuhkan waktu hingga.

Yuval Filmus
sumber
3
lol "Suatu algoritma adalah program yang ditulis dalam bahasa C ..."?!?
vzn
2
"Algoritme adalah program yang ditulis dalam C" ... Mengapa Anda menentukan bahasa? Itu tidak masuk akal.
nouney
1
@nouney, saya hanya mencoba untuk menjadi konkret. Bahasa pemrograman favorit Anda juga Turing-complete.
Yuval Filmus
@YuvalFilmus Ya Anda tidak konkret, Anda membingungkan.
nouney
@nouney Anda dapat menambahkan jawaban Anda sendiri.
Yuval Filmus
4

Bagian penting dari definisi umum dari algoritma yang Anda lewatkan adalah bahwa spesifikasinya harus terbatas , dan ukuran spesifikasinya tidak boleh berbeda dengan ukuran input.

Memori bisa besar secara sewenang-wenang, dan begitu juga input, tetapi untuk menjadi definisi yang berguna dari suatu algoritma, ruang kode harus terbatas. Kalau tidak, Anda mendapatkan masalah yang baru saja Anda identifikasi.

O(logA)AO(logn)O(logn!)O(n(logn)2)sn=O(2s)O(2s s2)O(1)

DanielV
sumber
" codespace harus terbatas ": Apakah Anda bermaksud mengatakan bahwa program Lisp yang memanggil evalfungsi pada beberapa struktur data besar yang baru saja dibuat, dan yang mewakili ekspresi lLisp, tidak dapat dianggap sebagai algoritma. Saya menduga bahwa banyak kode yang diproduksi di MIT pada abad ke-20 tidak memenuhi syarat sebagai algoritma. Ini hanya argumen informal, tetapi masalah formal terletak pada pandangan tentang apa spesifikasi yang terbatas, yang Anda baca dengan cara yang terlalu membatasi.
babou
Jika ekspresi itu dihasilkan maka itu terbatas. Tidak peduli seberapa besar. Namun, menghilangkan batasan pada finiteness dari codespace dapat bermanfaat, ini dapat digunakan untuk membuktikan batas yang lebih rendah pada saat runtime (seperti membuktikan batasan yang rendah pada runtime dari penyortiran daftar). Tetapi hampir semua hasil yang menarik pada algoritma itu sendiri akan membutuhkan ruang kode yang terbatas. Ini mirip dengan bagaimana polinomial harus memiliki jumlah koefisien yang terbatas, tetapi rangkaian daya juga berguna.
DanielV
Saya bukan ahli tentang bagaimana menghitung kompleksitas (bukan bidang saya), tetapi fakta bahwa Anda memiliki atau tidak memiliki matematika untuk melakukannya seharusnya tidak berdampak apa itu algoritma. Intinya adalah bahwa program Lisp dapat terus meningkatkan ukuran kodenya tanpa terikat. Maka mungkin lebih masuk akal untuk menganalisis ini sebagai potongan kode tanpa batas dengan sifat komputasi tertentu. Kasus fungsi yang ditabulasi dapat dilihat dalam cahaya itu. Saya terkejut bahwa jawaban memiliki pandangan yang terbatas (saya hampir mengatakan parokial ) tentang apa itu algoritma.
babou
3

Beberapa pengamatan yang mungkin bermanfaat:

Masalahnya adalah pernyataan tentang input yang diizinkan dan output yang sesuai. Itulah yang ingin kita pecahkan. Algoritma adalah prosedur komputasi. Kita dapat mengatakan bahwa suatu algoritma adalah benar sehubungan dengan suatu masalah jika ia menerima input yang diizinkan sehubungan dengan masalah dan menghasilkan keluaran sesuai dengan deskripsi masalah.

Kedua contoh Anda adalah algoritme, karena keduanya merupakan prosedur komputasi yang jelas. Apakah algoritma itu benar atau tidak, tergantung pada bagaimana Anda mendefinisikan masalah dan bagaimana Anda menginterpretasikan representasi dari algoritma. Beberapa pernyataan masalah:

  1. nn!
  2. n>0n!< INT_MAXn!

Beberapa interpretasi dari cuplikan kode pertama Anda:

  1. Ini adalah pseudocode yang menyerupai C / C ++ kecuali dalam rinciannya. intbenar-benar berarti "bilangan bulat apa saja", misalnya.
  2. Ini harus ditafsirkan seolah-olah itu adalah program C / C ++ nyata.

Interpretasi 1 benar untuk pernyataan masalah 1, selama faktorial mengasumsikan nilai 1 untuk angka negatif (jika tidak, kita bisa memodifikasi pernyataan masalah untuk membatasi domain, atau algoritma untuk memperhitungkan perilaku yang diinginkan). Interpretasi 2 benar untuk pernyataan masalah 2, dengan peringatan yang sama.

arrayarraynn>0n!< INT_MAXn!n<0

nn!232n!264

kknknk+n

Patrick87
sumber
Saya akan berpikir bahwa konsep suatu algoritma sedikit melampaui batasan ukuran kata dari sebuah komputer. Saya merasa bahwa Anda hanya menghindari masalah.
babou
1

Sebuah algoritma adalah program yang ditulis dalam bahasa Turing-lengkap yang perhentian provably pada semua input yang valid. Semua bahasa pemrograman standar adalah Turing-complete. Kata ini berasal dari terjemahan Eropa atas nama al-Khwārizmī, ahli matematika, astronom, dan geografi Persia, yang karyanya dibangun di atas nama ahli matematika India abad ke-7, Brahmagupta, yang memperkenalkan sistem angka India ke dunia barat.

Pertanyaannya tampaknya pada dasarnya tentang apakah tabel pencarian adalah bagian dari algoritma. Benar! Dalam mesin Turing (TM) tabel dapat dikodekan dalam tabel status TM. TM dapat menginisialisasi rekaman berdasarkan jumlah data terbatas yang disimpan dalam tabel transisi. Namun, "algoritma" yang tidak berjalan pada input yang tak terbatas, hanya input yang terbatas, yang "sepele" mesin negara-terbatas (FSM) .

vzn
sumber
3
Mengapa harus dalam bahasa lengkap TUring?
babou
1

Singkatnya : Algoritma adalah bagian konstruktif dari bukti konstruktif bahwa masalah yang diberikan memiliki solusi. Motivasi untuk definisi ini adalah isomorfisma Curry-Howard antara program dan bukti, mengingat bahwa suatu program hanya memiliki minat jika menyelesaikan masalah, tetapi terbukti demikian. Definisi ini memungkinkan untuk lebih banyak abstraksi, dan membiarkan beberapa pintu terbuka mengenai jenis domain yang mungkin diperhatikan, misalnya mengenai sifat-sifat keterbatasan.

Peringatan . Saya mencoba menemukan pendekatan formal yang tepat untuk menjawab pertanyaan. Saya pikir itu diperlukan, tetapi tampaknya tidak ada pengguna yang menjawab sejauh ini (termasuk saya, dan beberapa lebih atau kurang eksplisit tentang hal itu di pos lain) memiliki latar belakang yang tepat untuk mengembangkan masalah dengan benar, yang terkait dengan matematika konstruktif, teori bukti, teori jenis dan hasil seperti isomorfisma Curry-Howard antara bukti dan program. Saya melakukan yang terbaik di sini, dengan potongan pengetahuan apa pun yang saya miliki (yakini) miliki, dan saya terlalu menyadari keterbatasan jawaban ini. Saya hanya berharap memberikan beberapa petunjuk tentang bagaimana jawaban saya seharusnya. Jika Anda melihat suatu hal yang jelas salah secara formal (terbukti), izinkan saya sekarang dalam komentar - atau melalui email.

Mengidentifikasi beberapa masalah

Cara standar untuk mempertimbangkan suatu algoritma adalah dengan menyatakan bahwa suatu algoritma adalah program yang ditentukan secara sewenang-wenang untuk beberapa perangkat komputasi , termasuk yang tidak memiliki batasan dalam memori. Bahasa ini mungkin juga merupakan bahasa mesin komputer. Sebenarnya itu sudah cukup untuk mempertimbangkan semua program untuk perangkat komputasi lengkap Turing (yang menyiratkan tidak memiliki keterbatasan memori). Ini mungkin tidak memberi Anda semua presentasi algoritma, dalam arti bahwa algoritma harus diekspresikan dalam bentuk yang tergantung pada detailnya pada konteks interpretasi, bahkan teoretis, karena semuanya didefinisikan hingga beberapa pengkodean. Tetapi, karena ia akan menghitung semua yang harus dikomputasi, ia akan mencakup semua algoritma, hingga penyandian.

π

π, mungkin dalam arti matematika hampir semua. Tetapi itu membutuhkan ketelitian dalam definisi.

Jadi pertanyaan sebenarnya adalah mengetahui apa saja algoritma yang bermakna. Jawabannya adalah bahwa algoritma yang bermakna adalah yang memecahkan masalah, menghitung langkah demi langkah "solusi", "jawaban", untuk masalah itu. Algoritma menarik jika dikaitkan dengan masalah yang dipecahkannya.

Jadi diberi masalah formal bagaimana kita mendapatkan algoritma yang memecahkan masalah. Apakah secara eksplisit atau implisit, algoritma dikaitkan dengan gagasan bahwa ada solusi untuk masalah tersebut, yang dapat dibuktikan benar. Apakah teknik pembuktian kami akurat atau tidak, adalah masalah lain, tetapi kami setidaknya mencoba meyakinkan diri sendiri. Jika Anda membatasi diri pada matematika konstruktif, yang sebenarnya harus kita lakukan (dan merupakan kendala aksiomatik yang dapat diterima untuk sebagian besar matematika), cara untuk membuktikan keberadaan solusi adalah melalui langkah-langkah bukti yang benar-benar memperlihatkan konstruk yang mewakili solusi, termasuk kemungkinan langkah-langkah lain yang membuktikan kebenarannya.

Semua programmer berpikir sesuatu seperti: jika saya mengutak-atik data dengan cara ini dan itu, maka saya mendapatkan widget ini yang hanya memiliki sifat yang tepat karena teorema Sesame, dan menjalankan transformasi foo-preserving ini saya mendapatkan jawaban yang diinginkan . Tetapi buktinya biasanya informal, dan kami tidak mengerjakan semua detail, yang menjelaskan mengapa satelit mencoba mengorbit Mars di bawah tanah (di antara hal-hal lain). Kami melakukan banyak alasan, tetapi kami hanya menyimpan bagian konstruktif yang membangun solusi, dan kami menggambarkannya dalam bahasa komputer sebagai algoritme yang memecahkan masalah.

Algoritma (atau program) yang menarik

Semua ini untuk memperkenalkan ide-ide berikut, yang merupakan objek dari banyak penelitian saat ini (yang saya bukan spesialis). Gagasan " algoritma menarik " yang digunakan di sini adalah milik saya, diperkenalkan sebagai tempat penampung informal untuk definisi yang lebih akurat.

Algoritma yang menarik adalah bagian konstruktif dari bukti konstruktif bahwa masalah yang diberikan memiliki solusi . Itu berarti bahwa buktinya harus benar-benar menunjukkan solusi daripada sekadar membuktikan keberadaannya, misalnya dengan kontradisi. Untuk lebih jelasnya lihat Intuitionistic Logic dan Constructivism in Mathematics.

Ini tentu saja definisi yang sangat terbatas, yang hanya mempertimbangkan apa yang saya sebut algoritma yang menarik. Jadi itu mengabaikan hampir semua dari mereka. Tapi begitu juga semua buku teks kami tentang algoritma. Mereka mencoba mengajar hanya beberapa yang menarik.

Mengingat semua parameter masalah (input data), ini memberi tahu Anda cara mendapatkan hasil yang ditentukan langkah demi langkah. Contoh tipikal adalah resolusi persamaan ( algoritma nama sebenarnya berasal dari nama ahli matematika Persia, Muḥammad ibn Mūsā al-Khwārizmī , yang mempelajari resolusi beberapa persamaan). Bagian dari bukti digunakan untuk menetapkan bahwa beberapa nilai yang dihitung dalam algoritma memang memiliki beberapa properti, tetapi bagian ini tidak perlu disimpan dalam algoritma itu sendiri.

Tentu saja, ini harus terjadi dalam kerangka kerja logis formal yang menetapkan apa yang dihitung dengan data, apa langkah-langkah komputasi dasar yang diizinkan, dan apa aksioma yang digunakan.

Kembali ke contoh faktorial Anda, mungkin ditafsirkan sebagai suatu algoritma, meskipun yang sepele. Fungsi faktorial normal sesuai dengan bukti bahwa, diberikan beberapa kerangka aritmatika, dan diberi bilangan bulat, ada angka yang merupakan produk dari bilangan bulat n pertama. Ini cukup mudah, seperti perhitungan faktorial. Bisa jadi lebih kompleks untuk fungsi lain.

Sekarang, jika Anda memutuskan untuk mentabulasi faktorial, dengan asumsi Anda bisa, yang tidak berlaku untuk semua bilangan bulat (tetapi bisa benar untuk beberapa domain nilai terbatas), semua yang Anda lakukan adalah termasuk dalam aksioma Anda keberadaan faktorial dengan mendefinisikan dengan aksioma baru nilainya untuk setiap integer, sehingga Anda tidak perlu lagi membuktikan (karenanya menghitung) apa pun.

Tetapi sistem aksioma seharusnya terbatas (atau setidaknya didefinisikan secara terbatas). Dan ada tak terhingga nilai untuk faktorial, satu per bilangan bulat. Jadi Anda berada dalam kesulitan untuk sistem aksioma berhingga Anda jika Anda aksioma fungsi tak terbatas, yaitu didefinisikan pada domain tak terbatas. Itu menerjemahkan secara komputasional dalam kenyataan bahwa calon tabel pencarian Anda tidak dapat diimplementasikan untuk semua bilangan bulat. Itu akan membunuh persyaratan keterbatasan biasa untuk algoritma (tetapi apakah harus seketat yang sering disajikan?).

Anda dapat memutuskan untuk memiliki generator aksioma yang didefinisikan secara halus untuk menangani semua kasus. Ini akan berjumlah, lebih atau kurang, untuk memasukkan program faktorial standar dalam algoritma Anda untuk menginisialisasi array yang diperlukan. Itu disebut memoisasi oleh programmer. Ini sebenarnya yang paling dekat dengan tabel setara yang Anda peroleh. Dapat dipahami bahwa memiliki tabel yang sudah dikomputasi, kecuali fakta bahwa tabel tersebut sebenarnya dibuat dalam mode evaluasi malas , kapan pun diperlukan. Diskusi ini mungkin perlu sedikit lebih banyak perawatan formal.

Anda dapat mendefinisikan operasi primitif sesuai keinginan (sesuai dengan sistem formal) dan menetapkan biaya apa pun yang Anda pilih saat digunakan dalam algoritme, sehingga dapat melakukan kompleksitas atau analisis kinerja. Tetapi, jika sistem konkret yang benar-benar menerapkan algoritma Anda (komputer, atau otak misalnya) tidak dapat menghormati spesifikasi biaya ini, analisis Anda mungkin secara intelektual menarik, tetapi tidak berharga untuk penggunaan aktual di dunia nyata.

21000

Program apa yang menarik

Diskusi ini harus lebih terkait dengan hasil seperti isomorfisme Curry-Howard antara program dan bukti. Jika ada program yang sebenarnya merupakan bukti dari sesuatu, program apa pun dapat ditafsirkan sebagai program yang menarik dalam arti definisi di atas.

Namun, untuk pemahaman saya (terbatas), isomorfisma ini terbatas pada program yang dapat diketik dengan baik dalam beberapa sistem pengetikan yang tepat, di mana jenis-jenisnya sesuai dengan proposisi teori aksiomatik. Karenanya tidak semua program dapat dikualifikasikan sebagai program yang menarik. Dugaan saya adalah bahwa dalam hal itulah suatu algoritma seharusnya menyelesaikan suatu masalah.

Ini mungkin mengecualikan sebagian besar program "yang dibuat secara acak".

Ini juga merupakan definisi yang agak terbuka tentang apa yang merupakan "algoritma yang menarik". Program apa pun yang dapat dilihat menarik tentu saja demikian, karena ada sistem tipe yang diidentifikasi yang membuatnya menarik. Tetapi program yang tidak bisa diketik sejauh ini, bisa menjadi tipe dengan sistem tipe yang lebih maju, dan dengan demikian menjadi menarik. Lebih tepatnya, itu selalu menarik, tetapi karena kurangnya pengetahuan tentang sistem tipe yang tepat, kita tidak bisa mengetahuinya.

Namun, diketahui bahwa tidak semua program dapat diketik, karena diketahui bahwa beberapa ekspresi lambda, seperti menerapkan kombinator Y , tidak dapat diketik dalam sistem jenis suara .

Pandangan ini hanya berlaku untuk pemrograman formalisme yang dapat langsung dikaitkan dengan beberapa sistem bukti aksiomatik. Saya tidak tahu bagaimana itu dapat diperluas ke formalisme komputasi tingkat rendah seperti Mesin Turing. Namun, karena algoritmik dan komputabilitas sering kali merupakan permainan penyandian masalah dan solusi (pikirkan aritmatika yang dikodekan dalam kalkulus lambda ), orang dapat mempertimbangkan bahwa setiap perhitungan yang ditetapkan secara formal yang dapat ditampilkan sebagai penyandian algoritma juga merupakan algoritma. Pengkodean seperti itu mungkin hanya menggunakan sebagian kecil dari apa yang dapat diekspresikan dalam formalisme tingkat rendah, seperti Mesin Turing.

Salah satu minat dari pendekatan ini adalah bahwa ia memberikan gagasan tentang algoritma yang lebih abstrak dan independen dari masalah pengkodean aktual, "keterwakilan fisik" dari domain komputasi. Jadi, seseorang dapat, misalnya, mempertimbangkan domain dengan objek tak terbatas selama ada cara yang baik secara komputasional untuk menggunakannya.

babou
sumber
2
Ini bukan pandangan yang mudah tentang masalah ini, meskipun ini merupakan hal yang mendasar. Saya harus menyederhanakan keterlaluan dan saya mungkin telah melakukan kesalahan. Tapi, jika Anda ingin downvote, tolong beri tahu saya alasannya.
babou
Ya, saya tidak yakin ada apa dengan downvotes.
Nama samaran
@ Nama samaran Dalam kasus saya. Saya rasa saya tahu. Ini menduga itu adalah pertempuran lama antara semantikis dan ahli algoritma, terutama yang bekerja pada kemampuan komputasi. Itulah pertempuran antara filosofi dan bisnis, apa itu dan berapa biayanya. Saya tertarik pada algoritma yang "bermakna". Saya memodifikasi sesuai (tapi saya berada di ujung pengetahuan saya yang tampaknya masih lebih baik daripada kebanyakan). Anda mungkin menderita ghettoisasi yang sama. - - - Namun. cukup jelas bahwa pada topik halus ini, siapa pun yang pendapatnya bernilai setengah sen tidak akan bermimpi untuk kalah tanpa penjelasan yang tepat.
babou
Setelah membaca baik pertanyaan dan jawaban Anda, saya tergoda untuk menurunkannya, karena tidak cukup fokus pada pertanyaan yang sebenarnya, dan mengandung terlalu banyak pikiran yang belum selesai. Selain itu, saya tidak berpikir bahwa "menyelesaikan masalah" adalah bagian yang hilang dalam definisi suatu algoritma. Tapi saya setuju bahwa "semantik" tidak boleh diabaikan dalam definisi apa yang merupakan algoritma.
Thomas Klimpel
@ThomasKlimpel Seperti yang saya katakan, saya tidak cukup ahli dalam masalah yang sebenarnya. Dan saya menambahkan bahwa tidak ada jawaban lain. Membuat algoritma tidak sama dengan memahami apa itu. Kesadaran saya akan pengetahuan saya yang terbatas, yang tidak akan disembunyikan secara ilmiah adalah sumber dari perasaan yang belum selesai ini. Tampaknya lebih baik untuk menggarisbawahi adanya masalah, daripada mengabaikannya. Saya memang membahas setiap contoh, lebih dari semantik pov daripada dari yang algoritmik, karena pertanyaannya adalah pertanyaan semantik ("Apa itu ...?"). Apakah menurut Anda jawaban lain membawa pemahaman formal? Cf komentar saya
babou
0

Tidak ada definisi formal yang baik tentang "algoritma" pada saat penulisan. Namun, ada orang pintar yang mengerjakannya.

Apa yang kita ketahui adalah bahwa apa pun "algoritma" itu, ia berada di suatu tempat antara "fungsi matematika" dan "program komputer".

Fungsi matematika adalah gagasan formal tentang pemetaan dari input ke output. Jadi, misalnya, "sort" adalah pemetaan antara urutan item yang dapat dipesan dan urutan item yang dapat dipesan dari jenis yang sama, yang memetakan setiap urutan ke urutan yang dipesan. Fungsi ini dapat diimplementasikan menggunakan algoritme yang berbeda (misalnya, semacam gabungan, jenis tumpukan). Setiap algoritma, pada gilirannya, dapat diimplementasikan menggunakan program yang berbeda (bahkan diberi bahasa pemrograman yang sama).

Jadi pegangan terbaik yang kita miliki tentang apa itu "algoritma" adalah, itu adalah semacam kelas kesetaraan pada program, di mana dua program setara jika mereka melakukan "pada dasarnya hal yang sama". Dua program yang menerapkan algoritma yang sama harus menghitung fungsi yang sama, tetapi kebalikannya tidak benar.

Demikian pula, ada kelas ekivalensi antara algoritma, di mana dua algoritma setara jika mereka menghitung fungsi matematika yang sama.

Bagian tersulit dari semua ini adalah mencoba menangkap apa yang kita maksud dengan "pada dasarnya hal yang sama".

Ada beberapa hal jelas yang harus kita sertakan. Sebagai contoh, dua program pada dasarnya sama jika mereka berbeda hanya dengan penggantian variabel. Sebagian besar model bahasa pemrograman memiliki gagasan asli tentang "kesetaraan" (mis. Pengurangan beta dan konversi eta dalam kalkulus lambda), jadi kita juga harus memasukkannya.

Apapun hubungan kesetaraan yang kita pilih, ini memberi kita beberapa struktur. Algoritma membentuk kategori berdasarkan fakta bahwa mereka adalah kategori hasil bagi program. Beberapa hubungan setara yang menarik diketahui menimbulkan struktur kategorikal yang menarik; misalnya, kategori algoritma rekursif primitif adalah objek universal dalam kategori kategori. Setiap kali Anda melihat struktur yang menarik seperti itu, Anda tahu bahwa jalur penyelidikan ini mungkin akan bermanfaat.

Nama samaran
sumber
1
Saya tidak berpikir adil untuk mengatakan tidak ada definisi formal yang baik dari suatu algoritma. Ini adalah kasus kira-kira 100 tahun yang lalu.
Juho
1
@ Juho Mungkin saja nama samaran membuatnya terdengar terlalu kuat, meskipun ia memang mencoba memitigasi pernyataan tersebut, menambahkan secara khusus bahwa situasinya sedang mengalami kemajuan. Namun, saya pikir dia agak benar dalam penilaiannya. Saya bereaksi terlambat, karena saya menghabiskan banyak waktu untuk hal ini, dan merasa hampir sama. Orang-orang telah meningkatkan pemahaman mereka, tetapi seluruh diskusi menunjukkan bahwa tidak ada konsensus nyata ... dan saya menemukan sebagian besar kontribusi sangat tidak matang, mengingat tingkat orang yang terlibat. Jika dia tidak adil, menurut Anda siapa yang memberikan definisi formal yang baik?
babou
Anda 100% benar. Dan saya pikir jika Turing masih hidup, atau ahli teori lain dalam teori kompleksitas, dia akan 100% setuju dengan Anda. Para akademisi perlu melepaskan troglodyticism mereka. Ini sebenarnya menghambat lapangan. Ini pada akhirnya akan terjadi dengan cara apa pun, begitu mereka mati. Syukurlah untuk itu.
Selamat menikmati
-4

Pertanyaan dan deskripsi Anda tidak terlalu berhubungan. Algoritma bersifat teoretis dan tidak berhubungan dengan bahasa pemrograman apa pun. Algoritma adalah seperangkat aturan atau langkah (prosedur) untuk menyelesaikan suatu masalah. Masalah Anda dapat diselesaikan dengan banyak cara atau banyak algoritma.

Solusi kedua Anda berarti menghitung dulu sejumlah besar faktorial yang awalnya akan memakan banyak waktu kemudian menyimpannya. Ini akan mengkonsumsi lebih banyak penyimpanan tetapi pada akhirnya akan lebih cepat sementara yang pertama tidak mengkonsumsi penyimpanan tetapi mengkonsumsi daya komputasi sehingga Anda harus memilih tergantung pada lingkungan Anda.

Elgert
sumber
Ya, sama sekali tidak ada hubungan. Hal inovatif.
Selamat menikmati