Big O Notation
Big O yozuvi
Ikki yo'lda maktabga borish mumkin: biri 500 metr, ikkinchisi 5 kilometr. Masofaning aniq metri unchalik muhim emas — muhimi, qaysi yo'l 10 barobar uzoqroq ekanini bilish. Big O yozuvi ham dasturlashda xuddi shunday ishlaydi: algoritm aniq necha millisekund ishlashini emas, balki ma'lumot kattalashganda vaqt qanday o'sishini tasvirlaydi.
Shu kursda ko'rgan ikkita qidiruv usulini solishtiramiz: oddiy "boshidan oxirigacha qidirish" (O(n), "chiziqli") va Binary Search (O(log n), "logarifmik"). O(n) degani: ma'lumot 2 barobar oshsa, vaqt ham taxminan 2 barobar oshadi. O(log n) degani: ma'lumot 2 barobar (hatto 1000 barobar) oshsa ham, vaqt juda oz oshadi — chunki har qadamda yarmi tashlanib boriladi.
package main
import "fmt"
func linearSearchCount(nums []int, target int) int {
comparisons := 0
for _, n := range nums {
comparisons++
if n == target {
break
}
}
return comparisons
}
func binarySearchCount(nums []int, target int) int {
comparisons := 0
low, high := 0, len(nums)-1
for low <= high {
comparisons++
mid := (low + high) / 2
if nums[mid] == target {
break
}
if nums[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return comparisons
}
func main() {
nums := make([]int, 1000)
for i := range nums {
nums[i] = i
}
fmt.Println(linearSearchCount(nums, 999)) // eng oxirgi element
fmt.Println(binarySearchCount(nums, 999))
}1000 ta elementli ro'yxatda, eng oxirgi elementni qidirish uchun chiziqli qidiruvga 1000 marta solishtirish kerak bo'ladi — chunki u bittalab, boshidan yuradi. Binary Search'ga esa bor-yo'g'i 10 marta solishtirish yetadi! Bu tasodif emas: log₂(1000) ≈ 10. Agar ro'yxat 1 million elementli bo'lsa ham, Binary Search'ga faqat ~20 marta solishtirish kerak bo'lardi — chiziqli qidiruvga esa 1 million marta.
Big O'da odatda uchraydigan darajalar (tezdan sekinga): O(1) (doimiy — masalan xarita orqali qidirish), O(log n) (Binary Search), O(n) (chiziqli qidiruv), O(n log n) (yaxshi saralash algoritmlari), O(n²) (Bubble Sort — ikkita ichma-ich sikl). Kod yozayotganda "bu ichma-ich sikl bormi?" degan savol — ko'pincha "bu O(n²) bo'lib qolmayaptimi?" degan savolning boshqacha ko'rinishi.
>_ Exercise
Ikkita algoritm uchun solishtirish sonini har xil hajmda o'lchang.
- •100 va 10000 elementli ro'yxatlarda linearSearchCount(nums, oxirgi_element) ni chaqiring
- •har ikkalasi uchun natijani chop eting (100 uchun ~100, 10000 uchun ~10000 chiqishi kerak)
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Big O ma'lumot hajmi oshganda algoritm vaqtining qanday o'sishini tasvirlaydi (aniq millisekundlarni emas) — O(log n) (Binary Search) O(n) (chiziqli qidiruv)dan katta ma'lumotda tubdan tezroq ishlaydi.
NEXT UP
Two Pointer Technique
$ go run main.go
Kodingizni ishga tushiring