Apakah penting untuk solusi menjadi solusi yang efisien?

9

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?

Semut
sumber
4
Apakah Anda bertanya dari sudut pandang kontes atau sudut pandang implementasi dunia nyata?
rjzii
@RobZ: Dalam implementasi dunia nyata
Semut
1
"Dunia nyata" mencakup banyak hal. Tertanam Aplikasi server? Aplikasi seluler? Perangkat lunak komputer pribadi pengguna tunggal? Simulasi ilmiah? Jawabannya tidak selalu sama untuk mereka.
David Thornley

Jawaban:

34

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.

Mike Cellini
sumber
3
Ya. Dan program yang sangat tidak efisien baik yang benar maupun yang telah selesai memberi Anda sesuatu untuk menguji peningkatan Anda.
Mike Sherrill 'Cat Recall'
1
Bagian terpenting dari ini adalah mengetahui praktik terbaik untuk efisiensi terutama dalam pengembangan basis data di mana saya pribadi akan menempatkan efisiensi di atas rawatan. Pengguna sangat peduli dengan kinerja. Saya sering melihat kode yang lebih efisien dibicarakan sebagai lebih sulit untuk dipelihara tetapi hanya karena kegagalan pengembang untuk memahami kode yang lebih efisien untuk memulainya, setelah Anda terbiasa dengan teknik, Anda pergi ke techiniques sebagai pilihan pertama dan mereka menjadi lebih mudah untuk dipertahankan karena Anda mengerti mengapa mereka bekerja.
HLGEM
@ HLGEM Jika ada bagian dari jawaban ini yang ingin saya perkuat sebagai prinsip umum (selain baris pertama), ia mengetahui praktik terbaik untuk menulis kode efisien. Dan Anda benar dengan komentar tentang SQL yang efisien menjadi penting.
Mike Cellini
8

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.

Jaydee
sumber
Aturan praktis yang saya dengar adalah peningkatan 20% dapat diperhatikan oleh pengguna. Keduanya tampaknya memenuhi syarat, saya pikir pengguna benar-benar bisa merasakan perbedaan dalam respons antara 0,1 dan 0,00001 detik.
Chris Pitman
Chris, Anda mungkin benar bahwa seorang pengguna dapat melihat perbedaan antara kedua sistem itu secara berdampingan, tetapi apakah satu sistem akan membuat pengguna terlihat lebih efisien dalam pekerjaannya? Pengamatan saya (saya telah melakukan ini selama lebih dari 25 tahun) adalah bahwa kedua sistem akan memungkinkan pengguna untuk melakukan jumlah pekerjaan yang sama dalam waktu tertentu.
Jaydee
2

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:

  • Beberapa siswa menggunakan loop sederhana dan rumus yang disediakan untuk memeriksa untuk memastikan angka-angka itu benar dan menampilkannya, lambat tetapi menyelesaikan pekerjaan, O (n ^ 3).
  • Siswa lain melakukan penelitian dan menemukan formula yang melakukan pekerjaan pengecekan yang lebih baik untuk memastikan bahwa angka yang diberikan valid, program ini berjalan lebih cepat, O (n ^ 2).
  • Satu siswa menggunakan rumus lambat untuk menghasilkan nilai-nilai dan kemudian menyalinnya ke dalam array konstan dalam kode mereka dan menampilkan kontennya, O (n).

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.

rjzii
sumber
2

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:

Tulis kode yang bersih, jelas, dan efisien. Meskipun tidak ada item baris ulasan khusus untuk ini, pengulas cenderung bereaksi lebih baik terhadap kode yang mudah dibaca dan dipahami oleh mereka. Dengan kode yang efisien, Anda mendapatkan keuntungan kinerja potensial dalam stress dan pengujian benchmark, serta kemungkinan pujian (dan beberapa poin tambahan) dari pengulas.

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.

Daniel Pittman
sumber
Ada edisi baru dari manual desain algoritma keluar. (11 tahun antara keduanya). Apakah ada yang salah dengan yang baru? Terutama karena lebih murah daripada yang lama. Jika demikian, mungkin itu harus dijawab dalam jawaban Anda.
Insinyur Dunia
Tidak, saya hanya mendaftar yang pertama yang saya temukan di Amazon, dan tidak repot-repot memeriksa bahwa itu adalah edisi kedua.
Daniel Pittman
1

Seberapa efisien suatu solusi perlu bergantung pada sejumlah faktor. Hal terbesar adalah mengetahui apa yang diinginkan pengguna Anda. Berikut beberapa contohnya.

  1. Jika Anda adalah satu-satunya pengguna blok kode, dan itu berfungsi dengan baik untuk Anda, maka Anda mungkin baik-baik saja.
  2. Jika program Anda akan dijual, maka Anda harus memiliki platform target dalam pikiran. Uji dengan platform ini. Jika program ini sangat lambat, maka Anda harus berusaha membuatnya lebih efisien. Jika Anda merasa baik-baik saja, serahkan ke pengguna lain, dan lihat apakah mereka setuju.
  3. Mungkin program ini memiliki pertimbangan lain. Jika Anda membangun, katakanlah, program berbasis server, maka Anda mungkin perlu bekerja sangat keras untuk membuat program seefisien mungkin. Atau, jika itu berjalan pada mikroprosesor, pastikan itu berfungsi di sana juga.

Cara membuat kode Anda lebih efisien:

  1. Langkah pertama adalah untuk mendapatkan ide tentang apa yang paling memakan waktu. Caranya adalah dengan melakukan sesuatu yang disebut kode profil. Cari apa yang paling memakan waktu, dan lihat apakah Anda dapat menemukan cara untuk membuatnya berjalan lebih cepat.
  2. Mungkin faktor pembatas utama adalah memori. Jika itu masalahnya, cari apa yang menghabiskan banyak memori, dan lihat bagaimana Anda bisa menguranginya.

Ada seluruh bidang untuk optimasi, tetapi dua tips di atas setidaknya harus membantu Anda memulai.

PearsonArtPhoto
sumber
1

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 ".

mattnz
sumber