0Pricing
Java Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Arrays.sort และการเรียงลำดับ
  2. Arrays.binarySearch
  3. Arrays.fill และ copyOf
  4. Arrays.equals และ toString
← กลับไปที่ Java Academy