Sense of number : ตอนที่ 1 - ไปดวงจันทร์
มาลองนั่งคิดกันเล่นๆ ว่าถ้าอยากจะไปดวงจันทร์
ระยะทางจากโลกคือ 384,400 กิโลเมตร
ตอนยานอพอลโล 11 ไปเหยียบดวงจันทร์ครั้งแรกใช้เวลาประมาณ 70 ชม. 38 นาที ก็ประมาณ 3 วัน
ถ้าขับรถด้วยความเร็ว 120km/hr จะใช้เวลาประมาณ 3,203 ชั่วโมง (133 วัน) โดยไม่ต้องคิดถึงแรงโน้มถ่วง
เอาล่ะ.. ก่อนจะเข้าสู่คำถาม มีกฎเล่นๆว่า หลังจากอ่านคำถามเสร็จให้ลองตอบตัวเลขที่คิดขึ้นมาได้ทันทีภายใน 5 วินาที ไม่ต้องคิด ไม่ต้องคำนวณ ไม่กดเครื่องคิดเลข แล้วมาลองดูกันว่าจะตรงมั้ย?
คำถามก็คือ…..
สมมุติกระดาษขนาด A4 หนาโดยประมาณ 0.1 มิลลิเมตร
ถ้าเราพับกระดาษใบเดิม.. พับทบไปเรื่อยๆ เราต้องพับกระดาษทั้งหมดกี่ทบ เราจึงจะได้ความหนาที่สูงพอที่จะไปถึงดวงจันทร์ได้?
เลขแรกที่แว้บเข้ามาในหัวทันทีคือเลขอะไร? หรือคิดว่ามากกว่าจำนวนเลขอะไร?
เอ้า !!!! ตอบเลยยยยยยย !!!!
เอาล่ะ… มาดูกันว่า จะใช่ตัวเลขคิดไว้หรือเปล่า?
ระยะทางจากโลก ถึง ดวงจันทร์ 384,400 กิโลเมตร
= 384,400,000 เมตร
= 38,440,000,000 เซ็นติเมตร
= 384,400,000,000 มิลลิเมตร
ดังนั้นต้องใช้กระดาษ 3,844,000,000,000 แผ่น = 7,688,000,000 รีม
การพับกระดาษ 1 ครั้ง สมมุติได้ว่ามีความหนาเท่ากระดาษ 2 แผ่นซ้อนกัน
ถ้าเราพับกระดาษ 9 ครั้ง ก็จะได้กระดาษหนาประมาณ 1 รีม (500 แผ่น)
เฮ้ย!!! แค่ 9 ครั้ง ได้ 1 รีมแล้ว แต่เรายังต้องการอีกตั้ง 7 พันล้านกว่ารีม หนทางดูช่างยาวไกลเหลือเกิน (T^T,, )
ก็พับกันต่อไป…
ในที่สุด ครั้งที่ 42
2⁴² = 4,398,046,511,104 แผ่น = 8,796,093,022 รีม
เอ้า!! นี่ก็เลยดวงจันทร์ไปแล้ว!!!!!! 5555+
แต่ถ้า 41 ครั้งก็ยังไม่ถึงนะเพราะว่า
2⁴¹ = 2,199,023,255,552 แผ่น ขาดไปอีกหนึ่งล้านล้านกว่าๆ
มานั่งคิดดูๆ 42 ครั้งนี่ก็ดูว่าเป็นเลขที่ไม่เยอะมากนะ ถ้าคิดในแง่ว่าเราพับครึ่งกระดาษครั้งแรกประมาณ 1–2 วินาที ถ้าทำซ้ำๆ 42 ครั้ง ก็น่าจะใช้เวลาไม่น่าเกิน 3 นาที แต่กลายเป็นว่าเราสามารถไปถึงดวงจันทร์ได้เลยทีเดียว
นี่คือพลังของ “Exponential Growth”
พับทบกัน 100 ครั้ง คงสามารถทะลุจักรวาล 5555+
ความน่าสนใจจากการถามตอบเล่นกันแบบสนุกๆ กับหลายๆคน ว่าแบบเลขที่แว๊บเข้ามาทันทีหลังจากรู้คำถามเลย ก็คือ
คนส่วนใหญ่จะพูดตั้งแต่หลัก ล้าน ไปจนถึง หลายพันล้าน
คนที่เป็นโปรแกรมเมอร์ บางส่วนมักจะพูดทันทีเลยว่าเป็น Exponential นี่นา.. แต่ Range ก็จะอยู่ในช่วง พัน ถึง แสน
และเพียงส่วนน้อยเท่านั้นที่พูดอยู่ที่ระดับหลัก <100
ทำไม… เราถึงพูดเรื่องนี้?
ในการเขียนโปรแกรม เรามักจะต้องมีการ deal กับเรื่องของตัวเลขตลอดเวลา ตัวแปรที่ใช้เก็บจำนวนเต็ม ส่วนใหญ่ มีขนาด 32 บิท หรือ 64 บิท ถ้าเปลี่ยนคำถามเป็น
ตัวเลข 384,400,000,000 สามารถเก็บใน Long (หรือ 64bit Integer) ได้รึเปล่า?
โปรแกรมเมอร์หลาย ๆ คนน่าจะตอบว่า “ ได้ ”
ถ้างั้นทำไมคำถามข้างต้น เราถึงตอบเลขที่เยอะเกินกว่า 64 ?
นอกจากที่เราควรจะต้องรู้ และเลือกว่าเราจะเก็บข้อมูลยังไง จึงจะรองรับกับความต้องการแล้ว เราก็ควรจะต้องสนใจวิธีการเขียนโปรแกรม เพื่อจัดการกับ Business logic ต่างๆ ด้วยเหมือนกัน
วิธีการที่ตรงไปตรงมาที่สุด สำหรับหลายๆปัญหา Runtime จะเป็น Exponential เมื่อเทียบกับขนาดของ Input
ซึ่งมันไม่ควรจะเป็น (ยกเว้น Input จะขนาดเล็กจัดจริงๆ)
แม้หลายๆคนจะรู้แต่ว่าก็ยัง underestimate มันไว้มากพอสมควร ว่ามันจะซักแค่ไหนกันเชียว?
นี่ก็เป็นตัวอย่างหนึ่งว่า แค่เพิ่มทีละสองเท่าแค่ 42 ครั้ง ก็เป็นตัวเลขถึง 4 ล้านล้านแล้ว แล้วถ้ามากกว่านี้ล่ะ? หรือถ้าเป็นเพิ่มทีละสามเท่า หรือ เพิ่มทีละสี่เท่าล่ะ?
ถ้าใครคิดว่าโม้ ก็ลองพับดูเล่นๆได้
ขอบคุณ Pattara Sukprasert สำหรับไอเดียในเรื่องนี้
บัยจ้า~
(•‾◡‾•)و ̑̑♡