Apakah pemrograman atau ilmu komputer secara umum, semua tentang algoritma?


40

Sebagai mahasiswa pascasarjana, saya merasa semakin umum bagi perusahaan bergengsi (seperti Google, Facebook, Microsoft, ...) untuk mengajukan pertanyaan algoritme dalam pengujian dan wawancara mereka. Beberapa startup yang saya lamar juga bertanya tentang algoritma. Saya ingin tahu apakah kelancaran algoritma adalah hal terpenting bagi pengembang perangkat lunak di perusahaan-perusahaan itu?

Jika jawabannya ya, apa metode atau sumber daya terbaik untuk dipelajari & dipraktikkan tentang algoritma secara efektif? Saya sepertinya tidak tertarik untuk menyelesaikan masalah yang tampaknya terlalu rumit yang ditemukan di sebagian besar buku pelajaran atau situs web. Meskipun mudah memahami algoritma dasar (seperti quicksort, bubblesort, ...), saya merasa sangat sulit untuk mengingat dan menggunakannya kembali nanti.

Terima kasih.

P / S: Jika Anda bertanya kepada saya apa yang saya suka, itu membangun perangkat lunak yang baik untuk memecahkan masalah pengguna secara inovatif. Saya kira itu tidak berarti perangkat lunak harus sangat rumit.


26
Adakah gagasan betapa rumitnya bagi Google untuk memungkinkan Anda mencari seluruh web dengan kotak teks dan tombol?
JeffO

21
@ Jeff, aku bahkan tidak menggunakan tombol lagi ;-)
maple_shaft

1
Jika Google membuatnya lebih mudah, semua situs pencarian lainnya tidak memerlukan kode sama sekali.
JeffO

Saya pikir pertanyaannya adalah tentang bagaimana komputer bekerja, seperti bagaimana cara kerja CPU, bagaimana RAM bekerja, bagaimana wifi bekerja, dll. Itu adalah pertanyaan yang cukup menarik yang masih harus diteliti. Saya masih menemukan perangkat keras lebih dahsyat daripada semua pemrograman Geeks di java atau php.
jokoon

2
Ini tidak semua tentang algoritma, tetapi memang mereka adalah inti dari CS. Tetapi ada lebih banyak hal untuk pemrograman daripada hanya algoritma dan logika (mempertahankan kode, misalnya, tidak hanya membutuhkan pengetahuan tentang algoritma).
haylem

Jawaban:


44

Algoritma jelas

Inilah hal yang indah tentang algoritma: Ruang masalah yang mereka hadapi didefinisikan dengan baik, yaitu persyaratan Anda tidak hanya benar-benar diketahui , tetapi biasanya bahkan diformalkan seperti metrik untuk kualitas solusi.

Jadi, jika saya memberi tahu Anda untuk membuat algoritma, tidak ada banyak potensi masalah komunikasi, dan mengukur kinerja Anda adalah tugas yang sepele. Pada saat yang sama kinerja Anda merupakan indikator yang cukup baik untuk kemampuan Anda berpikir secara logis.

Algoritma adalah filter yang efisien

Masalah industri saat ini (dan pendidikan) adalah kualitas lulusan yang buruk. Ini telah diilustrasikan dengan uji FizzBuzz , yaitu:

Tulis sebuah program, yang akan melewati angka dari 1 hingga 100 dan akan mencetak "fiz" jika angka tersebut dapat dibagi 3, "buzz" jika itu dapat dibagi 5 dan angka itu sendiri jika tidak dapat dibagi oleh keduanya.

Rupanya, sebagian besar dari semua lulusan Comp Sci gagal menyelesaikan masalah ini. Harap dicatat bahwa ini adalah pertanyaan algoritmik, meskipun tentu saja pertanyaan yang memalukan. Dengan ini, mendapatkan seseorang yang dapat memecahkan masalah seperti yang diberikan di Google Code Jam atau Project Euler, Anda sudah menikmati crème-de-la-crème.

Algoritma adalah bagian kecil dari pengembangan perangkat lunak

Yang benar adalah, segera setelah Anda bekerja di industri, Anda tidak akan menggunakan keterampilan algoritme Anda lebih dari 1% dari waktu.

Bahkan sebelum Anda mulai menulis kode, Anda harus terlebih dahulu mengumpulkan dan menganalisis persyaratan. Maka Anda harus mensintesis desain Anda berdasarkan pada mereka. Maka Anda harus menerapkan desain. Maka Anda harus mengevaluasi implementasi terhadap persyaratan asli, kemudian mengulangi persyaratan, kemudian mengulangi desain, kemudian mengulangi implementasi dan sebagainya.

Salah satu persyaratannya adalah kinerja yang masuk akal . Jika persyaratan itu tidak terpenuhi, Anda harus membuat profil implementasi Anda untuk melacak kemacetan dan kemudian Anda dapat mengoptimalkannya, yang kadang-kadang merupakan masalah optimasi mikro secara langsung (yang agak mudah dilakukan), tetapi kadang-kadang adalah masalah menggunakan algoritma yang lebih baik (yang tidak selalu mudah dilakukan sesudahnya). Karena itu:

Algoritma sangat penting

Semakin baik pemahaman Anda tentang algoritma, semakin besar peluang Anda melakukannya dengan benar pada kali pertama. Jika tidak, Anda tidak hanya akan mengalami masalah yang hanya dapat diselesaikan dengan menerapkan algoritma yang lebih baik, tetapi juga Anda tidak akan dapat menyelesaikannya.
Jadi, sementara Anda hampir tidak pernah membutuhkan keterampilan ini, ia menyajikan satu titik kegagalan dalam metodologi pengembangan Anda dan jika Anda tidak memiliki keterampilan ini, Anda hanya bisa berharap bahwa kebutuhan itu tidak pernah muncul, atau bahwa orang lain melompat untuk memperbaikinya. kamu.

Apa yang benar-benar penting adalah untuk mendapatkan perasaan untuk kompleksitas komputasi dan bagaimana menjaganya agar tetap rendah, seperti yang saya jelaskan juga dalam menanggapi pertanyaan serupa . Atau untuk berspesialisasi dalam hal-hal di mana ini tidak penting, seperti pengembangan GUI, tetapi sekali lagi hampir semua orang membencinya ... karena suatu alasan!


5
+1 untuk jawaban yang sangat komprehensif dan cerdas. Juga, menyedihkan betapa efektifnya filter FizzBuzz. Sama sekali tidak ada alasan untuk tidak bisa melakukannya.
Adam Crossland

4
Saya pikir Anda harus mencetak fizzbuzzjika nomornya dapat dibagi oleh keduanya dan banyak yang tergelincir karena Anda perlu memesan modulo cek dengan hati-hati.
Matthieu M.

1
1% mungkin agak terlalu tinggi
rami

1
@ MatthieuM .: pencetakan keduanya tidak dapat dipisahkan dari bagaimana persyaratannya diungkapkan. Kehilangan itu, berarti Anda tidak memeriksa persyaratan dengan cermat; sekarang, yang menurut saya menarik adalah ia tidak mengatakan Anda harus mencetaknya dalam urutan tertentu, atau bahkan secara konsisten dalam urutan yang sama ...
jmoreno

1
@ back2dos: yeah, tetapi melakukannya dalam urutan acak kedengarannya lebih menyenangkan ... perhatikan bahwa persyaratan yang diberikan dalam jawaban ini tidak menyebutkan baris, hanya mencetak . Jika Anda diberi tes FizzBuzz, mungkin ada gunanya untuk menunjukkan bahwa ada banyak asumsi tidak tertulis di dalamnya (sekali lagi, itu mungkin hanya membuat Anda dicat sebagai wiski).
jmoreno

30

Secara umum, pemrograman sebagai pekerjaan bukan tentang algoritma. Anda dapat menghabiskan waktu bertahun-tahun memrogram aplikasi CRUD tanpa memerlukan keterampilan algoritmik yang mendalam.

Memprogram sebagai pekerjaan adalah tentang:

  1. Komunikasi:

    • Kode sumber Anda adalah sarana untuk mengkomunikasikan ide-ide Anda kepada rekan-rekan Anda. Jika tidak ada yang bisa membaca / memahami kode Anda, itu tidak berharga.

    • Pengembang tunggal yang tidak berbicara dengan pengembang lain mungkin akan mulai melakukan kesalahan dalam kode dan percaya bahwa pendekatannya sendiri adalah satu-satunya yang dapat diterima.

    • Anda harus tahu cara berkomunikasi dengan pemangku kepentingan, departemen QA, pengguna, perancang visual, DBA, dll.

    • Sebagai pengembang yang berpengalaman, Anda harus mengajar kolega yang kurang berpengalaman yang ingin meningkatkan keterampilan mereka.

  2. Pengetahuan tentang alat yang tepat: kontrol versi, sistem pelacakan bug, IDE, bahasa mana yang lebih cocok untuk tugas tertentu dan mengapa, bagaimana menggunakan analisis kode, dll.

  3. Pengetahuan dan budaya yang luas: apa itu bahasa fungsional? Bagaimana komputer mengartikan kode? Mengapa LOC adalah ukuran yang tidak berarti? dll.

  4. Pengetahuan mendalam tentang bahasa yang Anda gunakan.

  5. Algoritma.

Ilmu Komputer, di sisi lain, lebih berorientasi pada algoritma. Jika Anda bekerja sebagai ilmuwan, ini mungkin tidak ada hubungannya dengan pekerjaan pengembang, dan Anda akan bekerja lebih banyak tentang cara mengoptimalkan algoritma, cara mengubah representasi data menjadi yang lain, dll.


12
-1: "Aplikasi CRUD" adalah algoritma. Mereka hanya (umumnya) sederhana. Tidak ada "makna mulia".
S.Lott

2
dan kode sumber adalah satu-satunya saluran komunikasi Anda ke komputer yang melakukan persis apa yang Anda suruh (dan hampir tidak pernah seperti yang Anda inginkan)
ratchet freak

5
Sungguh menakjubkan betapa bagusnya pasar untuk membersihkan aplikasi CRUDdy yang tim tekniknya mengabaikan (atau tidak pernah belajar) dasar-dasar algoritma.
JasonTrue

2
@ S.Lott: "Aplikasi CRUD adalah algoritma" analog dengan "I am America". ;)
Jim G.

1
@ Jimg: Seperti Steven Colbert mengatakan "Saya adalah Amerika dan Anda juga bisa". Aplikasi CRUD berisi, didasarkan pada, termasuk, adalah implementasi, realisasi, mewujudkan, mencerminkan algoritma. Anda hanya mengeluh, tanpa menyarankan preposisi tertentu. Mana yang akan membuat Anda lebih bahagia?
S.Lott

16

Saya pikir pertanyaan tentang algoritme dalam wawancara adalah salah satu cara utama perusahaan mencoba menilai pemahaman calon terhadap dasar-dasar ilmu komputer. Meskipun ini bukan satu-satunya bidang keterampilan yang penting bagi seorang programmer profesional, ini adalah salah satu kompetensi inti dari seorang programmer yang baik.

Saya pikir alasan banyak perusahaan besar menekankan fundamental CS dalam proses wawancara mereka, adalah bahwa itu adalah keterampilan inti yang dikembangkan paling tidak setelah lulus dan masuk ke dunia kerja. Kemampuan pemrograman praktis, keterampilan desain, praktik rekayasa perangkat lunak, dan sejenisnya adalah semua hal yang terutama dikembangkan melalui pengalaman, sedangkan fundamental CS Anda terutama dikembangkan dalam perjalanan pendidikan Anda.

Adapun cara mempraktekkan desain algoritma, Steve Yegge merekomendasikan Skiena's The Algorithm Design Manual dalam panduannya yang sangat bagus untuk wawancara sebagai seorang programmer .


4
+1: bahasa pemrograman, kerangka kerja, sistem operasi, editor, perkakas, semuanya datang-dan-pergi, tetapi mengetahui bagaimana menyelesaikan masalah secara efektif ada hubungannya dengan mengetahui dasar-dasar struktur data dan algoritma. Hal-hal ini selalu bersama kita.
Adam Crossland

"Mengenai cara mempraktikkan desain algoritma, Steve Yegge merekomendasikan Skiena's The Algorithm Design Manual dalam panduannya yang sangat bagus untuk wawancara sebagai seorang programmer." Maaf, tetapi ini mungkin tidak berlaku untuk orang yang mengajukan pertanyaan ini karena ia adalah seorang mahasiswa pascasarjana. Google / MS telah pindah dari Skiena (untuk mahasiswa pascasarjana), untuk mengajukan pertanyaan yang telah muncul dalam kompetisi pemrograman perguruan tinggi internasional. (Ini saya tahu pasti dari pengalaman anekdot). Buku Skiena masih digunakan - tetapi terutama untuk kandidat tingkat sarjana.
user396089

Adapun pertanyaan yang muncul dalam kompetisi pemrograman - Anda cukup banyak disembunyikan jika Anda belum melihat pertanyaan sebelumnya (kecuali IQ Anda kebetulan 3 SD jauhnya dari normal)
user396089

11

Sebagai pengembang perangkat lunak yang sukses yang belajar sendiri dan hanya mengambil beberapa mata kuliah ilmu komputer di perguruan tinggi, saya akan mengatakan bahwa masalah terbesar yang dihadapi bisnis saat ini bukanlah kemampuan semua pemrogram mereka untuk menulis algoritme semacam gelembung dengan cara yang paling efisien mungkin. Masalah sebenarnya yang dihadapi bisnis:

  • Pengembang yang tidak dapat dengan cepat belajar dan beradaptasi dengan domain baru

  • Pengembang yang tidak dapat berinteraksi secara sosial dengan klien atau pemangku kepentingan dengan cara yang berarti

  • Pengembang yang tidak dapat menebak dan mempertanyakan persyaratan bisnis yang salah atau buruk

  • Pengembang yang tidak mengerti cara menguji kode dan fitur mereka secara menyeluruh

  • Pengembang yang tidak dapat memberikan perkiraan yang berarti secara tepat waktu

  • Pengembang yang tidak dapat membuat dokumentasi yang jelas dan ringkas

  • Pengembang yang tidak dapat memulai sendiri atau bertanggung jawab atas suatu situasi

Sembilan dari sepuluh saya akan bertaruh bahwa hampir semua keadaan di mana pengembang mengalami kesulitan dalam sebuah perusahaan adalah karena mereka gagal dalam salah satu kualitas di atas. Lupakan Google dan Facebook, mereka adalah perkecualian dan memiliki kebutuhan yang sah bagi orang-orang yang sangat memahami ilmu komputer.

Meskipun bisnis nyata tidak berjuang dengan kompleksitas ilmu komputer, mereka berjuang dengan kompleksitas kemanusiaan. Masalahnya adalah SANGAT sulit untuk menguji kualitas yang disebutkan di atas. Sebagian besar waktu Anda harus menilai orang berdasarkan kualitas-kualitas ini berdasarkan reaksi Anda. Itu sulit jika Anda tidak memiliki keterampilan dan intuisi orang baik, jauh lebih mudah untuk menguji pengetahuan algoritma.


+1 Perusahaan reguler dan non-google-like-freakish membutuhkan orang dengan keterampilan bisnis yang baik, dan terutama dalam memahami cara menemukan / menerapkan / mengelola / memodifikasi proses. Bukan kesalahan bahwa perusahaan seperti Google tidak menetas gerakan Agile, karena ilmu komputer bukan tentang menyelesaikan masalah bisnis.
S.Robins

10

Saya pribadi melihat "standar" algoritma dan struktur data sebagai bagian dari kosa kata seorang programmer. Dan banyak masalah praktis yang Anda hadapi sebagai programmer sering memiliki solusi yang (setidaknya sebagian) dapat diekspresikan dalam kosa kata ini.

Memiliki kosa kata ini sesuai keinginan Anda mencegah Anda dari harus datang dengan "sendiri" solusi Anda (menciptakan kembali roda untuk mengatakan), memungkinkan Anda untuk bekerja lebih cerdas dan sering lebih cepat.

"Sepertinya saya tidak tertarik untuk menyelesaikan masalah yang tampaknya terlalu rumit yang ditemukan di sebagian besar buku pelajaran atau situs web"

"Aku merasa sangat sulit untuk mengingat dan menggunakannya kembali nanti"

Paksa diri Anda untuk menyelesaikannya. Anda akan berterima kasih pada diri sendiri nanti. Bahkan jika Anda tidak mengingatnya dengan detail penuh (walaupun dengan latihan yang cukup Anda tentu akan), untuk dapat mengatakan "Saya ingat memecahkan sesuatu yang serupa menggunakan algoritma X atau datastructure Y" akan sangat membantu Anda. Bahkan jika itu mengharuskan Anda untuk mencari rincian dan menyegarkan ingatan Anda.


+1 untuk struktur data. Mereka adalah bagian lain dari koin algoritmik.
Spencer Rathbun

9

Meskipun Anda tidak bisa menjadi programmer yang baik tanpa mengetahui algoritma Anda, itu tidak adil untuk menjaga aspek-aspek lain dari profesi pemrograman dari gambar. Misalnya, disiplin yang ketat dan perintah yang baik dari bahasa ibu Anda setidaknya sama pentingnya dengan menjadi programmer yang baik seperti pengetahuan Anda tentang algoritma. Orang juga seharusnya tidak meremehkan pentingnya memahami alat dasar Anda, seperti bahasa pemrograman, sistem kontrol sumber, lingkungan pengujian, dan lain-lain.

Namun, ketika datang ke wawancara, mengukur pemahaman Anda tentang algoritma jauh lebih sederhana daripada mengukur kemampuan Anda yang lain terkait dengan bekerja sebagai programmer. Itulah mengapa pewawancara sering berkonsentrasi pada bertanya tentang algoritma, dan memperhatikan cara Anda menjelaskannya selama wawancara. Bukan karena hal-hal lain kurang penting, tetapi karena sulit untuk menilai hal-hal lain dalam 30 menit yang dialokasikan untuk wawancara.


1
+1 Jawaban sempurna! Lebih mudah untuk menguji pengetahuan algoritma.
maple_shaft

"algoritme Anda" - Saya belajar sendiri. Apakah ada sumber atau daftar di suatu tempat yang menyatakan apa algoritma umum yang harus diketahui oleh setiap programmer? Saya ingin membacanya. Terima kasih!
Ominus

2
@Ominus Meskipun tidak ada konsensus umum tentang "daftar pria" algoritma, dalam kebanyakan kasus itu akan mencakup pencarian, pengurutan, melintasi struktur data yang tidak memiliki kontinuitas ruang (daftar terkait, pohon biner, dll.), Dan rudimenter (salah) aplikasi rekursi (faktorial rekursif, urutan Fibonacci, dll.)
dasblinkenlight

@Minus - Saya juga otodidak tapi saya pikir "Pengantar Algoritma" - CLRS adalah cara yang baik untuk membiasakan diri dengan bidang. Buku Skiena "The Algorithm Design Manual" juga bagus.
Tod

5

Ya, pemrograman sebagian besar tentang algoritma.

Tapi mungkin tidak dalam arti yang Anda pikirkan.

Saya mendapat kesan kita semua menggunakan definisi algoritma yang berbeda. Sejujurnya, pertanyaan ini sulit dijawab karena algoritma adalah istilah yang tidak jelas. Saya akan menggunakan definisi Wikipedia untuk menjawab pertanyaan ini:

Seperangkat aturan yang secara tepat mendefinisikan urutan operasi.

Inilah jantung dan jiwa pemrograman. Ketika Anda menulis kode apa pun , Anda hanya mengimplementasikan suatu algoritma. Jika Anda menulis beberapa aplikasi CRUD, Anda menerapkan algoritma sederhana. Mampu memunculkan algoritma untuk memecahkan masalah adalah apa itu pemrograman. Sisanya hanya detail.

Saya tidak setuju dengan poster sebelumnya yang mengatakan memiliki pemahaman yang mendalam tentang suatu bahasa lebih penting daripada memahami algoritma. Setiap programmer yang baik harus dapat mempelajari bahasa secara mendalam, tetapi tanpa algoritma, Anda tidak dapat membuat kode sendiri.


Dari perspektif lain, dalam Matematika hati dan jiwa mungkin merupakan algoritma, namun untuk Pemrograman itu adalah sesuatu yang lain. Anda dapat menulis perangkat lunak tanpa memerlukan algoritma per se (mungkin bukan perangkat lunak yang baik), tetapi Anda tidak dapat menulis perangkat lunak tanpa logika, dan pemikiran abstrak. Pada itu hati Namun, ini tentang pemecahan masalah. Menemukan solusi adalah proses algoritmik, namun solusi itu sendiri belum tentu merupakan algoritma.
S.Robins

4

Jawabannya sepenuhnya tergantung pada pekerjaan yang Anda kejar. Beberapa bidang secara khusus lebih terfokus pada algoritma daripada yang lain. Berbicara dengan catatan itu, saya senang mewawancarai Amazon beberapa kali. Meskipun posisinya tidak ada hubungannya dengan algoritma yang kompleks ini, saya merasa terpanggang bagaimana cara membuat tugas diamortisasi waktu konstan.

Apa yang membuktikan pemahaman yang kuat tentang algoritma menyediakan adalah bukti bagi perusahaan potensial Anda bahwa Anda adalah seorang pemecah masalah yang tepat. Ini sebenarnya bukan indikator yang baik (IMO) dari karyawan yang baik tetapi beberapa majikan menggunakan ini untuk penyaringan. Jika Anda melamar posisi yang membutuhkan gelar sarjana, Anda akan diharapkan memiliki landasan yang lebih kuat dalam algoritma.

Apa (IMO) yang sangat membantu dalam praktik bukan untuk menghafal algoritma tertentu tetapi melalui pemahaman bagaimana beberapa algoritma bekerja ada nugget kecil di belakang pikiran Anda di mana Anda akan mengatakan "Saya telah melihat ini sebelumnya" atau "Saya tahu saya dapat melakukan ini dengan lebih baik "yang akan menelurkan sedikit riset tentang solusi untuk masalah Anda.


+1 untuk berbicara tentang bar perekrutan untuk mahasiswa pascasarjana. Beberapa perusahaan jauh lebih sibuk ketika mempekerjakan mahasiswa pascasarjana daripada sarjana. Tetapi agar adil bagi mereka, mahasiswa pascasarjana juga dibayar lebih baik, dan biasanya direkrut di tingkat yang lebih tinggi secara internal.
user396089

1

Saya selalu berpikir pemrograman lebih didorong oleh data daripada algoritma .. tapi kemudian, apa gunanya data jika Anda tidak melakukan sesuatu untuk itu ... semua manipulasi itu adalah algoritma. Jadi sebenarnya, ya, pemrograman hampir seluruhnya berbasis algoritma.

Ini mungkin tidak terlihat seperti matematika, dan banyak pekerjaan algoritmik yang akan Anda lakukan sehari-hari adalah hal-hal yang sangat sederhana seperti mengirim data antara GUI dan program, tetapi itu juga dianggap sebagai algoritma. Memasukkan elemen dalam listbox adalah algoritma insert standar yang dilengkapi dengan masalahnya sendiri seperti kinerja dan manipulasi struktur daftar.


1

Hanya pemrogram yang bekerja untuk perusahaan-perusahaan yang benar-benar dapat menjawab pertanyaan Anda. Jenis-jenis algoritma yang dibahas dalam mengatakan "Pengantar Algoritma" mungkin telah memainkan bagian dalam 0,01% dari kehidupan pemrograman saya selama 25 tahun terakhir. Ketika saya membutuhkan struktur data atau semacam biasanya perpustakaan atau kerangka kerja yang disediakan memiliki apa yang saya butuhkan. Ketika saya membutuhkan FFT super cepat saya menemukan sesuatu seperti lib Intel Math daripada menulis sendiri. Namun, saya bisa bagaimana apa yang mereka lakukan di Google jauh berbeda dari apa yang telah saya lakukan dalam karir saya. Buku Skiena "The Algorithm Design Manual" membuka mata karena kisah-kisah Perang yang diceritakannya. Anda bisa tahu dia menggunakan Algoritma dalam pekerjaannya BANYAK.

Dalam pengalaman saya sebagai konsultan pemrograman independen, kesuksesan berasal dari tiga hal: 1. Berkomunikasi secara efektif dengan klien 2. Menulis kode yang berfungsi. 3. Mengelola Kompleksitas

Melakukan angka 1 dan 2 saja tidak cukup. Jika kode tidak dapat dipelihara (oleh orang lain selain programmer yang menulisnya, itu akan hancur.

Nomor 3 adalah keterampilan pemrograman yang paling sulit untuk dikuasai. Itu membutuhkan pemikiran untuk dimasukkan ke dalam arsitektur, desain dan pengkodean. Itu membutuhkan penguasaan refactoring. Ini membutuhkan pemahaman tentang prinsip-prinsip SOLID / KERING. Jika saya harus menyewa seorang programmer yang telah membaca Intro untuk Algoritma dan mendedikasikan dirinya untuk menguasainya atau yang membaca The Pragmatic Programmer dan mendedikasikan dirinya untuk menjadi seorang, saya akan mempekerjakan yang terakhir setiap kali. (Bukan berarti mereka harus saling eksklusif).


1

Iya nih.

Ilmu Komputer kebanyakan algoritma (berdasarkan persentase).

Tidak.

Tapi itu adalah "Sains" komputer. Aplikasi paling umum dari Ilmu Komputer adalah Rekayasa Perangkat Lunak. Rekayasa Perangkat Lunak bukan terutama algoritma. Ini terutama tentang seni menciptakan, mengejar kesempurnaan, dan berpusat positif mempengaruhi kehidupan orang-orang nyata yang ada saat ini. Sementara Ilmu Komputer dapat berbagi beberapa motivasi yang sama, itu jauh dari Rekayasa Perangkat Lunak.

Tanyakan kepada seorang profesor tetap di Universitas Ilmu Komputer besar apa hal paling kritis untuk dipahami tentang pemrograman, dan mereka kemungkinan akan memberi tahu Anda "algoritma dan struktur data"

Tanyakan kepada pengembang senior di perusahaan perangkat lunak utama apa hal yang paling penting untuk dipahami tentang pemrograman, dan mereka mungkin akan memberi tahu Anda, "belajar untuk menyenangkan pelanggan" (tersirat dalam pengertian tangkas, berpikir seperti pelanggan, pengiriman tepat waktu dan terus menerus, membuat hal-hal yang berfungsi , dll)

Mungkin tampak seperti semantik, tetapi dari pemahaman saya keduanya sangat berbeda baik dalam praktik maupun teori.


1

Jika saya harus memilih satu hal dalam ilmu komputer sebagai bagian terpenting darinya, saya akan memilih abstraksi , bukan algoritma.


1

Dalam Ilmu Komputer konsep apa yang Anda pelajari tidak akan berguna sampai Anda menunjukkannya. Masalahnya adalah masalah utama yang perlu dipecahkan sehingga algoritma adalah perencanaan singkat tentang bagaimana masalah akan diselesaikan secara umum. Oleh karena itu menjadi perhatian utama di dunia Ilmu Komputer.

Saya pikir hampir setiap aspek dari Ilmu Komputer membutuhkan Algoritma. Mari saya tunjukkan ini. Daftar berikut akan mencakup berbagai bidang Ilmu Komputer dan algoritma mana yang mereka gunakan.

Automata

Konstruksi powerset. Algoritma untuk mengkonversi otomat non-deterministik menjadi otomat deterministik. Algoritma Todd-Coxeter. Prosedur untuk menghasilkan cosets.

Kecerdasan buatan

Alfa-beta. Alpha max plus beta min. Banyak digunakan dalam permainan papan. Algoritma semut. Optimalisasi koloni semut adalah seperangkat algoritma yang terinspirasi oleh perilaku semut untuk menyelesaikan masalah, menemukan jalur terbaik antara dua lokasi. DE (Evolusi diferensial). Memecahkan masalah pemasangan polinomial Chebyshev. Pengakuan Semi-diawasi atas Kalimat Sarkastik di Ulasan Produk Online. Algortithm yang mengenali sacarsms atau ironi dalam tweet atau dokumen online. Algoritma seperti itu akan sangat penting untuk pemrograman robot humanoid juga.

Visi komputer

Lambang. Mewakili gambar atau video dengan yang lebih kecil. Menghitung objek dalam suatu gambar . Menggunakan algoritma pelabelan komponen yang terhubung untuk memberi label pertama pada setiap objek, dan menghitung kemudian objek. Algoritma O'Carroll. Dari konversi matematis dari penglihatan serangga, algoritma ini mengevaluasi bagaimana cara menghindari benda.

Algoritma genetika

Mereka menggunakan tiga operator. seleksi (pilih solusi), reproduksi (gunakan solusi terpilih untuk membangun yang lain), penggantian (ganti solusi jika lebih baik).

Seleksi proporsional kebugaran. Juga dikenal sebagai pemilihan roda roulette, adalah fungsi yang digunakan untuk memilih solusi. Pilihan pemotongan. Metode lain untuk memilih solusi, dipesan oleh kebugaran. Pilihan turnamen. Pilih solusi terbaik berdasarkan jenis turnamen. Pengambilan sampel stokastik universal. Individu dipetakan ke segmen yang berdekatan dari sebuah garis, sehingga segmen masing-masing individu memiliki ukuran yang sama dengan kebugarannya persis seperti dalam pemilihan roda roulette.

Jaringan saraf

Hopfield net. Jaringan saraf tiruan berulang yang berfungsi sebagai sistem memori yang dapat dialamati konten dengan unit ambang biner. Mereka bertemu ke kondisi stabil. Backpropagation. Teknik pembelajaran terawasi digunakan untuk pelatihan jaringan saraf tiruan. Peta yang dikelola sendiri (peta Kohonen). Jaringan saraf dilatih menggunakan pembelajaran tanpa pengawasan untuk menghasilkan representasi dimensi rendah (2D, 3D) dari sampel pelatihan. Baik untuk memvisualisasikan data dimensi tinggi.

Bioinformatika

Needleman-Wunsch. Melakukan penyelarasan global pada dua sekuens, untuk sekuens protein atau nukleotida. Smith-Waterman. Variasi dari Needleman-Wunsch.

Kompresi

Algoritma kompresi lossless

Transformasi Burrows-Wheeler. Preprocessing bermanfaat untuk meningkatkan kompresi lossless. Menurunkan. Kompresi data digunakan oleh ZIP. Pengkodean Delta. Bantuan untuk kompresi data di mana data berurutan sering terjadi. Pengkodean tambahan. Pengkodean Delta diterapkan pada urutan string. LZW. (Lempel-Ziv-Welch). Penerus LZ78. Membuat tabel terjemahan dari data ke kompres. Digunakan oleh format grafis GIF. LZ77 dan 78. Dasar variasi LZ lebih lanjut (LZW, LZSS, ...). Keduanya adalah kamus kode. LZMA. Singkatan dari Lempel-Ziv-Markov chain-Algorithm. LZO. Algoritma kompresi data yang difokuskan pada kecepatan. PPM(Prediksi oleh Pencocokan Parsial). Teknik kompresi data statistik adaptif berdasarkan pemodelan konteks dan prediksi. Pengkodean Shannon-Fano. Membangun kode awalan berdasarkan pada serangkaian simbol dan probabilitasnya. Biner terpotong. Pengkodean entropi biasanya digunakan untuk distribusi probabilitas yang seragam dengan alfabet terbatas. Tingkatkan penyandian biner. Pengodean run-length. Kompresi primer yang menggantikan urutan kode yang sama dengan jumlah kejadian. Sequitur. Inferensi tata bahasa tambahan pada string. EZW (Embedded Zerotree Wavelet). Pengkodean progresif untuk mengompres gambar ke dalam aliran bit dengan akurasi yang meningkat. Mungkin kompresi lossy juga dengan hasil yang lebih baik.

Entropy encoding Skema pengkodean yang memberikan kode ke simbol sehingga sesuai panjang kode dengan probabilitas simbol.

Coding Huffman. Kompresi lossless sederhana mengambil keuntungan dari frekuensi karakter relatif. Pengkodean Huffman Adaptif. Teknik pengkodean adaptif berdasarkan pengkodean Huffman. Pengkodean aritmatika. Pengodean entropi tingkat lanjut. Pengkodean rentang. Sama seperti pengkodean aritmatika, tetapi memandangnya dengan cara yang sedikit berbeda. Pengodean unary. Kode yang mewakili angka n dengan n yang diikuti oleh nol. Elias delta, gamma, coding omega. Kode universal yang mengkodekan bilangan bulat positif. Fibonacci coding. Kode universal yang mengkodekan bilangan bulat positif ke dalam kata-kata kode biner. Coding Golomb. Bentuk pengkodean entropi yang optimal untuk huruf berikut distribusi geometris. Coding beras. Bentuk pengkodean entropi yang optimal untuk huruf berikut distribusi geometris.

Algoritma kompresi lossy

Pengkodean prediktif linier. Kompresi lossy dengan merepresentasikan amplop spektral sinyal digital ucapan dalam bentuk terkompresi. Algoritma A-law. Algoritma kompanding standar. Algoritma mu-law. Kompresi sinyal analog standar atau algoritma kompanding. Kompresi fraktal. Metode yang digunakan untuk mengompres gambar menggunakan fraktal. Ubah pengkodean. Jenis kompresi data untuk data seperti sinyal audio atau gambar foto. Kuantisasi vektor. Teknik yang sering digunakan dalam kompresi data lossy. Kompresi wavelet. Bentuk kompresi data sangat cocok untuk kompresi gambar dan audio.

Kriptografi

Kunci rahasia (enkripsi simetris)

Gunakan kunci rahasia (atau sepasang kunci yang terkait langsung) untuk dekripsi dan enkripsi.

Advanced Encryption Standard (AES) , juga dikenal sebagai Rijndael. Blowfish. Dirancang oleh Schneier sebagai algoritma tujuan umum, dimaksudkan sebagai pengganti DE yang menua. Standar Enkripsi Data (DES) , sebelumnya DE Algoritma. IDEA (Algoritma Enkripsi Data Internasional) . Sebelumnya IPES (Improved PES), pengganti lain untuk DES. Digunakan oleh PGP (Privasi Cukup Bagus). Melakukan transformasi pada data yang dipisah dalam blok, menggunakan kunci. RC4 atau ARC4. Stream cipher banyak digunakan dalam protokol seperti SSL untuk lalu lintas internet dan WEP untuk jaringan nirkabel. Algoritma Enkripsi Kecil. Mudah untuk mengimplementasikan algoritma cipher blok menggunakan beberapa rumus. PES (Usulkan Standar Enkripsi). Nama lama untuk IDEA.

Kunci publik (enkripsi asimetris)

Gunakan sepasang kunci, yang ditetapkan sebagai kunci publik dan kunci pribadi. Kunci publik mengenkripsi pesan, hanya kunci pribadi yang mengizinkannya mendekripsi.

DSA (Digital Signature Algorithm). Hasilkan kunci dengan bilangan prima dan acak. Dulu digunakan oleh agen AS, dan sekarang menjadi domain publik. ElGamal. Berdasarkan Diffie-Hellman, digunakan oleh perangkat lunak GNU Privacy Guard, PGP, dan sistem kriptografi lainnya. RSA (Rivest, Shamir, Adleman). Banyak digunakan dalam protokol perdagangan elektronik. Gunakan bilangan prima. Pertukaran kunci Diffie-Hellman (Merkle) (atau pertukaran kunci eksponensial). Metode dan algoritme untuk berbagi rahasia melalui saluran komunikasi yang tidak dilindungi. Digunakan oleh RSA. NTRUEcrypt. Manfaatkan cincin polinomial dengan perkalian konvolusi.

Fungsi intisari pesan

Intisari pesan adalah kode yang dihasilkan dari enkripsi string atau data dengan panjang berapa pun, diproses oleh fungsi hash.

MD5. Digunakan untuk memeriksa gambar ISO dari CD atau DVD. RIPEMD (Intisari Intestasi Pesan Evaluasi Primitif Integritas RACE). Berdasarkan prinsip-prinsip MD4 dan mirip dengan SHA-1. SHA-1 (Algoritma Secure Hash 1). Paling sering digunakan dari SHA set fungsi hash kriptografi terkait. Dirancang oleh agen NSA. HMAC. otentikasi pesan hash-kunci. Tiger (TTH). Biasanya digunakan dalam hash pohon harimau.

Kriptografi menggunakan angka pseudo-acak Lihat. Generator Angka Acak

Teknik dalam kriptografi

Berbagi rahasia, Pemisahan Rahasia, Pemisahan Kunci, algoritma M of N.

Skema berbagi rahasia Shamir. Ini adalah formula berdasarkan interpolasi polinomial. Skema berbagi rahasia Blakley. Apakah sifatnya geometris, rahasianya adalah titik dalam ruang m-dimensional.

Teknik dan dekripsi lainnya

Jumlah bagian Diberikan satu set bilangan bulat, apakah ada jumlah bagian yang sama dengan nol? Digunakan dalam kriptografi. Algoritma Shor. Algoritme kuantum dapat mendekripsi kode berdasarkan fungsi asimetris seperti RSA.

Geometri

Bungkus kado. Menentukan lambung cembung satu set poin. Jarak Gilbert-Johnson-Keerthi. Menentukan jarak terkecil antara dua bentuk cembung. Graham memindai. Menentukan lambung cembung satu set poin di pesawat. Persimpangan segmen garis. Menemukan apakah garis berpotongan dengan algoritma garis sapuan. Titik dalam poligon. Menguji apakah suatu titik terletak di dalam yang diberikan. Persimpangan Ray / Pesawat. * Persimpangan Line / Triangle. * Persimpangan khusus dari Ray / Plane. Poligonisasi permukaan implisit. Perkiraan permukaan implisit dengan representasi poligonal. Triangulasi.Metode untuk mengevaluasi jarak ke titik dari sudut ke titik lain, yang jaraknya diketahui.

Grafik Teknologi Pelacak Permukaan 3D. Proses untuk menambahkan gambar di dinding dalam video sementara permukaan yang tersembunyi diperhitungkan. Bellman-Ford. Menghitung jalur terpendek dalam grafik berbobot (di mana beberapa bobot tepi mungkin negatif). Algoritma Dijkstra. Menghitung jalur terpendek dalam grafik dengan bobot tepi non-negatif. Metode perturbasi. Algoritma yang menghitung jalur terpendek lokal dalam grafik. Floyd-Warshall. Memecahkan masalah semua pasangan jalur terpendek dalam grafik tertimbang yang diarahkan. Pencarian siklus Floyd. Menemukan siklus di iterasi. Johnson. Algoritma jalur terpendek semua pasangan dalam grafik berarah jarang. Kruskal.Menemukan pohon rentang minimum untuk grafik. Prim. Menemukan pohon rentang minimum untuk grafik. Juga disebut algoritma DJP, Jarník atau Prim – Jarník. * Boruvka. * Menemukan pohon rentang minimum untuk grafik. Ford-Fulkerson. Menghitung aliran maksimum dalam grafik. Edmonds-Karp. Implementasi Ford-Fulkerson. Switch Spanning Minimal Nonblocking. Untuk pertukaran telepon. Woodhouse-Sharp. Menemukan pohon rentang minimum untuk grafik. Berbasis musim semi. Algoritma untuk menggambar grafik. Hongaria. Algoritma untuk menemukan pasangan yang cocok. Algoritma pewarnaan. Algoritma pewarnaan grafik. Tetangga terdekat.Temukan tetangga terdekat. Jenis topologi. Urutkan grafik asiklik terarah sedemikian rupa sehingga setiap node muncul sebelum semua node yang memiliki tepi (sesuai dengan arah). Algoritma nenek moyang paling umum yang tidak umum dari Tarjan. Hitung leluhur umum terendah untuk pasang node di pohon.

Grafik

Algoritma garis Bresenham. Menggunakan variabel keputusan untuk memplot garis lurus antara 2 titik yang ditentukan. Lansekap Gambar pemandangan 3D. * Algoritma garis DDA. * Menggunakan matematika titik-mengambang untuk memplot garis lurus antara 2 titik yang ditentukan. Isi banjir. Mengisi wilayah yang terhubung dengan warna. Pemulihan Gambar. Kembalikan foto, tingkatkan gambar. Algoritma garis Xiaolin Wu. Antialiasing garis. Algoritma Painter. Mendeteksi bagian yang terlihat dari pemandangan 3 dimensi. Ray tracing. Render gambar yang realistis. Phong shading. Model iluminasi dan metode interpolasi dalam grafik komputer 3D. Gouraud shading.Mensimulasikan efek cahaya dan warna yang berbeda di seluruh permukaan objek 3D. Render pemindaian. Buat gambar dengan memindahkan garis imajiner. Penerangan global. Mempertimbangkan penerangan dan refleksi langsung dari objek lain. Interpolasi. Membangun titik data baru seperti zoom digital. Resintesis. Hapus objek pada foto dan bangun kembali latar yang Digunakan oleh Photoshop dan The Gimp. Tutorial resynthesizer. Algoritme mencegat-lereng. Ini adalah implementasi dari rumus slope-intercept untuk menggambar garis. Interpolasi spline. Mengurangi kesalahan dengan fenomena Runge. Teknologi Pelacak Permukaan 3D. Menambahkan gambar atau video di dinding dalam video, permukaan yang tersembunyi dipertimbangkan.

Daftar, susunan, dan pohon

Mencari

Pencarian kamus. Lihat pencarian prediktif. Algoritma seleksi. Menemukan item terbesar ke-10 dalam daftar. Algoritma pencarian biner. Temukan item dalam daftar yang disortir. Pencarian luas pertama. Melintasi level grafik per level. Kedalaman-pencarian pertama. Melintasi cabang grafik menurut cabang. Pencarian terbaik-pertama. Melintasi grafik dalam urutan yang mungkin penting menggunakan antrian prioritas. Sebuah pohon pencarian. * Kasus khusus dari pencari terbaik-pertama yang menggunakan heuristik untuk meningkatkan kecepatan. Pencarian seragam biaya. Pencarian pohon yang menemukan rute biaya terendah di mana biaya bervariasi. Pencarian prediktif.Biner seperti pencarian yang merupakan faktor dalam besarnya istilah pencarian versus nilai tinggi dan rendah dalam pencarian. Meja hash. Kaitkan kunci ke item dalam koleksi yang tidak disortir, untuk mengambilnya dalam waktu linier. Pencarian terinterpolasi. Lihat pencarian prediktif.

Penyortiran

Jenis pohon biner. Semacam pohon biner, tambahan, mirip dengan jenis penyisipan. Bogosort. Jenis kartu meja yang acak dan tidak efisien. Semacam gelembung. Untuk setiap pasangan indeks, tukar item jika rusak. Semacam ember. Membagi daftar dalam ember dan mengurutkannya secara individual. Menggeneralisasi semacam pigeonhole. Sortir koktail (atau dua arah gelembung, shaker, riak, antar-jemput, semacam happy hour). Variasi jenis gelembung yang mengurutkan di kedua arah masing-masing melewati daftar. Semacam sisir. Variasi efisien dari semacam gelembung yang menghilangkan "kura-kura", nilai-nilai kecil di dekat akhir daftar dan memanfaatkan celah antara nilai-nilai. Jenis penghitungan.Ini menggunakan rentang angka dalam daftar A untuk membuat larik B dengan panjang ini. Indeks dalam B digunakan untuk menghitung berapa banyak elemen dalam A yang memiliki nilai kurang dari i. Semacam Gnome. Mirip dengan jenis penyisipan kecuali bahwa memindahkan elemen ke tempat yang tepat dilakukan dengan serangkaian swap, seperti dalam bubble sort. Heapsort. Konversikan daftar menjadi tumpukan, terus menghapus elemen terbesar dari tumpukan dan menambahkannya ke akhir daftar. Jenis penyisipan. Tentukan di mana item saat ini berada dalam daftar yang diurutkan, dan masukkan di sana. Introsort. Atau semacam introspektif. Itu dimulai dalam quicksort dan beralih ke heapsort pada tingkat rekursi tertentu. Gabungkan semacam.Urutkan bagian pertama dan kedua dari daftar secara terpisah, lalu gabungkan daftar yang diurutkan. Semacam pancake. Membalikkan elemen beberapa awalan suatu urutan. Pigeonhole sort. Isi array kosong dengan semua elemen array yang akan diurutkan, secara berurutan. Semacam tukang pos. Varian hierarki jenis bucket, digunakan oleh kantor pos. Quicksort. Bagilah daftar menjadi dua, dengan semua item pada daftar pertama datang sebelum semua item pada daftar kedua .; lalu urutkan dua daftar. Seringkali metode pilihan. Jenis radix. Mengurutkan kunci yang terkait dengan item, atau bilangan bulat dengan memproses digit. Sortir seleksi. Pilih elemen terkecil dari yang tersisa, tambahkan ke akhir daftar yang diurutkan. Semacam shell.Meningkatkan penyisipan sortir dengan menggunakan celah antar nilai. Smoothsort. Lihat heapsort. Stochastic sort. Lihat bogosort.

dan masih banyak lagi...


0

Anda telah mengajukan dua pertanyaan di tajuk pertanyaan, jadi saya akan menjawab keduanya.

Ya, Ilmu Komputer adalah semua tentang algoritma. Yah ... sebenarnya itu agak menyesatkan karena ada banyak aspek dalam ilmu komputer, jadi saya akan ulangi. Ilmu komputer seperti yang diterapkan di dunia kerja didominasi tentang algoritma. Perusahaan seperti Google, Facebook, dan semua tempat-tempat gila di Wall Street yang mempekerjakan fisikawan dan Pengembang ingin masalah yang sangat kompleks direduksi menjadi bentuk sederhana, yang dengan sendirinya membutuhkan pemahaman yang mendalam tentang matematika, dan desain algoritma.

Tidak, Pemrograman tidak semua tentang algoritma. Pemrograman adalah tentang mengambil spesifikasi dan mengubahnya menjadi kode yang dapat dikompilasi untuk dieksekusi.

Bagian tambahan dari jawabannya: Pengembangan Perangkat Lunak bukan pemrograman, namun banyak yang kelihatannya membingungkan istilah dan menggunakannya secara bergantian. Pemrograman hanyalah fungsi atau teknik mungkin dari proses Pengembangan Perangkat Lunak yang lebih besar. Pengembangan Perangkat Lunak tentu tidak semua tentang algoritma, ini tentang menyelesaikan masalah dengan perangkat lunak, dan menerapkan proses bisnis yang kompatibel untuk memungkinkan masalah diselesaikan secara efisien. Sementara proses pengembangan perangkat lunak - dan bahkan pemrograman itu sendiri - mungkin merupakan proses algoritmik di alam mereka, ini tidak sama dengan tentang algoritma.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.