Kuring narima cek ti Knuth pikeun 0x $ 3,00

Donald Knuth nyaéta élmuwan komputer anu paduli pisan ngeunaan katepatan bukuna anu anjeunna nyarankeun hiji dollar hex ($ 2,56, 0x $ 1,00) pikeun sagala "kasalahan" kapanggih, dimana kasalahan diartikeun sagala hal anu "téhnisna, sajarahna, tipografis, atawa politis salah". Nyaan hayang meunang cek ti Knuth, jadi kuring mutuskeun pikeun néangan kasalahan dina magnum opus na "Seni Pemrograman" (TAOCP). Urang junun manggihan tilu. Bener kana kecap-Na, Knut dikirim cék pikeun 0x $3,00.

Kuring narima cek ti Knuth pikeun 0x $ 3,00

Sakumaha anjeun tiasa tingali, ieu sanés cek nyata. Knuth dipaké pikeun ngirim cék nyata, tapi dieureunkeun di 2008 alatan panipuan rampant. Anjeunna ayeuna ngirimkeun kaluar "sertipikat pribadi tina deposit" ka Bank San Serriff (BoSS). Cenah anjeunna daék ngirim duit nyata lamun perlu, tapi sigana loba teuing repot a.

Kuring manggihan dua typo jeung hiji kasalahan sajarah. Kuring bakal daptar aranjeunna dina urutan nurunna triviality.

Typo #1

Salah ketik munggaran aya dina kaca 392 jilid katilu "Asihan sareng Milarian", garis kadalapan ti handap: "Saatos pamilarian gagal, sakapeung (kadang-kadang) disarankeun pikeun ngalebetkeun rékaman énggal kana méja anu ngandung K; métode anu ngalakukeun ieu disebut search and insert algorithm. Kasalahan nyaéta yén gantina sometime kuduna sakapeung.

Tangtu, kasalahan saperti teu heran. Pasti aya sababaraha typo dina tulisan ieu nyalira (henteu aya ganjaran pikeun mendakanana). Anu matak pikaheraneun nyaéta yén éta henteu kapendak salami lami. Halaman 392 henteu dikubur jero dina bagian matematika, éta kaca munggaran pisan Bab XNUMX "Paluruh"! Panginten salah sahiji bagian anu paling dibaca dina buku. Dina tiori, kedah aya pangsaeutikna typo, tapi henteu.

Ku jalan kitu, upami anjeun kantos panginten maca TAOCP, cobian. Loba bakal nyebutkeun yén ieu téh diréktori, teu dimaksudkeun pikeun bacaan langsung, tapi ieu teu bener. Pangarang boga sudut pandang anu jelas jeung gaya anu has. Hiji-hijina hal anu ngahalangan kabaca nyaéta pajeulitna matematika. Nanging, aya solusi anu saderhana: baca dugi ka matématika anu anjeun henteu ngartos, skip, teras angkat ka bagian salajengna anu anjeun tiasa ngartos. Maca cara kieu, Kuring sono sahanteuna 80% tina buku, tapi 20% séjén hébat!

Hal ieu ogé ngomong yén TAOCP teu relevan, geus luntur atawa lamun heunteu lumaku pikeun "program nyata". Ieu ogé teu bener. Contona, bagian kahiji sanggeus bubuka kasampak dina manggihan unsur dina Asép Sunandar Sunarya unsorted. Algoritma pangbasajanna wawuh ka sadaya programer. Mimitian pointer di awal Asép Sunandar Sunarya, lajeng ngalakukeun di handap dina loop a:

  1. Pariksa naha unsur ayeuna mangrupikeun anu dipikahoyong. Lamun kitu, urang balikkeun deui; sabalikna
  2. Pariksa lamun pointer aya di luar wates Asép Sunandar Sunarya. Lamun kitu, balikkeun kasalahan; sabalikna
  3. Ngazum gede tur nuluykeun.

Ayeuna mertimbangkeun: sabaraha bounds cék teu algoritma ieu merlukeun, rata-rata? Dina kasus awon, dimana Asép Sunandar Sunarya teu ngandung hiji unsur, unggal unsur dina daptar bakal merlukeun hiji dipariksa, sarta rata-rata bakal hal kawas Kuring narima cek ti Knuth pikeun 0x $ 3,00. Algoritma pamilarian anu langkung pinter tiasa kabur kalayan ngan ukur hiji pamariksaan wates. Gantelkeun unsur nu dipikahoyong ka tungtung Asép Sunandar Sunarya, lajeng mimitian pointer dina awal Asép Sunandar Sunarya jeung ngalakukeun di handap dina loop a:

  1. Pariksa naha unsur ayeuna mangrupikeun anu dipikahoyong. Lamun kitu, urang balik respon lamun pointer aya dina Asép Sunandar Sunarya, atawa kasalahan lamun henteu. Upami teu kitu
  2. Ngazum gede tur nuluykeun.

Hiji cara atawa sejen, unsur dijamin kapanggih, sarta bounds dipariksa dipigawé ngan sakali lamun ieu kajadian. Ieu mangrupikeun ide anu jero, tapi éta cukup saderhana bahkan pikeun programer novice. Panginten kuring henteu tiasa nyarioskeun relevansi padamelan ka batur, tapi kuring langsung tiasa nerapkeun hikmah ieu pikeun kode pribadi sareng profésional. Buku TAOCP pinuh ku permata sapertos kitu (kumaha adil, aya ogé seueur hal anu anéh di dinya, sapertos gelembung diurutkeun).

"Teangan, teangan
Lami pisan
Pilarian, milarian
Abdi ngan hoyong nari"

- Luther Vandross, "The Search" (1980)

Typo #2

The typo kadua dina Jilid 4A, Algoritma Combinatorial, bagian 1. Kaca 60 ngajelaskeun masalah ngalibetkeun scheduling comedians nedunan dina rupa casinos. Sababaraha pelawak kahirupan nyata dicutat salaku conto, kalebet Lily Tomlin, Weird Al Yankovic, sareng Robin Williams, anu masih hirup nalika bukuna diterbitkeun. Knuth sok daptar ngaran lengkep dina indéks, jadi Williams didaptarkeun dina kaca 882 salaku "Williams, Robin McLorim." Tapi ngaran tengah na ditungtungan make "n" teu "m", nyaeta, McLaurin.

McLaurin mangrupikeun nami maiden indungna. Anjeunna mangrupikeun incu awéwé Anselm Joseph McLaurin, Gubernur Mississippi ka-34. pamaréntahanana, katingalina, teu inget keur nanaon alus. Tina buku "Mississippi: Sajarah":

"Kajadian anu paling penting dina pamaréntahan McLaurin nyaéta deklarasi perang Amérika Serikat ka Spanyol dina musim semi 1898 ... Hanjakalna, perang tiasa masihan sababaraha pajabat pamaréntahan kasempetan pikeun ngalaksanakeun suap. McLaurin dituduh rupa-rupa prakték questionable, kaasup nepotisme sarta pamakéan kaleuleuwihan kakuatan hampura. Salila gerakan temperance, kritikus nuduh gubernur janten mabok, anu anjeunna ngaku sacara umum.

Kasalahan sajarah

nimbangkeun algoritma multiplication tradisional tina kurikulum sakola. Sabaraha perkalian hiji-angka anu diperyogikeun? Anggap anjeun ngalobaan Kuring narima cek ti Knuth pikeun 0x $ 3,00-angka angka Kuring narima cek ti Knuth pikeun 0x $ 3,00 dina Kuring narima cek ti Knuth pikeun 0x $ 3,00-bit Kuring narima cek ti Knuth pikeun 0x $ 3,00. Kalikeun heula angka kahiji Kuring narima cek ti Knuth pikeun 0x $ 3,00 pikeun tiap digit Kuring narima cek ti Knuth pikeun 0x $ 3,00 hiji hiji. Lajeng kalikeun angka kadua Kuring narima cek ti Knuth pikeun 0x $ 3,00 pikeun tiap digit Kuring narima cek ti Knuth pikeun 0x $ 3,00 hiji-hiji jeung saterusna nepi ka ngaliwatan sakabeh nomer Kuring narima cek ti Knuth pikeun 0x $ 3,00. Kituna multiplication tradisional merlukeun Kuring narima cek ti Knuth pikeun 0x $ 3,00 multiplications primitif. Utamana, ngalikeun dua angka ku Kuring narima cek ti Knuth pikeun 0x $ 3,00 jajaran diperlukeun Kuring narima cek ti Knuth pikeun 0x $ 3,00 одноразрядных умножений.

Ieu goréng, tapi kasebut nyaéta dimungkinkeun pikeun ngaoptimalkeun prosés ngagunakeun métode dikembangkeun ku matematikawan Soviét Anatoly Alekseevich Karatsuba. Hayu urang pura-pura éta Kuring narima cek ti Knuth pikeun 0x $ 3,00 и Kuring narima cek ti Knuth pikeun 0x $ 3,00 - angka desimal dua digit; nyaeta, aya angka Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00 sapertos kitu Kuring narima cek ti Knuth pikeun 0x $ 3,00 и Kuring narima cek ti Knuth pikeun 0x $ 3,00 (Generalizing algoritma ieu angka nu leuwih gede merlukeun sababaraha manipulasi; sanajan teu hese teuing, dina urutan teu nyieun kasalahan dina detil, abdi bakal hadé lengket conto basajan). Saterusna Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00. Ngalikeun binomials méré Kuring narima cek ti Knuth pikeun 0x $ 3,00. Di momen urang masih boga Kuring narima cek ti Knuth pikeun 0x $ 3,00 perkalian angka tunggal: Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00, Kuring narima cek ti Knuth pikeun 0x $ 3,00. Ayeuna hayu urang tambahkeun jeung ngurangan Kuring narima cek ti Knuth pikeun 0x $ 3,00. Saatos sababaraha rearrangements, nu kuring bakal ninggalkeun salaku latihan pikeun maca, tétéla Kuring narima cek ti Knuth pikeun 0x $ 3,00 - ngan tilu multiplications single-angka! (Aya sababaraha koefisien konstan, tapi ngan bisa diitung ku nambahkeun jeung mindahkeun digit).

Tong menta bukti, tapi Algoritma Karatsuba (recursively digeneralisasi tina conto di luhur) ngaronjatkeun kana métode multiplication tradisional jeung Kuring narima cek ti Knuth pikeun 0x $ 3,00 operasi sateuacanna Kuring narima cek ti Knuth pikeun 0x $ 3,00. Punten dicatet yén ieu mangrupikeun pamutahiran nyata pikeun algoritma, sanés optimasi pikeun itungan méntal. Mémang, algoritma éta henteu cocog pikeun aritmetika méntal, sabab peryogi biaya overhead anu ageung pikeun operasi rekursif. Sajaba ti éta, pangaruhna moal sapinuhna manifest sorangan nepi ka angka jadi cukup badag (untungna, algoritma Karatsuba urang geus diganti ku métode malah leuwih gancang: dina Maret 2019, hiji algoritma diterbitkeun nu ngan merlukeun. n log n multiplications; akselerasi ngan lumaku pikeun angka nu teu kabayang badag).

Algoritma ieu dijelaskeun dina kaca 295 Jilid XNUMX, Algoritma Semi-Numerical. Aya Knuth nyerat: "Éta panasaran yén ide ieu ngan ukur kapanggih dina 1962 taun," nalika hiji artikel ngajéntrékeun algoritma Karatsuba urang diterbitkeun. Tapi! Taun 1995, Karatsuba medalkeun makalah "Computational Complexity", anu nyebutkeun sababaraha hal: 1) kira-kira taun 1956, Kolmogorov ngusulkeun yén multiplication teu bisa dipigawé dina waktu kurang ti Kuring narima cek ti Knuth pikeun 0x $ 3,00 léngkah; 2) di 1960 taun Karatsuba dihadiran seminar dimana Kolmogorov dibere hipotesa n² na. 3) "Dina persis saminggu," Karatsuba ngembangkeun algoritma "dibagi sareng nalukkeun"; 4) dina 1962 Kolmogorov wrote sarta diterbitkeun artikel atas nama Karatsuba kalawan pedaran algoritma. "Kuring ngan ukur terang ngeunaan tulisan ieu saatos diterbitkeun deui."

Jadi kasalahan éta tinimbang 1962 kudu dieusian 1960 taun. Éta hungkul.

analisis

Pananjung kasalahan teu merlukeun skill husus.

  1. Kasalahan kahiji éta salaku trivial sabisa na éta dina tempat rélatif katempo (awal bab). Sakur jalma bodo bakal mendakanana; Kuring ngan tétéla éta bodo.
  2. Pananjung typo kadua diperlukeun tuah jeung karajinan, tapi teu skill. Indéks pikeun "Williams" aya dina halaman penultimate tina volume, bagian anu cukup menonjol dina buku. Kuring ngan flipping ngaliwatan indéks dina (teu jadi pathetic sakumaha keur disada, sabab aya endog Easter disumputkeun dina indexes Knuth urang. Contona, aya éntri dina basa Arab jeung Ibrani, duanana nunjuk ka kaca 66. Tapi éta kaca teu disebutkeun. boh basa; tibatan nujul kana "basa anu dibaca ti katuhu ka kenca"). Jeung ngaran kadua bray perhatian kuring. Kusabab kuring biasana maca Wikipédia, kuring pariksa Robin Williams sareng perhatoskeun bédana.
  3. Abdi ngarepkeun kuring tiasa nyarios yén kuring ngalakukeun panalungtikan anu serius pikeun mendakan kasalahan sajarah, tapi leres-leres kuring neuteup Kaca Wikipedia ngeunaan algoritma Karatsuba. Baris anu pangheulana nyarios: "Algoritma Karatsuba mangrupikeun algoritma multiplikasi gancang. Dipanggihan ku Anatoly Karatsuba dina 1960 sareng diterbitkeun dina 1962." Saatos éta sadayana anu tinggaleun nyaéta nambihan dua sareng dua.

Dina mangsa nu bakal datang Abdi hoyong manggihan bug leuwih signifikan, utamana dina kode Knuth urang. Abdi ogé hoyong mendakan bug dina volume mimiti Algoritma Dasar. Meureun kuring bakal kapanggih eta, tapi pikeun sababaraha alesan perpustakaan lokal ngan boga jilid 2, 3 jeung 4A.

Fakta kauangan:

  • Dina total, kontribusi kuring ka TAOCP diwangun ku ukur tilu karakter: hiji tambahan s, ngagantian m dina n и 2 dina 0. Pa $ 2,56, ieu sababaraha lambang geulis lucrative; Upami anjeun dibayar artos sapertos kitu, tulisan 1000 kecap (rata-rata opat karakter) bakal nampi anjeun sapuluh rebu.
  • Kalayan tilu dolar héksadesimal, kuring, sareng 29 warga sanés, dihijikeun ka tempat ka-69 dina daptar panyimpanan paling sugih di Bank San Serriff (sapertos 1 Mei 2019).

diskusi séjén ngeunaan cék ti Knuth

  • Kumaha carana meunang cek ti Knuth

    Rekomendasi umum pikeun milarian kasalahan dina buku Knuth. Lolobana aranjeunna paduli kasalahan teknis, nu kuring teu boga. Aya hiji saran anu kuring nyandak sacara serius:

    Hadé pisan mun éta antosan nepi ka anjeun geus dikumpulkeun sakumpulan kasalahan pikeun ngirimkeun. Ku ngagabungkeun sababaraha kasalahan nyata tapi teu pohara berharga, anjeun ngaronjatkeun likelihood nu salah sahijina sabenerna bakal dianggap salaku kasalahan atawa nasehat. Upami anjeun ngalebetkeun kasalahan hiji-hiji, masing-masing tiasa ditolak.

    Kuring teu hayang ngan ngirimkeun typos omong kosong, tapi nyandak nasehat jeung ngirim surat ngan lamun kuring manggihan kasalahan sajarah nu seemed cukup serius.

  • cék Ashutosh Mehra

    Ashutosh Mehra teh investor richest katilu di San Serriff kalawan patut net whopping 0x $ 207.f0 di BoSS.

  • Pariksa sababaraha bug non-fungsi dina kode TeX nyata
  • Rupa-rupa: #1 #2 #3 #4 #5 #6

sumber: www.habr.com

Tambahkeun komentar