김현이

[Java] ใช้ Stream ค้นหาจำนวนเฉพาะแบบ Lazy

สร้าง: 2024-07-23

สร้าง: 2024-07-23 19:39

โดยทั่วไปแล้ว การตรวจสอบว่า n เป็นจำนวนเฉพาะหรือไม่นั้น จะทำการหาร n ด้วยจำนวนเต็มตั้งแต่ 2 ไปจนถึง n - 1 และตรวจสอบว่ามีจำนวนใดหาร n ลงตัวหรือไม่

ลองมาปรับปรุงวิธีการนี้ให้มีประสิทธิภาพมากขึ้นโดยการเพิ่มขั้นตอนการปรับแต่งบางอย่าง และลองใช้ Stream เพื่อใช้ประโยชน์จากการประเมินแบบล่าช้า (lazy evaluation)


วิธีการแบบพื้นฐาน (Naive)

ต่อไปนี้เป็นวิธีการแบบพื้นฐานในการตรวจสอบว่า n เป็นจำนวนเฉพาะหรือไม่

การปรับปรุง

  • เมื่อ n = a x b เราสามารถสมมติได้ว่า a > b โดยไม่สูญเสียลักษณะทั่วไป
    นั่นหมายความว่า เราสามารถตรวจสอบ i ได้เพียงแค่ถึง sqrt(n) เท่านั้น เนื่องจากการคำนวณ sqrt() นั้นค่อนข้างสิ้นเปลือง เราจึงสามารถแทนที่ด้วยเงื่อนไข i * i <= n ได้
  • จำนวนเฉพาะที่มากกว่า 5 จะอยู่ในรูปแบบ 6k ± 1 ดังนั้น เราสามารถเพิ่ม i ทีละ 6 และตรวจสอบได้ ซึ่งจะช่วยลดจำนวนครั้งในการตรวจสอบลง

วิธีการที่ปรับปรุงแล้ว


การใช้ Stream เพื่อประยุกต์ใช้การประเมินแบบล่าช้า

Stream ใน Java นั้นแตกต่างจาก List ตรงที่การดำเนินการจะไม่ถูกดำเนินการทันทีที่นิยาม

Stream จะรอจนกว่าจะมีการร้องขอองค์ประกอบใดองค์ประกอบหนึ่ง แล้วจึงดำเนินการเฉพาะการคำนวณที่จำเป็นสำหรับองค์ประกอบนั้นเท่านั้น

เราสามารถใช้ประโยชน์จากคุณสมบัตินี้ในการสร้าง Stream ที่หาจำนวนเฉพาะได้ดังนี้

ผลลัพธ์

โค้ดทั้งหมด

ผลลัพธ์การทำงาน

[Java] ใช้ Stream ค้นหาจำนวนเฉพาะแบบ Lazy




ความคิดเห็น0

สรุปผลสอบภาคปฏิบัติ (ข้อเขียน) ผู้ช่วยวิเคราะห์ข้อมูลทางสังคม ระดับ 2 พร้อมข้อสอบเก่า (แนะนำสถานที่สอบที่วิทยาลัยอุตสาหกรรมและวิทยาศาสตร์อนาคต)รวบรวมข้อสอบเก่าภาคปฏิบัติ (ข้อเขียน) ผู้ช่วยวิเคราะห์ข้อมูลทางสังคม ระดับ 2 และรีวิวสถานที่สอบที่วิทยาลัยอุตสาหกรรมและวิทยาศาสตร์อนาคต พร้อมข้อสอบปี 2565 ครั้งที่ 2 จำนวน 12 ข้อ
롱롱이
롱롱이
롱롱이
롱롱이

April 27, 2024

[Effective Java] รายการที่ 6: หลีกเลี่ยงการสร้างออบเจ็กต์ที่ไม่จำเป็นการสร้างออบเจ็กต์ที่ไม่จำเป็นนั้นนำไปสู่การสิ้นเปลืองหน่วยความจำ ดังนั้น สำหรับออบเจ็กต์ เช่น สตริง หรือบูลีน ควรใช้ลิเทอรัลหรือเมธอดจากโรงงานแบบคงที่แทน
제이온
제이온
제이온
제이온

April 28, 2024

อัลกอริทึมของชอร์: เทคนิคการแยกตัวประกอบจำนวนเต็มที่น่าทึ่งของคอมพิวเตอร์ควอนตัมอัลกอริทึมของชอร์เป็นอัลกอริทึมที่ใช้คอมพิวเตอร์ควอนตัมในการแยกตัวประกอบจำนวนเต็มขนาดใหญ่ได้อย่างรวดเร็ว ซึ่งอาจส่งผลกระทบต่อความปลอดภัยของระบบเข้ารหัส RSA เขียนเมื่อวันที่ 4 มกราคม 2568
Cherry Bee
Cherry Bee
Cherry Bee
Cherry Bee

January 4, 2025

การพัฒนาแอปพลิเคชันแบบคนเดียว ควรทดสอบอะไรบ้าง?ในการพัฒนาแอปพลิเคชันแบบคนเดียว การทดสอบโดยมนุษย์ การทดสอบแบบรวม (provider) และการทดสอบหน่วย ควรดำเนินการตามลำดับนี้จึงจะได้ผลลัพธ์ที่ดีที่สุด
Alien Story
Alien Story
Alien Story
Alien Story

May 16, 2024

29 พ.ย. 2567 ข่าวล่าช้า: สมัคร Replit แบบชำระเงิน / นิสัยการพัฒนาซอฟต์แวร์ที่ดีบทความบล็อกที่เขียนเมื่อวันที่ 29 พฤศจิกายน พ.ศ. 2567 นี้จะแบ่งปันรีวิวการสมัครสมาชิกแบบชำระเงินของ Replit และแนะนำนิสัยการพัฒนาซอฟต์แวร์ที่ดี 10 ประการ ครอบคลุมกลยุทธ์การเขียนโค้ดและการปรับโครงสร้างที่มีประสิทธิภาพ รวมถึงความสำคัญของการทดสอบ
Charles Lee
Charles Lee
Charles Lee
Charles Lee

November 29, 2024

การสร้างแบบจำลองข้อมูลเชิงกายภาพการสร้างแบบจำลองข้อมูลเชิงกายภาพคือการนำแบบจำลองเชิงตรรกะมาใช้จริงในรูปแบบของตาราง โดยคำนึงถึงประสิทธิภาพการใช้พื้นที่จัดเก็บและการปรับแต่งประสิทธิภาพ สามารถปรับปรุงประสิทธิภาพโดยใช้ slow query, index และ cache
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

April 9, 2024