Seberapa pentingkah bagi seorang programmer untuk mengetahui cara mengimplementasikan algoritma QuickSort / MergeSort dari memori? [Tutup]

58

Saya sedang meninjau catatan saya dan menemukan implementasi algoritma penyortiran yang berbeda.

Ketika saya berusaha memahami implementasi QuickSort dan MergeSort, terlintas dalam benak saya bahwa walaupun saya melakukan pemrograman untuk mencari nafkah dan menganggap diri saya layak pada apa yang saya lakukan, saya tidak memiliki memori fotografis atau kemampuan otak semata untuk mengimplementasikan algoritme tersebut tanpa mengandalkan catatan saya. Yang saya ingat adalah bahwa beberapa algoritma itu stabil dan ada yang tidak. Beberapa mengambil O (nlog (n)) atau O (n ^ 2) waktu untuk menyelesaikan. Beberapa menggunakan lebih banyak memori daripada yang lain ...

Saya merasa tidak layak mendapatkan pekerjaan semacam ini jika bukan karena posisi saya tidak mengharuskan saya menggunakan algoritma penyortiran apa pun selain yang ditemukan di API standar. Maksud saya, berapa banyak dari Anda yang memiliki posisi pemrograman di mana sebenarnya penting agar Anda dapat mengingat atau membuat hal-hal seperti ini sendiri?

John Smith
sumber
13
Anda harus ingat bahwa ada solusi dan kapan menggunakannya. Kemudian masuk ke dokumen dan menerapkannya. Jika Anda belum tahu tentang quicksort atau mergesort, Anda masih akan menggunakan bubblesort dan menonton program Anda merangkak dan menghasilkan solusi di bawah standar ketika data meningkat.
Pieter B
1
Terlepas dari jawaban yang baik yang disebutkan di bawah ini, perhatikan juga bahwa banyak perusahaan perlu (1) mengetahui kompleksitas algoritma tersebut, (2) fasih dalam mengimplementasikannya di papan tulis.
sakisk
3
Saya yakin penting untuk menghafal algo ini untuk seringnya Google offline. : o
Lee James
Anda perlu mengetahui kinerja mereka, menggunakan kasus, dll. Mengetahui bagaimana menerapkannya dengan hati adalah sesuatu yang hanya diperlukan oleh perusahaan teknologi dalam wawancara.
sakisk
@PetereterB, saya tidak setuju. Orang tidak perlu tahu tentang 'mergesort' dan 'quicksort' ke Google 'algoritma sorting berkinerja terbaik'
hyankov

Jawaban:

117

Mari kita tanyakan pada Albert dan lihat apa yang dia katakan tentang masalah ini:

"Aku tidak perlu tahu segalanya, aku hanya perlu tahu di mana menemukannya, ketika aku membutuhkannya"

- Albert Einstein , diparafrasekan

Amin, Bruder Albert, Amin.

Setelah Anda membuat survei yang baik tentang algoritma penting dalam disiplin ilmu tertentu (sort, pencarian, apa pun), Anda kemudian bisa melupakan detail implementasi sampai Anda benar-benar membutuhkan algo, dalam hal ini Anda mencari atau menggunakan Lib yang sudah ada. 25 tahun yang lalu saya membangun sistem pencarian utama menggunakan B * -trees, tapi hari ini saya perlu RTFM untuk menggunakannya dengan baik.

Peter Rowell
sumber
9
Bagaimana itu menjawab pertanyaan? Dia berkata "Saya tidak perlu tahu segalanya", dia tidak mengatakan "Saya tidak perlu tahu apa-apa". Beberapa keterampilan bersifat mendasar, dan seluruh pertanyaannya adalah apakah sepotong informasi tertentu termasuk dalam kategori keterampilan dasar atau tidak.
Konrad Rudolph
1
Berpikir bahwa tujuannya adalah untuk menghafal quicksort berarti kehilangan inti pertanyaan. Tentu saja, di dunia nyata, jika Anda memerlukan quicksort generik, Anda akan menggunakan rutin perpustakaan atau mencari kode dan menyalinnya. Tes ini untuk melihat apakah Anda memahami rekursi, invarian loop, dll., Dan meminta Anda untuk dengan cepat mencatat algoritma pengurutan hanyalah demonstrasi yang sangat sederhana dari pengetahuan itu. Jika Anda tidak mampu mendapatkan kembali quicksort 20-line di tempat, berapa banyak hal yang Anda lakukan secara benar-benar tidak efisien atau salah tanpa menyadarinya?
Larry Gritz
3
@Larry: Saya pikir saya telah melupakan lebih dari banyak programmer yang tahu tentang detail algoritma- dan Sortir cepat dari awal adalah salah satunya - untuk alasan yang sangat bagus - Saya telah memilih untuk membaca hal-hal tingkat tinggi dan menggunakan bahasa tingkat tinggi daripada daripada tinggal di mangkuk detail implementasi tingkat rendah. Terus terang - saya tidak peduli apa jenis rutin perpustakaan yang saya gunakan menggunakan - itu bisa menggunakan debu dan peri peri sejauh yang saya ketahui. Dokumen akan memberi tahu O () untuk ukuran-itu saja yang perlu saya ketahui.
mattnz
2
@ mattnz: Tindak lanjut yang agak terlambat ke "O () ukuran" Anda. Satu hal yang saya pelajari dengan susah payah adalah bahwa dengan dataset besar, referensi lokal yang buruk dapat benar-benar menguasai O (). Anda mungkin memiliki algo O(n log n), tetapi jika Anda mendapatkan banyak cache yang salah atau (Tuhan melarang) Anda menekan disk, maka itu n log nakan menjadi memori yang indah.
Peter Rowell
49
  1. Ini bukan masalah menghafal. Ini masalah pemahaman mendalam tentang kelas umum dari algoritma seperti membagi dan menaklukkan. Jika Anda benar-benar memahami memecah belah dan menaklukkan, maka Anda tidak perlu menghafal quicksort. Anda dapat memperolehnya kembali di tempat sesuai kebutuhan. Selain itu, hasil nyata bahkan tidak mampu mendapatkan kembali quicksort sendiri, itu adalah bahwa Anda dapat mengenali kapan masalah baru dapat diterima untuk solusi pemecahan dan menaklukkan.

  2. Tidak semua pekerjaan pemrograman sama. Beberapa pekerjaan memerlukan pengetahuan mendalam tentang algoritma, beberapa membutuhkan orang-orang yang memahami teori tipe, dan beberapa hanya membutuhkan orang-orang yang dapat mengikis data dari formulir web dan memindahkannya ke database. Beberapa pekerjaan bahkan membutuhkan semua keterampilan itu sekaligus. Pekerjaan seperti apa yang Anda inginkan?

Charles E. Grant
sumber
5
Saya tidak berpikir itu mungkin untuk memahami QuickSort tanpa mengingat QuickSort. Itu bukan hal yang rumit dan misterius, itu hanya dua ide umum yang digabungkan. Hal yang sama berlaku untuk merge-sort, tetapi di sana Anda hanya punya satu ide: P
drxzcl
Saya tidak setuju dengan poin ke-2. semua pekerjaan sama, hanya perubahan pewawancara. yang ini tahu penyortiran dengan sangat baik dan berpikir setiap programmer yang baik harus tahu penyortiran, karena hanya itu yang dia ketahui dan pedulikan.
IAdapter
2
@IAdapter, pasti bercanda! Saya tahu dari pengalaman saya sendiri bahwa pengetahuan dan keterampilan yang saya butuhkan untuk pekerjaan pertama saya menulis makro TROFF untuk perusahaan perangkat lunak shrink-wrap sangat berbeda dari yang saya butuhkan untuk pekerjaan saya saat ini di laboratorium biologi komputasi.
Charles E. Grant
@ CharlesE.Grant sebagian besar waktu interviwer tidak memeriksa apakah Anda memiliki keterampilan yang Anda butuhkan untuk melakukan pekerjaan Anda (Saya tidak ingat pertanyaan javascript / css terakhir saya ditanya dan saya melakukan webapps).
IAdapter
10

Saya pikir satu-satunya waktu Anda perlu mengingat semuanya adalah ketika melamar pekerjaan ketika Anda harus datang dengan jawaban di tempat dan tidak memiliki sumber daya luar.

Saya telah meminta rekan kerja untuk menulis ulang quicksort dan yang lainnya, tetapi saya terus mengatakan kepada mereka untuk kembali menggunakan fungsi penyortiran bawaan yang ada dalam bahasa tersebut. Saya tahu bahwa tergantung pada jenis proyek yang kami kerjakan kami harus mengingat algoritma lain karena biasanya tidak termasuk dalam pustaka standar, tetapi pengurutan bukan salah satu yang muncul karena biasanya dibangun ke dalam bahasa.

Ketika kita perlu mengingat algoritma tersebut, kita biasanya beralih ke google atau buku, dan biasanya itu tidak mencari implementasi spesifik, tetapi apa yang akan menjadi implementasi terbaik untuk masalah kita.

scaryrawr
sumber
6

Hanya dengan mengingat algoritma mana yang berguna dalam skenario apa, akan lebih dari cukup untuk membantu selama pekerjaan Anda. Pada kenyataannya, sebagian besar pekerjaan pemrograman tidak memerlukan penghafalan pendekatan, melainkan mereka tertarik pada cara Anda mengenali pola algoritmik ketika dihadapkan dengan masalah .

Faktanya, ada banyak informasi di kebanyakan blog pemrograman / artikel tentang topik algoritma. Dengan demikian, menghafal implementasi yang tepat tidak mementingkan. Sebagian besar informasi berharga akan mendapatkan ide dasar tentang jenis algoritma apa yang tersedia, dan masalah spesifik apa yang mereka pecahkan . Mencari implementasi yang tepat setelah Anda tahu apa yang Anda cari cukup cepat.

Singkatnya, selalu lebih baik untuk mengetahui apa yang Anda cari dan di mana referensi - yang akan memandu Anda ke sumbernya.

EL Yusubov
sumber
5

Implementasi yang tepat tidak terlalu penting. Tetapi prinsip di balik mergesort / quicksort - rekursi, partisi dll, sangat mendasar dan setiap programmer harus mengerti. Algoritma ini sebenarnya sangat sederhana untuk digambarkan dalam kata-kata begitu Anda mengerti.

Ini sebenarnya bukan masalah apakah Anda dapat mencarinya atau apakah Anda dapat google, melainkan apakah programmer memahami teknik pemecahan masalah ini dan dapat diterapkan pada situasi lain.

hgh
sumber
3

Saya dari dua pikiran tentang hal ini. Saya tahu banyak programmer yang tidak tahu apa itu algoritma pengurutan, tetapi melakukan pekerjaan mereka dengan cukup baik. Saya juga percaya pada prinsip-prinsip memahami agar benar-benar memahami domain.

Sulit bagi saya untuk memiliki jawaban yang tidak bias tentang hal ini karena saya telah memprogram begitu lama sehingga saya mungkin lupa lebih banyak algoritma yang saya tahu saat ini - tetapi saya masih tahu yang menyortir yang disebutkan dalam pertanyaan ini. Saya pikir para pemimpin pemikiran di Agile (misalnya Ron Jeffries, Alistair Cockburn) memiliki beberapa ide bagus di dekat ide ini (misalnya Shu-Ha-Ri).

Singkatnya untuk jawaban bertele-tele ini: Pasti menggunakan API (NIH adalah tanda ketidakdewasaan pengembang), tetapi selalu memahami prinsip-prinsip yang mendasarinya. Saya harap ini membantu.

Mike Polen
sumber
2

Penyortiran dan pencarian sangat penting, baik Anda penggemar Donald Knuth atau ingin menjadi Larry Page berikutnya. Bergantung pada bisnis tempat Anda berada, dan tingkat persaingan yang dapat Anda perintahkan di antara kandidat Anda, saya akan merekomendasikan agar Anda memasukkan beberapa konsep berikut dalam wawancara.

Penyortiran

  • Sketsa semacam algoritma penyortiran.
  • Daftar beberapa contoh algoritma pengurutan.
  • Bandingkan / kontraskan dua macam dengan karakteristik kinerja yang berbeda.
  • Jika mereka tidak menyebutkan penggunaan memori, tanyakan hal itu.

Mencari

  • Beri nama sebanyak mungkin algoritma pencarian.
  • Bandingkan / kontraskan dua algoritma pencarian.
  • Buat sketsa pencarian apa pun selain pencarian linear.

Beberapa orang mungkin mengatakan bahwa memerlukan kode untuk algoritma ini berlebihan kecuali pekerjaan itu di pulau sepi tanpa koneksi internet. Pertimbangan lain adalah bahwa jika Anda punya waktu 30 menit, dan Anda ingin bertanya tentang hal lain, bagi banyak kandidat, menerapkan semacam itu bisa memakan banyak waktu Anda.

Pengembang Don
sumber
Dulu saya berpikir meminta orang untuk memprogram wawancara itu konyol, tetapi Anda tidak akan percaya bahwa jumlah orang dengan resume yang tampak fantastis dan yang menjawab pertanyaan "sosial" dengan warna-warna cerah, tetapi yang, bagi kehidupan mereka, tidak bisa catat implementasi yang benar dari 'strcat' atau fungsi sederhana lainnya. Beberapa kali ini telah menyelamatkan saya dari mempekerjakan seseorang yang, jika bukan karena pertanyaan pengkodean konyol, bisa menyebabkan kesedihan yang tak berkesudahan dan menyeret tim ke bawah dengan ketidakmampuan.
Larry Gritz