Saya memecahkan banyak masalah, kebanyakan dari Top Coder. Saya akan mendapatkan jawaban untuk banyak orang, tetapi seringkali saya berakhir dengan solusi yang tidak efisien.
Dalam implementasi dunia nyata - apakah benar-benar penting bahwa solusi untuk masalah ini efisien? Kalau begitu bagaimana saya bisa memperbaikinya?
problem-solving
Semut
sumber
sumber
Jawaban:
Solusi terbaik adalah yang (dalam urutan semakin penting) efisien, dapat dipelihara dan dilakukan .
^^^ Hanya itu yang perlu Anda ambil dari jawaban ini. ^^^
Efisiensi itu penting . Mungkin sedikit kurang daripada dulu karena banyaknya perangkat keras kami, tetapi Kinerja adalah Fitur . Dalam sebuah kontes, efisiensi jelas penting. Anda harus tahu cara menulis kode yang efisien. Lebih penting lagi, Anda harus mengetahui praktik terbaik yang akan menghasilkan kode berkinerja efisien dan berkinerja baik tanpa mengorbankan ketepatan waktu atau pemeliharaan aplikasi. Di sinilah kedalaman pengalaman dengan platform dan bahasa menghasilkan banyak hasil.
Lebih penting lagi (dalam 95% kasus), adalah memiliki solusi yang sudah jadi dan dapat dipelihara. Tanpa produk jadi , tidak masalah seberapa efisien atau terpelihara solusinya. Jika Anda butuh banyak waktu untuk melacak dan memperbaiki bug atau menambahkan fitur baru, tidak masalah seberapa efisien solusinya. Tetapi, efisiensi dan kinerja tidak diragukan lagi penting, tidak peduli apa kata orang.
sumber
Saya setuju dengan Mike Cellini, satu hal yang saya tambahkan adalah.
Apakah sesuatu yang "cukup efisien"? Misalnya dari sudut pandang pengguna, tidak ada banyak perbedaan antara fungsi yang selesai dalam 0,00001 detik atau yang selesai dalam 0,1 detik meskipun satu jauh lebih efisien daripada yang lain. Fungsi yang selesai dalam 10 menit tidak jauh berbeda (untuk pengguna) dengan yang selesai dalam 12 menit. Dalam kedua kasus pengguna akan mendapatkan secangkir kopi atau melanjutkan tugas lain.
Saya datang untuk melihat efisiensi sebagai "pengguna yang efisien" bukan algoritma yang efisien.
sumber
Secara umum, solusi paling penting untuk suatu masalah adalah solusi yang benar-benar ada dan valid untuk kasus-kasus sebagaimana ada untuk masalah Anda. Dengan kata lain, hindari optimasi prematur sampai Anda benar-benar tahu Anda memiliki kode yang tidak efisien, atau kode efisien yang perlu lebih cepat.
Juga, jangan lupa bahwa solusi terbaik untuk aplikasi Anda mungkin bukan solusi kasus umum. Kasus dan poin, beberapa tahun yang lalu seorang profesor memberi masalah kepada kelas kami di mana kami harus mencetak 10 angka pertama dari jenis yang diberikan (maaf, ingatan saya gagal untuk jenis itu, tetapi itu adalah salah satu dari jumlah yang lebih tidak biasa) kelas) dan kami diberi tes untuk memeriksa untuk memastikan bahwa nomor tersebut adalah tipe yang diberikan. Ini adalah tingkat masalah yang diberikan kepada kami dan kami diberitahu bahwa itu disebabkan keesokan harinya dengan solusi paling efisien yang menerima kredit penuh. Kuliah berikut sang profesor merangkum hasilnya:
Solusi terakhir dinilai paling efisien oleh profesor. Ternyata masalahnya sebenarnya adalah latihan memahami sepenuhnya masalah dan tidak hanya keluar dan menemukan solusi yang paling efisien.
Maksud di atas adalah bahwa ketika datang untuk menemukan solusi yang efisien masalah, biasanya lebih baik menghabiskan waktu untuk memastikan Anda benar-benar memahami apa masalahnya sebelum pergi dan menulis kode, atau mencoba mengoptimalkan kode. Jika Anda dapat menyimpan satu set nilai referensi dalam array konstan maka Anda lebih baik melakukannya dari sudut pandang kinerja daripada mencoba menulis beberapa algoritma mewah.
Demikian juga, jangan lupa bahwa untuk sebagian besar aplikasi, satu-satunya orang yang cenderung melihat kode tidak efisien (ketika itu tidak perlu tidak efisien!) Adalah pengembang sendiri. Jika Anda menulis kode bersih yang hanya melakukan apa yang perlu dilakukan, kemungkinan besar sebagian besar waktu pengguna tidak akan melihat masalah kinerja ketika bekerja dengan program Anda dan ketika mereka hanya mengoptimalkan bagian-bagian yang mereka sebutkan. kamu.
sumber
Itu tergantung pada struktur kontes, tetapi umumnya, ya: kinerja sebagian besar waktu adalah pertimbangan, menurut dokumentasi mereka . Terkadang, seperti pada tautan selanjutnya, Anda harus berburu, tetapi mengutip:
Cara terbaik untuk memperbaiki ini adalah dengan menulis kode yang efisien, yang sudah Anda lakukan. Bahkan jika Anda menyelesaikan pekerjaan, habiskan waktu untuk meningkatkan efisiensi itu - bahkan setelah kompetisi - dan itu akan terbayar.
Anda mungkin juga ingin berinvestasi dalam teori, seperti buku tentang algoritma , yang dapat memberi Anda dua hal: alat yang lebih efisien untuk memecahkan masalah tertentu, dan mekanisme yang lebih efisien untuk mengidentifikasi apa masalah yang harus Anda selesaikan.
Akhirnya, kursus ilmu komputer semakin tersedia secara online , dan akan mencakup latar belakang yang perlu Anda tingkatkan.
sumber
Seberapa efisien suatu solusi perlu bergantung pada sejumlah faktor. Hal terbesar adalah mengetahui apa yang diinginkan pengguna Anda. Berikut beberapa contohnya.
Cara membuat kode Anda lebih efisien:
Ada seluruh bidang untuk optimasi, tetapi dua tips di atas setidaknya harus membantu Anda memulai.
sumber
Untuk sebuah kompetisi, Anda perlu memahami siapa juri dan apa jadinya - jika mereka mencari coders yang hebat dan tidak lebih, maka Anda akan mendapatkan pujian untuk kode yang lebih efisien.
Sebagai aturan, di dunia nyata, itu tidak masalah. Salah satu ide kunci pengembangan perangkat lunak adalah "Jangan optimalkan apa yang tidak Anda ketahui perlu dioptimalkan", lalu "Optimalkan hanya jika telah terbukti diperlukan"
Banyak praktisi akan berpendapat bahwa ini mengarah pada kode kembung, tidak efisien yang tidak dapat dengan mudah diperbaiki, dan dalam beberapa kasus tepi (yang akan berkokok seolah-olah itulah yang dilakukan kebanyakan coder sepanjang hari setiap hari) mereka benar. Namun tidak banyak proyek pengembangan perangkat lunak yang diukur hasilnya "Kinerja: Lebih cepat dari yang dibutuhkan, Biaya: Siapa yang peduli, Waktu pengiriman: Sekitar dekade ini", Di dunia nyata, biasanya "Saya ingin murah, saya ingin kemarin, saya ingin kemarin, saya ingin ini berfungsi ".
sumber