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).
sumber
Jawaban:
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.
sumber
Paling umum, suatu algoritma adalah serangkaian langkah untuk menyelesaikan suatu masalah .
Dalam CS, berikut ini biasanya dipahami / diasumsikan ketika menggunakan algoritma istilah:
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.
sumber
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.
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.
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.
sumber
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.
sumber
eval
fungsi 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.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:
INT_MAX
Beberapa interpretasi dari cuplikan kode pertama Anda:
int
benar-benar berarti "bilangan bulat apa saja", misalnya.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.
array
array
INT_MAX
sumber
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) .
sumber
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.
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.
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.
sumber
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.
sumber
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.
sumber