ఒక AI ప్రత్యక్ష వీడియో ఫీడ్ లో అనుమానాస్పద కార్యకలాపాలను పర్యవేక్షిస్తుందని ఊహించుకోండి. ప్రతి సెకనూ మొత్తం రికార్డింగ్ మళ్ళీ చూడటం సాధ్యం కాదు - ప్రవాహం మీద ఒక అటెన్షన్ విండో జారాలి, అవసరమైనంత సందర్భం మాత్రమే ఉంచుకుంటూ. రెండు పాయింటర్లు మరియు స్లైడింగ్ విండో నమూనాలు వరుసబద్ధమైన డేటా తో సరిగ్గా ఇదే చేస్తాయి.
రెండు పద్ధతులు బ్రూట్ ఫోర్స్ O(n²) స్కాన్లు ను చక్కని O(n) పాస్లు గా మారుస్తాయి.
ఒక వరుస లో రెండు సూచనలు ఉంచి, ఒక నియమం ప్రకారం వాటిని మార్చండి. రెండు ప్రధాన రకాలు ఉన్నాయి.
ఒక పాయింటర్ ప్రారంభంలో, మరొకటి చివరలో ఉంచి, లోపలికి మార్చండి. క్రమబద్ధమైన డేటా కు అద్భుతం.
Classic సమస్య - Pair మొత్తం: ఒక క్రమబద్ధమైన అరే ఇస్తే, లక్ష్య కు జోడించు అయ్యే రెండు సంఖ్యలు కనుగొనండి.
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 (స్థిర) లేదా మారే, మరియు సంగ్రహ విలువలు ను మొదటి నుంచి నుండి మళ్లీ లెక్కిస్తుంది చేయకుండా దశలవారీగా నవీకరిస్తుంది.
సరిగ్గా k ఎలిమెంట్లు ఉన్న విండో ను అరే మీద slide చేయండి.
ఉదాహరణ - ఏదైనా 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
| నమూనా | AI వాడండి సందర్భం | |---------|------------| | స్థిర విండో | చివరి k సెన్సార్ రీడింగ్లు మీద అసాధారణత గుర్తింపు | | మారే విండో | అన్ని క్వెరీ కీలకపదాలు ఉన్న అతి చిన్న టెక్స్ట్ విస్తృతి కనుగొనడం (సెర్చ్ ఇంజిన్లు) | | కలిసే పాయింటర్లు | క్రమబద్ధమైన ఎంబెడ్డింగ్ పరిమాణాలు లో సమర్థ సమీప పొరుగు తనిఖీలు | | అదే-దిశ పాయింటర్లు | అనేక రిట్రీవల్ మోడళ్లు నుండి క్రమబద్ధమైన ఫలితం జాబితాలు ను మర్జ్ చేయడం |
ఇచ్చిన విలువ కంటే ఎక్కువ మొత్తం ఉన్న అతి చిన్న ఉప-అరే కనుగొనడానికి ఏ నమూనా ఎంచుకుంటారు?
Brute-force అంతర్గత లూప్ ను రెండు-పాయింటర్ లేదా స్లైడింగ్-విండో పరిష్కారం గా మార్చినప్పుడు సాధారణంగా ఏ సమయం క్లిష్టత వస్తుంది?