Saya tidak menganggapnya penting kecuali untuk mengkomunikasikan ide, dan saya bekerja di bidang yang sangat kritis terhadap kinerja (raytracing, pemrosesan gambar dan mesh, sistem partikel, mesin fisika, dll.) Dan harus merancang banyak algoritma dan struktur data berpemilik saat bekerja di R&D. Di area ini, seringkali beberapa struktur data yang sangat efisien dan algoritma dapat menghasilkan produk-produk baru yang mutakhir sementara algoritma kemarin membuat produk yang sudah usang menjadi usang, sehingga selalu ada upaya untuk melakukan hal-hal yang lebih efisien. Sebagai peringatan, saya tidak pernah menerbitkan makalah tentang algoritma yang saya buat. Semuanya milik. Jika saya melakukannya, saya akan membutuhkan bantuan ahli matematika untuk merumuskan bukti dan sebagainya.
Namun menurut saya jumlah pekerjaan komputasi per iterasi sering kali lebih menarik daripada skalabilitas algoritma kecuali jika skala algoritma benar-benar buruk. Jika seseorang datang dengan teknik canggih untuk raytracing, saya lebih tertarik pada teknik komputasi seperti bagaimana mereka mewakili dan mengakses data daripada kompleksitas algoritmik karena skalabilitas yang wajar sudah diberikan dalam skenario kompetitif dan inovatif ini. Anda tidak dapat bersaing dengan algoritma yang tidak memiliki skala.
Tentu saja jika Anda membandingkan kompleksitas kuadratik dengan linearitmik, itu perbedaan besar. Tetapi kebanyakan orang di bidang saya cukup kompeten untuk menghindari penerapan algoritma kompleksitas kuadrat pada input epik. Jadi skalabilitas seringkali sangat tersirat, dan pertanyaan yang lebih bermakna dan menarik menjadi seperti, "Apakah Anda menggunakan GPGPU? SIMD? Apakah itu berjalan secara paralel? Bagaimana Anda mewakili data? Apakah Anda mengatur ulang untuk pola akses yang ramah terhadap cache? Bagaimana banyak memori yang dibutuhkan? Bisakah menangani kasus ini dengan kuat? Apakah Anda menunda pemrosesan tertentu atau melakukan semuanya sekaligus? "
Bahkan algoritma linearithmic dapat mengungguli algoritma linear-waktu jika yang pertama mengakses memori dalam pola yang lebih optimal, misalnya, atau lebih cocok untuk multithreading dan / atau SIMD. Kadang-kadang bahkan suatu algoritma linier dapat mengungguli algoritma logaritmik untuk alasan-alasan ini, dan secara alami algoritma linear waktu mengungguli yang logaritmik untuk input kecil.
Jadi bagi saya yang lebih penting adalah apa yang beberapa orang sebut "optimasi mikro", seperti representasi data (tata letak memori, pola akses dengan pemisahan bidang panas / dingin, dll.), Multithreading, SIMD, dan kadang-kadang GPGPU. Di bidang di mana setiap orang sudah cukup kompeten untuk menggunakan algoritma yang layak dan mutakhir untuk semuanya dengan makalah baru yang diterbitkan sepanjang waktu, keunggulan kompetitif Anda dalam mengalahkan para penyihir algoritmik tidak berasal dari peningkatan dalam kompleksitas algoritme sehingga lebih langsung efisiensi komputasi.
Bidang saya didominasi oleh ahli matematika yang brilian tetapi tidak selalu yang tahu biaya komputasi dari apa yang mereka lakukan atau banyak trik tingkat rendah untuk mempercepat kode. Itu biasanya keunggulan saya atas mereka dalam merancang algoritma dan struktur data yang lebih cepat dan lebih ketat meskipun saya jauh lebih canggih. Saya bermain dengan apa yang disukai perangkat keras, terhadap bit dan byte dan membuat setiap iterasi pekerjaan lebih murah bahkan jika saya melakukan beberapa iterasi pekerjaan lebih daripada algoritma yang benar-benar canggih - pekerjaan dalam kasus saya secara drastis lebih murah. Kode yang saya tulis juga cenderung lebih sederhana. Jika orang berpikir versi yang dioptimalkan secara mikro dari algoritma langsung dan struktur data sulit dipahami dan dipelihara,
Sebagai contoh dasar, saya datang dengan struktur grid sederhana yang akhirnya mengungguli pohon-KD di perusahaan kami untuk deteksi tabrakan dan penghapusan titik redundan. Grid kasar saya sangat jauh kurang canggih secara algoritmik dan saya jauh lebih sedikit secara matematis dan algoritmik daripada orang yang menerapkan KD-tree dengan cara novelnya menemukan titik median, tapi saya hanya menyetel penggunaan memori grid dan pola aksesnya dan itu sudah cukup untuk mengungguli sesuatu yang jauh lebih canggih.
Keunggulan lain yang saya miliki yang memungkinkan saya bertahan di bidang yang didominasi oleh orang yang jauh lebih pintar daripada saya adalah benar-benar memahami cara kerja pengguna, karena saya menggunakan perangkat lunak yang saya kembangkan dengan cara yang sama. Itu memberi saya ide untuk algoritma yang benar-benar menyelaraskan dengan minat pengguna. Sebagai contoh dasar di sana, kebanyakan orang mencoba untuk mempercepat hal-hal seperti deteksi tabrakan menggunakan pengindeksan spasial. Saya melakukan pengamatan pembentukan karir sederhana hampir beberapa dekade yang lalu untuk model organik yang, misalnya, jika karakter meletakkan tangannya di wajahnya, struktur pengindeksan spasial ingin harus membagi node dan melakukan pembaruan mahal jika karakter lalu melepaskan tangannya dari wajahnya. Sebaliknya, jika Anda mempartisi berdasarkan data konektivitas daripada posisi titik, Anda dapat berakhir dengan struktur hierarki stabil yang memperbarui dengan sangat cepat dan tidak perlu membelah atau menyeimbangkan kembali pohon (hanya perlu memperbarui kotak pembatas setiap bingkai animasi) ... hal-hal seperti ini - algoritma anak-anak tanpa latar belakang matematika yang berat bisa muncul jika mereka hanya memahami konsep dasar, tetapi yang menghindari matematika karena mereka tidak memikirkan hal-hal dengan cara yang begitu dekat dengan cara pengguna bekerja dan terlalu banyak berpikir hanya tentang sifat-sifat geometri dan bukan bagaimana geometri biasa digunakan. Saya cukup rukun dengan bersandar lebih pada pengetahuan komputasi umum dan pengetahuan pengguna akhir daripada sihir algoritmik. Jadi, saya belum benar-benar menganggapnya penting untuk fokus pada kompleksitas algoritmik.