Sparround

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."

PatternStrukturNə vaxt tanıyırsanMürəkkəblik
Frequency counterMap: dəyər → say"neçə dəfə", "ən çox təkrarlanan", "anagram-dırmı"O(n) vaxt / O(k) yaddaş
Complement lookupMap: dəyər → indeks"cəmi target olan iki ədəd"O(n) / O(n)
Bucketing / groupingMap: normallaşdırılmış açar → siyahı"qruplaşdır", "eyni ... olanları birləşdir"O(n·k) / O(n)
Seen-setSet: görülmüş elementlər"təkrar varmı", "dövr varmı", "unikal"O(n) / O(n)
Prefix sum + mapMap: 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.