Thuta Learning
Data Structures & Algorithms
AdvancedProgrammingintermediate

Binary Search — Sorted Array ပေါ်က O(log n) ရှာဖွေမှု

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Binary Search — Sorted Array ပေါ်က O(log n) ရှာဖွေမှု concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ Python code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Linear search က element တစ်ခုချင်းစီကို check လုပ်တာမို့ worst case မှာ O(n) ဖြစ်တယ်။ Binary search ကတော့ sorted data ရဲ့ fact တစ်ခုကို အသုံးချပြီး ပိုကောင်းအောင် လုပ်တယ် — target ကို middle element နဲ့ compare လုပ်လိုက်ရင် target က ဘယ် half မှာရှိမယ်ဆိုတာ သိသွားတယ်၊ ဒါကြောင့် ကျန် half ကို ဆေးလုံးမကြည့်ဘဲ လုံးလုံးစွန့်ပစ်လို့ရတယ်။ ကျန်ရှိတဲ့ half ပေါ်မှာ ဒီအတိုင်းပြန်လုပ်ပြီး quarter ဆက်လုပ်တာမျိုး — comparison တစ်ခုချင်းစီက candidate ကျန်တဲ့ half ကို ဖျက်ပစ်ပေးလို့ total comparison က O(log n) ဖြစ်လာတယ်။ Element သန်းတစ်သန်းအတွက် comparison ၂၀ လောက်ပဲ လိုအပ်တယ် — သန်းချီလိုအပ်တဲ့ linear search နဲ့ ယှဉ်ရင်။ Strict ဖြစ်ပြီး negotiate မလုပ်နိုင်တဲ့ requirement တစ်ခုက input ကို sort ပြီးသားဖြစ်ရမယ်ဆိုတာပါ — binary search ရဲ့ halving logic က target ဟာ midpoint ရဲ့ ဘယ်ဘက်/ညာဘက်မှာရှိမယ်ဆိုတာ သိအောင် လုံးလုံးမှီတည်နေတာမို့ unsorted data ပေါ်မှာ ဒီ inference က မှားနေတာပါ။ အန္တရာယ်ရှိတဲ့ အချက်က unsorted input ပေါ်မှာ crash မဖြစ်ဘဲ silently wrong index ဒါမှမဟုတ် false 'not found' ကို return ပြန်ပေးတာပါ — crash ထက် debug လုပ်ဖို့ ပိုခက်တယ်။ ဒါက binary search tree ရဲ့ core idea အတူတူပဲ ဖြစ်ပေမယ့် linked tree structure အစား flat sorted array ပေါ်မှာ apply လုပ်တာပါ — pointer မလို index arithmetic ပဲ လိုတယ်။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Tutorial Platform က topic တစ်ခုစီရဲ့ lesson list ကို difficulty order အလိုက် sort ထားတယ်။ Learner တစ်ယောက်ကို 'သူ့ current level နဲ့ ညီမျှ ဒါမှမဟုတ် ပိုမြင့်တဲ့ ပထမဆုံး lesson' ဆီ တိုက်ရိုက်ပို့ချင်ရင် platform က ဒီ sorted list ကို linear scan လုပ်မယ့်အစား binary search လုပ်နိုင်တယ် — topic အားလုံးက lesson ရာနဲ့ချီရှိရင် comparison လက်တစ်ဆုပ်စာနဲ့ အားလုံးကို scan လုပ်ရတာကြားက ကွာခြားချက်ပါ။ ဒါက list ကို lesson ထည့်တိုင်း/reorder လုပ်တိုင်း တမင် sort ထိန်းထားလို့ပဲ အလုပ်လုပ်တာဖြစ်ပြီး editor တစ်ယောက်က sort order မထိန်းဘဲ lesson အသစ်ထည့်လိုက်ရင် ဒီ list ပေါ်က binary search က error တစ်ခုမှမပြဘဲ silently wrong result ပြန်ပေးမှာပါ — ဒါကြောင့် sanity check ဒါမှမဟုတ် assertion နဲ့ ကာကွယ်ထားသင့်တဲ့ failure mode အတိအကျပါပဲ။

အတူတူ စမ်းရေးကြည့်မယ်

python
def binary_search(arr, target):
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1  # not found

sorted_lessons = [3, 7, 12, 19, 25, 31, 40]
print(binary_search(sorted_lessons, 25))
print(binary_search(sorted_lessons, 5))
You should see
ပထမဆုံးအကြိမ်မှာ target 25 ရဲ့ index 4 ကို print ထုတ်ပြီး၊ ဒုတိယအကြိမ်မှာ target 5 ရှာမတွေ့လို့ -1 ကို print ထုတ်မည်။

၅ မိနစ် စမ်းကြည့်

binary_search function ကို unsorted list [19, 3, 40, 7, 25] နဲ့ run လုပ်ကြည့်ပါ — result မှန်ကန်ပါသလား စစ်ဆေးကြည့်ပြီး ဘာကြောင့်ဖြစ်နိုင်သလဲ ရှင်းပြကြည့်ပါ။

သတိလေးတစ်ချက်

Unsorted data ပေါ်မှာ binary search ကို run လုပ်ပြီး result မှားနေတာကို မသတိထားမိတတ်တယ် — error မတက်ဘဲ silently wrong index ပြန်လာလို့ debug လုပ်ဖို့ခက်တယ်။

mid ကို `(low + high) // 2` အစား `(low + high) / 2` သုံးပြီး integer index အစား float ပြန်ရလာအောင် လုပ်မိတတ်တယ် (ဒါမှမဟုတ် language တခြားဟာနဲ့ overflow ဖြစ်တတ်တယ်)။

Wikipedia — Binary search algorithmData Structures & Algorithms

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Unsorted data ပေါ်မှာ binary search ကို run လုပ်ပြီး result မှားနေတာကို မသတိထားမိတတ်တယ် — error မတက်ဘဲ silently wrong index ပြန်လာလို့ debug လုပ်ဖို့ခက်တယ်။
  • mid ကို `(low + high) // 2` အစား `(low + high) / 2` သုံးပြီး integer index အစား float ပြန်ရလာအောင် လုပ်မိတတ်တယ် (ဒါမှမဟုတ် language တခြားဟာနဲ့ overflow ဖြစ်တတ်တယ်)။
  • နမူနာ code ကို production system ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test environment တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

binary_search function ကို unsorted list [19, 3, 40, 7, 25] နဲ့ run လုပ်ကြည့်ပါ — result မှန်ကန်ပါသလား စစ်ဆေးကြည့်ပြီး ဘာကြောင့်ဖြစ်နိုင်သလဲ ရှင်းပြကြည့်ပါ။

You'll know it worked when: ပထမဆုံးအကြိမ်မှာ target 25 ရဲ့ index 4 ကို print ထုတ်ပြီး၊ ဒုတိယအကြိမ်မှာ target 5 ရှာမတွေ့လို့ -1 ကို print ထုတ်မည်။