Matematika yang saya gunakan



Baru-baru ini, sebuah pertanyaan diajukan di sebuah forum online: berapa banyak matematika dalam permintaan di bawah kondisi seorang programmer yang sebenarnya, seberapa sering ia menggunakannya dan apa bidangnya? Dan inilah jawaban saya.

Pertama-tama, saya, seperti hampir semua programmer, menggunakan logika Boolean , dari analisis ekspresi logis untuk pernyataan bersyarat dan kriteria keluar, untuk membuat ekspresi seperti itu sejalan dengan, misalnya, hukum de Morgan . Sebagian besar pekerjaan kami berbatasan dengan kalkulus predikat orde pertama dan logika predikat lainnya dalam bentuk analisis prasyarat, invarian, dan lebih banyak lagi (walaupun sepertinya kami sedang melakukan beberapa tugas lain).

Lebih jauh, saya sering terlibat dalam analisis kompleksitas algoritma. Dimensi dataset yang sedang diproses saat ini sangat besar. Pada konferensi Teknologi 2010 , Eric Schmidt mengatakan bahwa volume data yang dibuat oleh manusia hari ini hanya dalam dua hari adalah sama dengan volume semua data yang ada di dunia pada tahun 2003. Penting bagi saya untuk dapat memproses segmen besar dari volume ini dan mendapat manfaat darinya. Dan dalam pengertian ini, memahami kompleksitas operasi spatio-temporal yang kami terapkan pada data adalah kunci untuk menentukan apakah perhitungan tertentu dimungkinkan secara prinsip. Berbeda dengan jenis analisis O atau analisis theta yang lebih tradisional , faktor konstan pada skala tersebut memiliki efek yang signifikan: faktor 2 tidak mengubah kompleksitas waktu asimptotik dari algoritma, tetapi akan memerlukan peningkatan jumlah prosesor dari 10 ribu menjadi 20 ribu, dan perbedaan dalam konsumsi sumber daya akan berwujud. Hasilnya, perhitungan menjadi lebih canggih. Contoh: dapatkah saya mengambil perhitungan linear dan menguranginya menjadi logaritmik? Apakah mungkin mengurangi konsumsi memori hingga tiga kali lipat? Dan sebagainya.

Seringkali saya perlu menghitung varian yang paling tidak menguntungkan dari batas atas, katakanlah, ukuran beberapa set data. Dalam banyak kasus, perhitungan seperti itu mungkin tidak trivial. Atau Anda mungkin perlu menganalisis beberapa rumus perulangan untuk memeriksa bagaimana perubahannya seiring dengan meningkatnya kedalaman rekursi. Untuk ini, saya, antara lain, harus mengetahui teorema dasar tentang hubungan perulangan dan bagaimana memahami prinsip-prinsip analisis seri angka . Dan itu mungkin tampak luar biasa, tetapi kadang-kadang itu berarti bahwa saya perlu menghitung integral (walaupun sebagian besar hanya integral Riemann ). Atau bisakah saya menyelesaikan hubungan rekursif dan mendapatkan sejumlah solusi yang terbatas ? Apakah saya harus menggunakan aljabar linier ? Ini mengarah ke hal-hal seperti menghasilkan fungsi , angka Stirling , perhitungan matriks . Jika Anda ingin tahu tentang apa yang termasuk dalam rangkaian konsep matematika dasar yang diperlukan untuk memahami ilmu komputer, lihat volume pertama “Seni Pemrograman” oleh Donald Knuth, atau “Matematika Beton” oleh Knut, Ronald Graham, dan Oren Patashnik.

Saya melakukan banyak perhitungan dasar dalam hal menggabungkan, menggabungkan dan mengubah data, dan kombinatorik (menghitung angka, menemukan simetri dalam dimensi yang berbeda, dan banyak lagi) membantu saya dalam hal ini. Saya pikir contoh dari bidang ini jelas.

Saya menggunakan banyak matematika diskrit , khususnya untuk mencari sistem aljabar dalam operasi pada set data besar. Apakah mungkin untuk menampilkan struktur ini atau itu dengan bantuan homomorfisme sebagai kelompok atau cincin tertentu, yang akan lebih jelas bagi saya? Apakah ada opsi dengan koneksi yang tidak terlalu ketat? Dapatkah saya menerapkan tindakan kelompok ke beberapa set untuk membuat model transformasi spekulatif yang menyederhanakan alasan? Bisakah saya mendefinisikan beberapa topologi untuk analisis data? Anda akan terkejut jika Anda tahu berapa banyak hal yang dapat dijelaskan menggunakan topologi diskrit . Dan yang bahkan lebih mengejutkan adalah permintaan akan ketimpangan segitiga .

Saya banyak bekerja dengan teori grafik . “Membuat situs web” - tidak hanya membutuhkan kemampuan untuk menempatkan gambar lucu kucing di halaman. Proses ini juga melibatkan memasukkan node ke grafik global hyperlink . Menambahkan satu halaman tunggal mengarah pada potensi peningkatan jumlah tepi grafik, dan ini, pada gilirannya, mungkin memiliki efek yang tidak jelas pada pandangan pertama pada kinerja, analisis, peringkat mesin pencari dan karakteristik lainnya. Memahami konsekuensi dari perubahan tersebut dapat membantu mendapatkan informasi yang menarik, seperti bagaimana grafik tumbuh. Ternyata dinamika ini sangat mirip dengan hukum kekuasaan : World Wide Web adalah jaringan tanpa skala. Apa jalur terpendek antara dua node dari grafik ini? Bagaimana jaringan seperti itu terlihat jika Anda mencoba menyajikannya sebagai grafik planar atau bipartit ? Kapan mungkin untuk mematuhi properti ini, jika tentu saja memungkinkan? Tetapi bagaimana jika kita tidak menganggap web di seluruh dunia sebagai grafik, tetapi seluruh jaringan jalan di Amerika Utara, Eropa atau Asia?

Ada konsekuensi lain dari pengetahuan ini. Seringkali orang tidak mengerti bahwa halaman web modern bukan hanya dokumen HTML dengan tautan dan sumber daya lain, tetapi struktur data mirip pohon yang terhubung satu sama lain dalam grafik . Pohon-pohon ini sering dirayapi, diproses, dan diperbarui secara dinamis karena interaksi antara browser web pengguna dan server (berkat teknologi seperti AJAX ).

Contoh yang bagus dan cocok adalah MathJax . Atau Gmail . Memahami cara kerjanya melibatkan beberapa tingkat pengetahuan komputasi simbolik dan analisis semantik elemen halaman. Para penulis MathJax perlu menulis sebuah program yang mampu melintasi pohon yang dihasilkan atas dasar model objek dari sebuah dokumen , menemukan elemen-elemen matematika, “ menyimpannya ” dan secara dinamis menggantinya dengan elemen-elemen baru yang ditarik. Mungkin beberapa pengguna yang hanya melihat cara kerjanya tidak akan sangat mengesankan, tetapi hal-hal yang cukup rumit terjadi di bawah tenda. Saya biasanya tidak harus melakukan sesuatu yang serupa (saya tidak bekerja dengan front-end), tetapi sepanjang waktu saya melakukan hal serupa di Lisp . Harap dicatat bahwa Lisp pada awalnya dipertajam oleh pemrosesan matematis informasi simbolik: makro sepenuhnya mencakup masalah pemrosesan ekspresi simbolik.

Saya banyak bekerja dengan deret waktu . Bagaimana konsumsi lalu lintas atau sumber daya berubah? Tren apa yang bisa disorot? Apakah lompatan ini atau itu terwujud dalam keterlambatan menanggapi permintaan atau konsumsi memori secara musiman ? Bagaimana laju perubahan sesuatu bereaksi ketika input data bervariasi dalam dimensi yang berbeda? Apakah ada korelasi dengan beberapa peristiwa eksternal?

Saya banyak bekerja dengan analisis data statistik, tidak hanya untuk menentukan karakteristik kinerja, tetapi juga untuk memahami data tersebut. Selain mencari pohon DOM yang disebutkan di atas untuk metadata semantik (misalnya, Microdata dan Microformats , RDF , data XML lainnya dengan beberapa skema tertentu), saya juga mencoba untuk memahami data yang tidak terstruktur . Apa kemungkinan teks ini adalah alamat jalan? Atau koordinat grafik ? Dalam konteks apa dia muncul? Apakah itu spam ? Apakah itu masuk akal? Apakah ini terlihat seperti hasil dari generator teks berdasarkan rantai Markov ? Mungkin ini adalah serangkaian kutipan dari beberapa karya sastra terkenal? Atau sebuah fragmen diskusi sastra? Atau mungkin ini diskusi tentang spam yang mengandung fragmen sastra? Saya masih tertawa setiap kali saya memikirkan sebuah iklan obat email spam yang terbungkus dalam fragmen dari “Master and Margarita” Bulgakov.

Teori kategori . Jenis-jenis dalam bahasa pemrograman komputer kira-kira sesuai dengan kategori, dan monad dan fungsi dapat digunakan untuk menyederhanakan beberapa konstruksi secara serius dan elegan. Misalnya, dalam bahasa pemrograman fungsional Haskell, monad digunakan untuk I / O dan untuk pemodelan keadaan . Ketika berhadapan dengan program yang disederhanakan, lebih mudah membuatnya bekerja. Lebih mudah untuk membicarakannya, lebih mudah dimengerti, diubah, dan sebagainya. Jenis sering dapat ditentukan berdasarkan penalaran logis, yang mengarah pada munculnya kasus khusus (yang juga dapat digunakan dalam masalah penalaran umum). Pikirkan apa yang terjadi jika Anda menggunakan kesimpulan untuk menerapkan fungsi logis, seperti yang digunakan dalam prolog , untuk mengubah grafik dalam sistem terdistribusi .

Sistem terdistribusi mengembalikan kita ke teori grafik. Kerusakan terjadi pada sistem dunia nyata, ekskavator merobek serat, gempa bumi, letusan gunung berapi terjadi, dan pukat ikan merusak kabel laut. Untuk memahami konsekuensi dari peristiwa semacam itu dan menentukan cara terbaik untuk menanggapinya, perlu untuk memahami karakteristik grafik jaringan. Algoritme perutean dan analisis jaringan terkait erat dengan hal-hal seperti menemukan jalur terpendek antara node dalam grafik. Algoritma Dijkstra akan membantu Anda dengan ini.

Namun, bagaimana Anda bisa mendistribusikan beban dari perhitungan besar antara pusat data yang terletak di berbagai belahan dunia? Di sini Anda juga akan memerlukan beberapa pengetahuan fisika: pada skala Internet, kecepatan cahaya berubah menjadi "hambatan". Pembuangan panas , kerapatan arus per unit luas dan banyak lagi adalah contoh dari apa yang harus dipertimbangkan oleh programmer saat bekerja dengan tugas dunia nyata. Haruskah saya meng-host pusat data di Islandia? Sumber pendinginan dan energi panas bumi yang murah menciptakan kondisi yang menarik, tetapi bagaimana dengan penundaan minimum bagi pengguna yang mungkin tertarik untuk menyewa peralatan di pusat data seperti itu? Berapa jarak sepanjang busur lingkaran besar antara, misalnya, Islandia dan London, atau Berlin dan Amsterdam? Menghitung semua ini cukup sederhana, tetapi untuk ini perlu memiliki pengetahuan matematika tertentu. Bisakah kita mengirim serat dari Islandia ke pusat lain? Apa penundaan rata-rata? Apa kemungkinan pecahnya kabel bawah laut di Laut Utara selama 12 bulan beroperasi? Dan selama 48 bulan?

Tentu saja, teori algoritma , teori automata , parsing , tata bahasa formal , bahasa reguler adalah semua bidang pengetahuan yang selalu ditangani oleh programmer. Saya sering bekerja dengan parsing dan pencocokan pola . Dalam bekerja dengan data dunia nyata, bahkan set ukuran yang tidak terlalu besar dapat mengandung elemen yang dapat menyebabkan perilaku patologis yang buruk ketika menggunakan, misalnya, teknik backtracking . Menggunakan ekspresi reguler untuk mencocokkan data, saya harus berhati-hati dan memastikan bahwa ekspresi ini benar - benar teratur .

Menggunakan mesin dengan memori toko untuk mengurai tata bahasa bebas konteks (yang, omong-omong, terjadi setiap kali Anda mengirim permintaan ke server HTTP ), saya perlu memastikan bahwa saya membatasi kedalaman rekursi untuk menghindari melelahkan tumpukan panggilan prosesor, yang membutuhkan pemahaman prinsip dasar perhitungan dan matematika yang menjadi dasarnya.

Jika saya perlu menulis algoritme keturunan rekursif saya sendiri untuk beberapa tata bahasa yang tidak biasa dan tidak cocok dengan LALR (1) (jadi saya tidak bisa hanya menggunakan yacc atau bison ), saya perlu berhati-hati atau menjaga stack negara terpisah dari rekursi prosedural. Pemahaman ini juga diperlukan jika saya berkeliling pohon DOM (atau struktur data yang didefinisikan secara rekursif). Beberapa bahasa pemrograman menganggap ini sebagai kesulitan dalam pekerjaan seorang programmer dan mengelak dengan menggunakan tumpukan tersegmentasi . Tentu saja, akan lebih bagus jika saya dapat mendefinisikan koleksi saya dari beberapa sumber daya yang dianalisis dalam bentuk fungsi (dalam pengertian matematika). Dan betapa kerennya jika hanya karena masalah optimisasi pemrograman linier ?

Harap dicatat bahwa tidak ada satu pun di atas yang merupakan pengetahuan esoterik. Semua ini didasarkan pada pengalaman dengan tugas dan data dunia nyata. Tentu saja, saya tidak melakukan semua ini setiap hari, tetapi sebagian besar dari pengetahuan ini saya terapkan secara teratur, dan hanya beberapa - dari waktu ke waktu. Mungkin, pengamatan, pengalaman dan heuristik memiliki pengaruh lebih besar pada proses daripada yang seharusnya (model heuristik seringkali tidak lengkap dan tidak akurat). Apakah saya memiliki pengetahuan matematika yang cukup untuk menghitung kesalahan rata-rata antara kenyataan dan model heuristik saya?

Ini adalah esensi dari ilmu komputer, serta bagaimana mereka berinteraksi dengan pemrograman dan realitas komputasi modern. Menjadi seorang profesional TI tidak sama dengan menjadi ahli dalam teori sistem komputer, dan sebagaimana banyak orang tunjukkan, pakar seperti itu jauh lebih dekat dengan ahli matematika terapan daripada seorang ahli seni. Dalam kasus apa pun saya tidak ingin meremehkan pentingnya profesional seperti itu, karena mereka berguna dan dihormati secara universal, tetapi saya hanya ingin mencatat bahwa ilmu komputer adalah sesuatu yang lain.

(Ngomong-ngomong, saya sendiri bukan ahli dalam ilmu komputer. Saya belajar matematika murni, dan pekerjaan profesional saya jauh lebih dekat dengan teknik.)

gambar

Source: https://habr.com/ru/post/id411731/


All Articles