Hash ilə interview pattern-ləri
Alqoritm müsahibələrində ən çox işə yarayan tək hərəkət budur: iç-içə iki dövrəni (O(n²)) hash strukturu ilə bir dövrəyə (O(n)) çevirmək.
Məntiq həmişə eynidir. İç-içə dövrə əslində belə soruşur: "bu elementə uyğun gələn başqa element varmı?" Bu sualı hər dəfə massivi gəzərək cavablandırmaq əvəzinə, artıq gördüklərini bir Map və ya Set-də saxlayırsan — və sual O(1) axtarışa çevrilir.
Qiyməti isə O(n) əlavə yaddaşdır. Bu, klassik time–space trade-off-dur: yaddaş verirsən, vaxt alırsan.
Müsahibədə bu keçidi ucadan səsləndirmək çox güclü siqnaldır: "Sadəlövh həll iç-içə dövrə ilə O(n²)-dir. Amma mən artıq gördüyüm dəyərləri hash map-da saxlasam, hər axtarış O(1) olur və ümumi həll O(n) vaxt, O(n) yaddaşa enir."
| Pattern | Struktur | Nə vaxt tanıyırsan | Mürəkkəblik |
|---|---|---|---|
| Frequency counter | Map: dəyər → say | "neçə dəfə", "ən çox təkrarlanan", "anagram-dırmı" | O(n) vaxt / O(k) yaddaş |
| Complement lookup | Map: dəyər → indeks | "cəmi target olan iki ədəd" | O(n) / O(n) |
| Bucketing / grouping | Map: normallaşdırılmış açar → siyahı | "qruplaşdır", "eyni ... olanları birləşdir" | O(n·k) / O(n) |
| Seen-set | Set: görülmüş elementlər | "təkrar varmı", "dövr varmı", "unikal" | O(n) / O(n) |
| Prefix sum + map | Map: prefiks cəmi → say/indeks | "cəmi k olan altmassivlərin sayı" | O(n) / O(n) |
İki pattern xüsusi izah tələb edir, çünki onların "kliki" hiss olunmadan sadəcə əzbərlənir.
Complement lookup (two-sum). Sadəlövh həll hər cütü yoxlayır. Əvəzində belə düşün: nums[i] üçün lazım olan tərəf-müqabil dəqiq bəllidir — target - nums[i]. Deməli sual "cütləri gəz" deyil, "bu konkret dəyəri əvvəl görmüşəmmi?" Map-da hər gördüyün dəyəri indeksi ilə saxlayırsan və bir keçiddə cavabı tapırsan. Vacib incəlik: əvvəl get, sonra set — əks halda element özü ilə cütləşə bilər.
Prefix sum + map. "Cəmi k olan neçə altmassiv var?" sualında sum(i..j) = prefix[j] - prefix[i-1]. Bunu çevirsək: prefix[i-1] = prefix[j] - k. Yəni j nöqtəsində dayanıb soruşursan: "indiyə qədər prefix - k dəyərini neçə dəfə görmüşəm?" Map: prefiks cəmi → neçə dəfə göründü. Başlanğıc şərti mütləqdir: counts.set(0, 1) — massivin əvvəlindən başlayan altmassivləri saymaq üçün. Bu bir sətri unutmaq bu tapşırıqda ən çox rast gəlinən səhvdir.
İnterview ipucu. Bu mövzuda müsahiblərin axtardığı yalnız düzgün kod deyil — düşüncə ardıcıllığıdır. Güclü namizədin danışıq şablonu belədir:
1. "Sadəlövh həll iç-içə dövrədir — O(n²)." 2. "Amma mən əslində 'bu dəyəri əvvəl görmüşəmmi?' soruşuram, bu isə hash lookup-dır." 3. "Deməli bir keçiddə O(n) vaxt, O(n) əlavə yaddaşla həll edə bilərəm." 4. "Sərhəd halları: boş massiv, təkrarlanan dəyərlər, elementin özü ilə cütləşməsi."
Ən çox buraxılan üç şey: (1) yaddaş qiymətini deməmək — həmişə O(n) əlavə yaddaşı ucadan qeyd et; (2) sərhəd hallarını atlamaq; (3) hash-in orta halda O(1) olduğunu, pis halda deyil, dəqiqləşdirməmək.
Bir də dürüstlük məsələsi: əgər n çox kiçikdirsə (məsələn 100-ə qədər), O(n²) həll tamam qəbul olunandır və bunu demək zəiflik yox, mühəndis yetkinliyi sayılır.