تُرجِمت هذه الدروس تلقائيًا إلى العربية ولم تخضع بعد لمراجعة بشرية. إذا بدت أي صياغة غريبة، فالنسخة الإنجليزية هي المرجع.
تخيل أن الذكاء الاصطناعي يراقب بث الفيديو المباشر بحثًا عن أي نشاط مشبوه. لا يمكنه إعادة مشاهدة التسجيل بأكمله كل ثانية - فهو يحتاج إلى تمرير نافذة الانتباه عبر الدفق، وتتبع السياق الكافي فقط. هذا هو بالضبط ما يفعله نمطا المؤشران والنافذة المنزلقة للبيانات المتسلسلة.
تعمل كلتا الطريقتين على تحويل عمليات المسح بالقوة الغاشمة O(n²) إلى تمريرات O(n) أنيقة.
ضع مرجعين في تسلسل وحركهما وفقًا للقاعدة. هناك نوعان من النكهات الرئيسية.
ابدأ بمؤشر واحد عند كل طرف وحركه إلى الداخل. مثالي للبيانات المرتبة.
مشكلة كلاسيكية - مجموع الزوج: في حالة وجود مصفوفة مرتبة، ابحث عن رقمين يضافان إلى الهدف.
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
نظرًا لأن المصفوفة مرتبة، فإن تحريك left لليمين يزيد المجموع، والتحرك right لليسار يقلله - مما يضمن عدم تفويت زوج صالح أبدًا.
يتحرك كلا المؤشرين للأمام، ولكن بسرعات مختلفة. مفيد في التقسيم أو الكشف عن الدورة.
مثال - إزالة التكرارات في مكانها: يشير المؤشر البطيء إلى موضع الكتابة؛ يقوم مؤشر سريع بالمسح للأمام.
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
في تقنية المؤشرين المتقاربين على مصفوفة مرتبة، ماذا يجب أن تفعل عندما يكون المجموع الحالي أقل من الهدف؟
تحافظ النافذة المنزلقة على تسلسل فرعي متجاور بحجم (ثابت) أو طول متغير، وتحديث المجاميع بشكل متزايد بدلاً من إعادة الحساب من البداية.
سجّل الدخول للانضمام إلى النقاش
قم بتمرير نافذة تحتوي على عناصر k بالضبط عبر المصفوفة.
مثال - الحد الأقصى لمجموع أي عناصر متتالية:
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
تضيف كل خطوة العنصر الجديد الذي يدخل إلى النافذة وتطرح العنصر المغادر - O(1) لكل حركة.
قم بتوسيع النافذة لتشمل المزيد من البيانات، ثم قم بتقليصها عند انتهاك أحد القيود.
مثال - أطول سلسلة فرعية بدون أحرف متكررة:
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
| نمط | حالة استخدام الذكاء الاصطناعي | |---------|-----------| | نافذة ثابتة | اكتشاف الشذوذ خلال قراءات مستشعر k الأخيرة | | نافذة متغيرة | البحث عن أقصر امتداد نصي يحتوي على جميع كلمات الاستعلام (محركات البحث) | | المؤشرات المتقاربة | عمليات فحص فعالة لأقرب جار في أبعاد التضمين المصنفة | | مؤشرات نفس الاتجاه | دمج قوائم النتائج المصنفة من نماذج استرجاع متعددة |
ما النمط الذي ستختاره للعثور على أصغر مصفوفة فرعية يتجاوز مجموعها قيمة معينة؟
ما هو التعقيد الزمني النموذجي الذي يتم تحقيقه عن طريق تحويل حلقة متداخلة ذات قوة غاشمة إلى حل ذو مؤشرين أو نافذة منزلقة؟