Arrays.binarySearch
ค้นหาในอาร์เรย์ที่เรียงลำดับแล้ว
Arrays.binarySearch เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
การค้นหาในอาร์เรย์ที่เรียงลำดับแล้ว
Arrays.binarySearch ค้นหาองค์ประกอบในอาร์เรย์ที่ เรียงลำดับแล้ว โดยใช้เวลา O(log n) เมธอดนี้จะแบ่งช่วงการค้นหาครึ่งหนึ่งซ้ำ ๆ จึงเร็วกว่าการตรวจสอบทุกองค์ประกอบทีละตัวอย่างมาก
เงื่อนไขเบื้องต้นคือต้องเรียงลำดับแล้ว
อาร์เรย์ ต้องเรียงจากน้อยไปมากอยู่ก่อนแล้ว หากยังไม่ได้เรียง ผลลัพธ์จะไม่ถูกกำหนด หากไม่แน่ใจ ให้ใช้ Arrays.sort ก่อนเสมอ
การค้นหาพื้นฐาน
เมื่อพบค่า binarySearch จะคืนค่าเป็น ดัชนี ของค่านั้น
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10};
int index = Arrays.binarySearch(nums, 8);
System.out.println("Found at index " + index);
}
}เมื่อไม่พบค่า
หากไม่มีค่านั้นอยู่ ค่าที่ส่งกลับจะเป็น ค่าติดลบ โดยมีค่าเท่ากับ -(insertionPoint) - 1 จุดแทรกคือ ตำแหน่งที่ควรใส่ค่านั้นเพื่อให้อาร์เรย์ยังคงเรียงลำดับอยู่
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10};
int result = Arrays.binarySearch(nums, 5);
System.out.println("Raw result: " + result);
}
}การหาตำแหน่งแทรกกลับคืนมา
หากต้องการเปลี่ยนผลลัพธ์ติดลบให้เป็นดัชนีที่จะแทรก ให้คำนวณ -(result) - 1 ค่านี้จะบอกตำแหน่งที่ควรแทรกค่าที่ค้นหาไม่พบ
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10};
int result = Arrays.binarySearch(nums, 5);
if (result < 0) {
int insertionPoint = -(result) - 1;
System.out.println("Would insert at index " + insertionPoint);
}
}
}การค้นหาในอาร์เรย์ของอ็อบเจ็กต์
binarySearch ยังใช้กับอาร์เรย์ของอ็อบเจ็กต์ที่มีลำดับตามธรรมชาติได้ด้วย อาร์เรย์ต้องเรียงด้วยลำดับเดียวกับที่การค้นหาใช้เปรียบเทียบ
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Charlie", "Dave"};
int index = Arrays.binarySearch(names, "Charlie");
System.out.println("Charlie at index " + index);
}
}การค้นหาด้วยตัวเปรียบเทียบ
หากอาร์เรย์ถูกเรียงด้วยตัวเปรียบเทียบแบบกำหนดเอง คุณต้องส่ง ตัวเปรียบเทียบเดียวกัน ให้กับ binarySearch มิฉะนั้นผลลัพธ์จะไม่มีความหมาย
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] names = {"Dave", "Charlie", "Bob", "Alice"};
Comparator<String> desc = Comparator.reverseOrder();
Arrays.sort(names, desc);
int index = Arrays.binarySearch(names, "Charlie", desc);
System.out.println("Index: " + index);
}
}การค้นหาในบางช่วง
คุณสามารถจำกัดการค้นหาไว้เพียงบางส่วนของอาร์เรย์ด้วย binarySearch(array, fromIndex, toIndex, key) ขอบเขตของช่วงใช้กฎรวมจุดเริ่มต้นและไม่รวมจุดสิ้นสุดเช่นเดียวกับการเรียงลำดับ
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10, 12};
int index = Arrays.binarySearch(nums, 1, 5, 8);
System.out.println("Index: " + index);
}
}กรณีค่าซ้ำไม่ระบุแน่ชัด
หากอาร์เรย์มีค่าซ้ำกัน จะ ไม่มีการรับประกัน ว่าจะคืนค่าดัชนีใดจากดัชนีที่ตรงกัน การค้นหาแบบทวิภาคเหมาะที่สุดกับอาร์เรย์ที่มีคีย์ไม่ซ้ำกัน
ทำไมไม่วนซ้ำธรรมดา
การค้นหาเชิงเส้นใช้เวลา O(n) และทำงานกับข้อมูลที่ยังไม่ได้เรียงลำดับได้ ส่วนการค้นหาแบบทวิภาคใช้เวลา O(log n) แต่ต้องใช้ข้อมูลที่เรียงลำดับแล้ว สำหรับการค้นหาซ้ำในชุดข้อมูลขนาดใหญ่ การเรียงลำดับครั้งเดียวแล้วค้นหาแบบทวิภาคหลายครั้งช่วยเพิ่มประสิทธิภาพได้อย่างมาก
นำทุกอย่างมารวมกัน
เรียงลำดับก่อน จากนั้นค้นหาและตีความผลลัพธ์อย่างปลอดภัย
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ids = {40, 10, 30, 20};
Arrays.sort(ids);
int r = Arrays.binarySearch(ids, 30);
if (r >= 0) {
System.out.println("Found 30 at index " + r);
} else {
System.out.println("Not found; insert at " + (-(r) - 1));
}
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับ binarySearch
ทบทวน
คุณได้เรียนรู้การค้นหาที่รวดเร็วด้วย Arrays.binarySearch แล้ว
- ต้องเรียงลำดับอาร์เรย์ก่อน
- ผลลัพธ์ที่ไม่ติดลบคือดัชนีของค่าที่พบ
- ผลลัพธ์ติดลบจะเข้ารหัสตำแหน่งแทรกในรูปแบบ
-(result) - 1 - ใช้ตัวเปรียบเทียบเดียวกันสำหรับการเรียงลำดับและการค้นหา
คำถามที่พบบ่อย
บทเรียน “Arrays.binarySearch” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Arrays.binarySearch” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Arrays.binarySearch”
ค้นหาในอาร์เรย์ที่เรียงลำดับแล้ว คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Arrays.binarySearch” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Arrays.sort และการเรียงลำดับ
- Arrays.binarySearch
- Arrays.fill และ copyOf
- Arrays.equals และ toString