Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เมธอด Array.BinarySearch() ใน C# : ค้นหาแบบทวิภาคในอาร์เรย์ที่เรียงแล้ว

เมธอด Array.BinarySearch(Array, Object) ใน C# ใช้ค้นหา element เฉพาะในอาร์เรย์หนึ่งมิติที่ เรียงลำดับแล้ว โดยใช้ interface IComparable ที่แต่ละ element implement ไว้

⚠ สำคัญ: อาร์เรย์ ต้องเรียงลำดับแล้ว ก่อนเรียกใช้เมธอดนี้ มิฉะนั้นผลลัพธ์จะไม่ถูกต้อง

รูปแบบไวยากรณ์ (Syntax)

public static int BinarySearch(Array arr, object val);
  • arr : อาร์เรย์หนึ่งมิติที่ เรียงลำดับแล้ว
  • val : object ที่ต้องการค้นหา

ค่าที่คืนกลับ

  • ดัชนี (index) ที่เป็นเลขบวกหรือศูนย์ : พบค่าที่ค้นหา
  • ค่าลบ : ไม่พบค่าที่ค้นหา (ค่าที่คืนคือ bitwise complement ของดัชนีที่ควรจะอยู่)

ตัวอย่างที่ 1: ค้นหาในอาร์เรย์จำนวนเต็ม

using System;

public class Demo
{
    public static void Main()
    {
        int[] intArr = { 5, 10, 15, 20 };
        Array.Sort(intArr); // เรียงลำดับก่อน (แม้จะเรียงอยู่แล้วก็ตาม)
        
        Console.WriteLine("Array elements...");
        foreach (int i in intArr)
        {
            Console.WriteLine(i);
        }
        
        Console.Write("Element 20 is at index = " + Array.BinarySearch(intArr, 20));
    }
}

ผลลัพธ์

Array elements...
5
10
15
20
Element 20 is at index = 3

ตัวอย่างที่ 2: ค้นหาในอาร์เรย์สตริง (พบและไม่พบ)

using System;

public class Demo
{
    public static void Main()
    {
        string[] strArr = { "John", "Tim", "Fedric", "Gary", "Harry", "Damien" };
        Array.Sort(strArr);
        
        Console.WriteLine("Array elements...");
        foreach (string s in strArr)
        {
            Console.WriteLine(s);
        }
        
        Console.Write("Element Gary is at index = " + Array.BinarySearch(strArr, "Gary"));
        Console.Write("\nElement Tom is at index = " + Array.BinarySearch(strArr, "Tom"));
    }
}

ผลลัพธ์

Array elements...
Damien
Fedric
Gary
Harry
John
Tim
Element Gary is at index = 2
Element Tom is at index = -7

การตีความค่าลบที่คืนกลับ

เมื่อไม่พบค่า ค่าที่คืนจะเป็น ~index (bitwise complement) ของตำแหน่งที่ควรจะอยู่

  • ค่า -7 หมายถึง ~(-7) = 6 → ตำแหน่งที่ 6 (ท้ายอาร์เรย์)
  • สามารถคำนวณตำแหน่งที่ควร insert ได้ด้วย ~result

สรุป

  • เร็วกว่า Linear Search มาก (O(log n) vs O(n))
  • ต้องการอาร์เรย์ที่เรียงลำดับแล้วเป็นข้อกำหนดบังคับ
  • เหมาะสำหรับอาร์เรย์ขนาดใหญ่ที่ค้นหาบ่อย
  • มี overload อื่นๆ รองรับ range, comparer, และ generic types