Stel je een AI voor die een live videofeed bewaakt op verdachte activiteit. Het kan niet elke seconde de hele opname opnieuw bekijken - het moet een aandachtsvenster over de stream schuiven, met net genoeg context. Dat is precies wat de two pointers en sliding window patronen doen voor sequentiële data.
Beide technieken veranderen brute-force O(n²) scans in elegante O(n) doorlopen.
Plaats twee referenties in een reeks en verplaats ze volgens een regel. Er zijn twee hoofdvarianten.
Begin met één pointer aan elk uiteinde en beweeg ze naar binnen. Ideaal voor gesorteerde data.
Klassiek probleem - Pair Sum: Gegeven een gesorteerde array, vind twee getallen die optellen tot een doel.
function pairSum(arr, target):
left = 0
right = arr.length - 1
while left < right:
sum = arr[left] + arr[right]
if sum == target: return (left, right)
if sum < target: left += 1
else: right -= 1
return null
Omdat de array gesorteerd is, verhoogt het verplaatsen van left naar rechts de som, en verlaagt het verplaatsen van right naar links de som - waardoor geen enkel geldig paar wordt gemist.
Beide pointers bewegen vooruit, maar met verschillende snelheden. Handig voor partitionering of cyclusdetectie.
Voorbeeld - Duplicaten in-place verwijderen: Een langzame pointer markeert de schrijfpositie; een snelle pointer scant vooruit.
function removeDuplicates(arr):
slow = 0
for fast in 1..arr.length - 1:
if arr[fast] != arr[slow]:
slow += 1
arr[slow] = arr[fast]
return slow + 1
Wat moet je bij de convergerende two-pointer techniek op een gesorteerde array doen wanneer de huidige som kleiner is dan het doel?
Sign in to join the discussion
Een sliding window houdt een aaneengesloten deelreeks bij van grootte k (vast) of variabele lengte, en werkt aggregaten incrementeel bij in plaats van helemaal opnieuw te berekenen.
Schuif een window van precies k elementen over de array.
Voorbeeld - Maximale som van k opeenvolgende elementen:
function maxSubarraySum(arr, k):
windowSum = sum(arr[0..k-1])
best = windowSum
for i in k..arr.length - 1:
windowSum += arr[i] - arr[i - k]
best = max(best, windowSum)
return best
Elke stap voegt het nieuwe element toe dat het window binnenkomt en trekt het element af dat vertrekt - O(1) per verplaatsing.
Breid het window uit om meer data op te nemen, en krimp het weer wanneer een beperking wordt geschonden.
Voorbeeld - Langste substring zonder herhalende karakters:
function longestUnique(s):
seen = {}
left = 0
best = 0
for right in 0..s.length - 1:
if s[right] in seen and seen[s[right]] >= left:
left = seen[s[right]] + 1
seen[s[right]] = right
best = max(best, right - left + 1)
return best
| Patroon | AI-toepassing | |---------|--------------| | Vast window | Anomaliedetectie over de laatste k sensormetingen | | Variabel window | De kortste tekstspanne vinden die alle zoekwoorden bevat (zoekmachines) | | Convergerende pointers | Efficiënte nearest-neighbour controles in gesorteerde embedding-dimensies | | Dezelfde-richting pointers | Samenvoegen van gesorteerde resultaatlijsten van meerdere retrieval-modellen |
Welk patroon zou je kiezen om de kleinste subarray te vinden waarvan de som een gegeven waarde overschrijdt?
Wat is de typische tijdscomplexiteit die wordt bereikt door een brute-force geneste lus om te zetten naar een two-pointer of sliding-window oplossing?