Saya mendapat kesan bahwa konsep kompleksitas waktu dan memori adalah suatu keharusan bagi lulusan kursus compsci, tetapi setelah mempelajari teknik, saya tidak memiliki pengetahuan jika itu masalahnya. Saya baru-baru ini terkejut mewawancarai beberapa lulusan dari perguruan tinggi lokal yang bahkan tidak tahu konsepnya. Saya kira pertanyaan saya adalah:
Apakah konsep kompleksitas komputasi penting untuk pengembang perangkat lunak? Dan haruskah itu diajarkan dalam program sarjana?
education
complexity
Muhammad Alkarouri
sumber
sumber
O(n^2)
artinya.Jawaban:
Di sebagian besar universitas, saya berasumsi (saya harap!) Bahwa kompleksitas waktu dan memori jelas merupakan bagian dari program mereka.
Sekarang, "kompleksitas" ini adalah topik yang sangat elastis. Apakah orang harus benar-benar mengetahui semua teori seperti "ZPP adalah kelas kompleksitas masalah keputusan yang dapat diselesaikan dengan nol kesalahan pada mesin Turing probabilistik dalam waktu polinomial." dan hal semacam itu dipertanyakan. Saya pribadi menganggap teori-teori canggih ini tidak relevan dengan pengembangan perangkat lunak.
Sebaliknya, saya menganggap bahwa setiap pengembang harus menyadari kompleksitas ruang / waktu dari struktur data dan algoritma yang mereka gunakan.
sumber
Banyak pemula menderita obsesi mikro-optimasi. Belajar comp. kompleksitas mengarahkan siswa menuju cara yang jauh lebih praktis untuk memperkirakan kinerja dan skalabilitas, dalam pengalaman saya.
sumber
Dari apa yang saya lihat, tampaknya notasi O besar dan kompleksitas waktu dan memori banyak ditekankan dalam pendidikan ilmu komputer formal ... betapapun otodidak, persepsi ini didasarkan pada mendengar dan membaca apa yang orang-orang dengan pendidikan seperti itu. katakan dan tulis.
Meskipun saya percaya ide dan konsep umum itu penting, saya tidak percaya formalisasi itu (seperti notasi O besar dan berbagai terminologi) hampir sama artinya, kecuali untuk keperluan komunikasi. Hanya karena seseorang tidak terbiasa dengan notasi formal dan terminologi tidak berarti mereka tidak dapat melihat bagaimana dan mengapa satu algoritma akan lebih cepat daripada yang lain dalam kasus tertentu. Orang-orang dapat melihat bahwa waktu yang dibutuhkan untuk mencari pohon biner seimbang berkaitan dengan logaritma basis-2 dari jumlah node tanpa terlebih dahulu belajar tentang teori kompleksitas dalam pengertian formal, jika mereka memahami cara kerja pohon dan memiliki pemahaman yang tinggi tentang tinggi. matematika sekolah. Sangat penting untuk mengetahui kapan harus memperhatikan kompleksitas dan penggunaan memori, dan untuk mempertimbangkan kasus-kasus tipikal dan terburuk, meskipun ... tetapi beberapa orang tidak.
Notasi dan terminologi menjadi penting untuk komunikasi. Mereka memberikan cara yang bagus untuk menyampaikan kuantifikasi kinerja suatu algoritma kepada orang lain. Karena sering muncul dalam makalah dan penjelasan, penting untuk memiliki setidaknya pemahaman yang samar-samar sehingga lebih mudah untuk diikuti.
Jadi ya, konsepnya penting (meskipun kurang begitu ketika sumber daya dan waktu cukup tetapi data tidak). Tetapi meskipun konsep-konsep itu penting, formalisasi konsep-konsep itu seringkali tidak begitu penting - dan orang perlu mengingat bahwa notasi dan terminologi tidak sama dengan konsep-konsep itu sendiri.
Edit:
Saya tidak akan mengklaim memahami konsep sedetil seseorang yang secara formal belajar, tetapi banyak ide umum masuk akal. Saya pikir ada nilai dalam mempelajari secara formal ini, tetapi beberapa dari nilai itu masih bisa ada tanpa.
Adapun untuk memperkenalkan konsep-konsep (di luar studi formal), saya pikir awal yang baik adalah untuk mendorong orang untuk berpikir tentang berapa banyak memori overhead yang dimiliki struktur data, langkah-langkah apa yang melibatkan algoritma, dan bagaimana hal-hal ini berubah dengan data yang berbeda.
Ini juga membantu untuk mempertimbangkan situasi dan perubahan hipotetis, seperti mempertimbangkan apa yang terjadi jika pohon seimbang versus apa yang terjadi jika itu tidak seimbang mungkin, atau berapa banyak tingkat ke dalam pohon sebagian besar node akan, atau berapa banyak lagi node yang bisa tahan jika kedalamannya ditingkatkan satu tingkat. Cara berpikir seperti ini umumnya bermanfaat bagi programmer, tidak hanya ketika melihat kompleksitas; dan jika diterapkan untuk berpikir tentang bagaimana algoritma dan struktur data melakukan dalam keadaan yang berbeda itu secara alami menunjuk ke arah yang sama dengan pemeriksaan kompleksitas yang lebih formal.
sumber
Iya
Memahami dasar-dasar kompleksitas adalah penting dan harus menjadi sesuatu yang Anda pelajari sebagai mahasiswa. Bahkan saya pikir itu biasanya menyentuh di mana kelas mengajarkan Anda tentang struktur data. Saya dapat memahami lulusan tidak memahami atau tidak mengingat, tetapi saya tidak dapat melihat mereka tidak diajarkan dasar-dasar kompleksitas.
Perbarui: Mengapa ini Penting
Saya sedang melakukan migrasi basis data pada pekerjaan tertentu. Kami memiliki tenggat waktu kapan migrasi harus dilakukan. Orang yang menulis skrip tidak memiliki landasan dalam kompleksitas. Sayangnya, tidak ada orang lain yang melihat dengan cermat logika yang digunakannya dalam naskah. Saya tidak ingat secara spesifik selain ia menggunakan loop bersarang ganda bukannya hashtable. Setelah satu minggu skrip berjalan terus-menerus kami melihat logika, menyadari masalahnya. Butuh sekitar 5 jam untuk menyelesaikan setelah perubahan. Kami hampir melewatkan tenggat waktu untuk penyelesaian migrasi karena seseorang tidak memahami kompleksitas.
Intinya adalah mudah untuk secara tidak sengaja membuat sesuatu yang perintahnya lebih lambat, atau akan selalu kehabisan memori sebelum pekerjaan selesai. Sementara mesin yang lebih cepat dengan lebih banyak memori dapat mengurangi kesalahan kecil, mereka seringkali tidak dapat mengurangi masalah kompleksitas.
sumber
Saya menemukan bahwa bertanya apakah itu "penting atau tidak" agak kabur.
Anda akan menemukan banyak orang menginjili tentang bagaimana setiap pengetahuan terkecil di dunia ini benar-benar dibutuhkan dalam pendapat mereka. Tapi itu agak sia-sia, karena seseorang tidak akan pernah tahu segalanya, dan orang seharusnya tidak diharapkan kecuali itu membantu seseorang untuk memenuhi persyaratan yang diajukan oleh pekerjaannya. Saya lebih suka mengambil pendekatan yang lebih pragmatis untuk prasyarat pendidikan, secara umum, kecuali itu karena hobi atau preferensi pribadi yang sewenang-wenang.
Apakah penting bagi programmer yang diharapkan untuk menulis kode yang sangat efisien atau algoritma infrastruktur inovatif? Iya.
Apakah penting bagi programmer yang mengembangkan aplikasi web konvensional? Mereka dapat mengelola tanpa itu atau mendapatkan implementasi yang efisien di dunia open source.
Apakah penting bagi programmer yang mengembangkan GUI untuk aplikasi? Mungkin tidak, karena kerangka kerja GUI yang berhasil memisahkan semua detail kecil itu.
Selalu menyenangkan untuk diketahui, sama seperti apa pun, tetapi itu tidak membuat banyak (atau bahkan sebagian besar) programmer hanya melakukan pekerjaan mereka untuk kepuasan majikan mereka.
Di sisi lain, jika seseorang mendaftar untuk studi yang lebih tinggi, dalam mencari pendidikan dasar dan teoritis, seseorang harus diharapkan untuk mempelajari mata pelajaran yang menurut definisi lebih teoretis daripada praktis. Menurut pendapat saya, penting bagi CompSci. siswa belajar tentang kompleksitas, sama pentingnya dengan mereka belajar tentang kalkulus.
Tapi bagaimanapun, sejak kapan melakukan CompSci. program mengajarkan orang bagaimana menjadi programmer yang baik? Untuk itu Anda memiliki program pelatihan khusus dan pengalaman praktis (baik program Anda maupun sesama programer yang dapat membagikannya dengan Anda).
sumber