Diese Lektion wurde automatisch ins Deutsche übersetzt und noch nicht von einem Menschen geprüft. Falls etwas seltsam klingt, gilt die englische Fassung.
Stellen Sie sich eine KI vor, die einen Live-Video-Feed auf verdächtige Aktivitäten überwacht. Es kann nicht jede Sekunde die gesamte Aufnahme erneut ansehen – es muss ein Aufmerksamkeitsfenster über den Stream gleiten lassen und dabei gerade genug Kontext im Auge behalten. Das ist genau das, was die Muster zwei Zeiger und gleitendes Fenster für sequentielle Daten bewirken.
Beide Techniken verwandeln Brute-Force-O(n²)-Scans in elegante O(n)-Durchläufe.
Platzieren Sie zwei Referenzen in einer Sequenz und verschieben Sie sie gemäß einer Regel. Es gibt zwei Hauptgeschmacksrichtungen.
Beginnen Sie an jedem Ende einen Zeiger und bewegen Sie ihn nach innen. Perfekt für sortierte Daten.
Klassisches Problem – Paarsumme: Finden Sie bei einem gegebenen sortierten Array zwei Zahlen, die sich zu einem Ziel addieren.
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
Da das Array sortiert ist, erhöht das Verschieben von left nach rechts die Summe und das Verschieben von right nach links verringert sie – so wird garantiert, dass wir nie ein gültiges Paar verpassen.
Beide Zeiger bewegen sich vorwärts, allerdings mit unterschiedlicher Geschwindigkeit. Nützlich für Partitionierung oder Zykluserkennung.
Beispiel – Duplikate direkt entfernen: Ein langsamer Zeiger markiert die Schreibposition; Ein schneller Zeiger scannt vorwärts.
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
Anmelden um an der Diskussion teilzunehmen
Was sollten Sie bei der konvergierenden Zwei-Zeiger-Technik für ein sortiertes Array tun, wenn die aktuelle Summe kleiner als das Ziel ist?
Ein Schiebefenster verwaltet eine zusammenhängende Teilsequenz der Größe k (fest) oder variabler Länge und aktualisiert Aggregate inkrementell, anstatt sie von Grund auf neu zu berechnen.
Schieben Sie ein Fenster mit genau k Elementen über das Array.
Beispiel – Maximale Summe beliebiger k aufeinanderfolgender Elemente:
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
Bei jedem Schritt wird das neue Element, das in das Fenster eintritt, hinzugefügt und dasjenige, das es verlässt, subtrahiert – O(1) pro Zug.
Erweitern Sie das Fenster, um mehr Daten einzuschließen, und verkleinern Sie es dann, wenn eine Einschränkung verletzt wird.
Beispiel – Längster Teilstring ohne sich wiederholende Zeichen:
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
| Muster | KI-Anwendungsfall | |---------|------------| | Festes Fenster | Anomalieerkennung über die letzten k Sensormesswerte | | Variables Fenster | Finden der kürzesten Textspanne, die alle Suchbegriffe enthält (Suchmaschinen) | | Konvergierende Zeiger | Effiziente Nächste-Nachbarn-Prüfungen in sortierten Einbettungsdimensionen | | Gleichsinnige Zeiger | Sortierte Ergebnislisten aus mehreren Retrieval-Modellen zusammenführen |
Welches Muster würden Sie wählen, um das kleinste Subarray zu finden, dessen Summe einen bestimmten Wert überschreitet?
Wie hoch ist die typische Zeitkomplexität, die durch die Umwandlung einer verschachtelten Brute-Force-Schleife in eine Zwei-Zeiger- oder Schiebefensterlösung erreicht wird?