การค้นหาตัวเลขที่เล็กที่สุดอันดับที่ 3 ใน Java: คู่มือฉบับสมบูรณ์
เผยแพร่แล้ว: 2023-08-23คุณเคยสงสัยบ้างไหมว่าจะหาจำนวนที่น้อยที่สุดเป็นอันดับสามในอาร์เรย์ รายการ หรือกระแสจำนวนเต็มอย่างมีประสิทธิภาพได้อย่างไร ในบล็อกโพสต์นี้ เราจะเจาะลึกเข้าไปในโลกของการเขียนโปรแกรม Java และสำรวจเทคนิคต่างๆ เพื่อระบุจำนวนที่น้อยที่สุดเป็นอันดับสามในแหล่งข้อมูลต่างๆ
เมื่อทำงานกับการจัดการและการวิเคราะห์ข้อมูล มักมีความจำเป็นในการระบุองค์ประกอบเฉพาะภายในกลุ่มตัวเลข การค้นหาจำนวนที่น้อยที่สุดหรือมากที่สุดนั้นค่อนข้างตรงไปตรงมา แต่การระบุจำนวนที่น้อยที่สุดเป็นอันดับสามนั้นต้องใช้ความเฉียบแหลมมากกว่าเล็กน้อย ในบล็อกโพสต์นี้ เราจะกล่าวถึงสามวิธีในการแก้ไขปัญหานี้โดยใช้ Java: การเรียงลำดับอาร์เรย์ การเรียงลำดับรายการ และการใช้สตรีม
วิธีที่ 1: การเรียงลำดับอาร์เรย์
อาร์เรย์เป็นหนึ่งในโครงสร้างข้อมูลพื้นฐานใน Java ทำให้เป็นจุดเริ่มต้นตามธรรมชาติสำหรับการสำรวจของเรา แนวคิดนี้คือการเรียงลำดับอาร์เรย์จากน้อยไปหามาก จากนั้นดึงข้อมูลองค์ประกอบที่ดัชนี 2
วิธีที่ 2: การเรียงลำดับรายการ
รายการเป็นทางเลือกที่ยืดหยุ่นกว่าสำหรับอาร์เรย์ ช่วยให้สามารถปรับขนาดแบบไดนามิกและจัดการได้ง่ายขึ้น หากต้องการค้นหาจำนวนที่น้อยที่สุดเป็นอันดับสามในรายการ เราสามารถใช้วิธีการจัดเรียงอาร์เรย์ที่คล้ายกันได้
วิธีที่ 3: การใช้สตรีม
สตรีม Java เป็นวิธีที่มีประสิทธิภาพในการประมวลผลลำดับขององค์ประกอบ เราสามารถใช้สตรีมเพื่อจัดเรียงองค์ประกอบแล้วดึงตัวเลขที่เล็กที่สุดเป็นอันดับสาม
การเลือกวิธีการที่เหมาะสม
แต่ละวิธีมีข้อดีและกรณีการใช้งานของตัวเอง หากคุณมีอาร์เรย์อยู่แล้ว วิธีการเรียงลำดับอาร์เรย์อาจมีประสิทธิภาพมากที่สุด รายการมีความหลากหลายและให้ความสะดวกมากขึ้น ในขณะที่สตรีมให้แนวทางการทำงานและสามารถจัดการชุดข้อมูลขนาดใหญ่ได้อย่างง่ายดาย
นี่คือตัวอย่างที่สมบูรณ์:
CrunchyThirdSmallestNumberFinder.java
แพ็คเกจ crunchify.com.tutorial; นำเข้า java.util.Arrays; นำเข้า java.util.List; นำเข้า java.util.stream.Collectors; นำเข้า java.util.stream.Stream; /** * @ผู้เขียน Crunchify.com * การค้นหาตัวเลขที่เล็กที่สุดอันดับที่ 3 ใน Java: คู่มือฉบับสมบูรณ์ * */ คลาสสาธารณะ CrunchyThirdSmallestNumberFinder { // วิธีการค้นหาตัวเลขที่เล็กที่สุดเป็นอันดับสามในอาร์เรย์ int สาธารณะคงที่ findCrunchyThirdSmallest (int [] crunchArr) { ถ้า (crunchArr.length < 3) { โยน IllegalArgumentException ใหม่ ("อาร์เรย์ควรมีองค์ประกอบกระทืบอย่างน้อย 3 องค์ประกอบ"); } // จัดเรียงอาร์เรย์แบบกรุบกรอบจากน้อยไปหามาก อาร์เรย์.sort(crunchArr); กลับ crunchArr [2]; // คืนองค์ประกอบกรุบกรอบที่เล็กที่สุดเป็นอันดับสาม } // วิธีการหาตัวเลขที่น้อยที่สุดเป็นอันดับสามในรายการ int สาธารณะคงที่ findCrunchyThirdSmallest (รายการ <จำนวนเต็ม> crunchList) { ถ้า (crunchList.size() < 3) { โยน IllegalArgumentException ใหม่ ("รายการควรมีองค์ประกอบกระทืบอย่างน้อย 3 รายการ"); } // จัดเรียงรายการแบบกรุบกรอบโดยใช้สตรีมและรวบรวมองค์ประกอบที่เรียงลำดับไว้ในรายการใหม่ รายการ <จำนวนเต็ม> sortedCrunchList = crunchList.stream() .เรียงลำดับ() .collect(Collectors.toList()); กลับ sortedCrunchList.get (2); // คืนองค์ประกอบกรุบกรอบที่เล็กที่สุดเป็นอันดับสาม } // วิธีการหาตัวเลขที่เล็กที่สุดเป็นอันดับสามที่กรุบกรอบในสตรีม int สาธารณะคงที่ findCrunchyThirdSmallest (กระแส <จำนวนเต็ม> crunchStream) { // รวบรวมองค์ประกอบจากสตรีมกรุบกรอบ จัดเรียงและรวบรวมเป็นรายการ รายการ <จำนวนเต็ม> sortedCrunchList = crunchStream.sorted().collect(Collectors.toList()); ถ้า (sortedCrunchList.size() < 3) { โยน IllegalArgumentException ใหม่ ("สตรีมควรมีองค์ประกอบกระทืบอย่างน้อย 3 องค์ประกอบ"); } กลับ sortedCrunchList.get (2); // คืนองค์ประกอบกรุบกรอบที่เล็กที่สุดเป็นอันดับสาม } โมฆะคงที่สาธารณะ main (String [] args) { int[] crunchArr = {35, 62, 28, 31, 13, 97}; รายการ<จำนวนเต็ม> crunchList = Arrays.asList(9, 14, 676, 62, 11, 328); สตรีม <จำนวนเต็ม> crunchStream = Stream.of (427, 53, 71, 99, 25, 62); // ค้นหาตัวเลขที่เล็กที่สุดเป็นอันดับสามแบบกรุบกรอบโดยใช้แหล่งต่างๆ int crunchyThirdSmallestFromArr = ค้นหา CrunchyThirdSmallest (crunchArr); int crunchyThirdSmallestFromList = findCrunchyThirdSmallest (crunchList); int crunchyThirdSmallestFromStream = findCrunchyThirdSmallest (crunchStream); // พิมพ์ตัวเลขที่เล็กที่สุดเป็นอันดับสามกรุบกรอบ System.out.println("กรุบกรอบที่เล็กที่สุดเป็นอันดับสามจาก arr: " + crunchyThirdSmallestFromArr); System.out.println("กรุบกรอบที่เล็กที่สุดเป็นอันดับสามจากรายการ: " + crunchyThirdSmallestFromList); System.out.println("Crunchy Third SmallestFromStream: " + crunchyThirdSmallestFromStream); } }
ผลลัพธ์คอนโซล Eclipse:
เพียงรันโปรแกรมด้านบนใน Eclipse IDE หรือ IntelliJ IDEA แล้วคุณจะได้ผลลัพธ์ดังนี้
กรุบกรอบเล็กเป็นอันดับสามจาก arr: 31 กรุบกรอบที่เล็กที่สุดเป็นอันดับสามจากรายการ: 14 กรุบกรอบเล็กที่สุดเป็นอันดับสามจากสตรีม: 62 กระบวนการเสร็จสิ้นด้วยรหัสทางออก 0
มีความแตกต่างด้านประสิทธิภาพที่ควรพิจารณา:
ในแง่ของความซับซ้อนของเวลา ทั้งสามวิธีมีขั้นตอนการเรียงลำดับที่คล้ายกัน ซึ่งโดยทั่วไปจะมีความซับซ้อนของเวลาเป็น O(n log n)
โดยที่ 'n' คือจำนวนองค์ประกอบในคอลเลกชัน (อาร์เรย์ รายการ หรือสตรีม)
ความซับซ้อนของเวลาในการเข้าถึงองค์ประกอบที่เล็กที่สุดอันดับที่สามนั้นคงที่ O(1)
เนื่องจากเป็นการค้นหาอาร์เรย์หรือรายการอย่างง่าย
- วิธีอาร์เรย์: วิธีการนี้จะเรียงลำดับอาร์เรย์ให้เข้าที่ ดังนั้นจึงไม่จำเป็นต้องใช้หน่วยความจำเพิ่มเติมสำหรับคอลเลกชันที่เรียงลำดับใหม่ ซึ่งอาจนำไปสู่การใช้หน่วยความจำที่ดีขึ้นเล็กน้อยเมื่อเปรียบเทียบกับรายการและวิธีการสตรีม
- วิธีการรายการ: วิธีการนี้จะแปลงรายการเป็นรายการที่เรียงลำดับโดยใช้สตรีม แม้ว่าสะดวก แต่ก็เกี่ยวข้องกับการสร้างรายการใหม่ซึ่งใช้หน่วยความจำเพิ่มเติม นี่อาจเป็นข้อกังวลหากการใช้หน่วยความจำมีความสำคัญ
- วิธีการสตรีม: วิธีการสตรีมค่อนข้างยืดหยุ่นและใช้งานได้ แต่เกี่ยวข้องกับการรวบรวมสตรีมลงในรายการ สิ่งนี้จะเพิ่มค่าใช้จ่ายเล็กน้อยในแง่ของหน่วยความจำและการประมวลผล เมื่อเปรียบเทียบกับการเรียงลำดับอาเรย์โดยตรง
แจ้งให้เราทราบหากคุณประสบปัญหาในการใช้รหัสนี้