தமிழ்

சக்திவாய்ந்த டைனமிக் ப்ரோகிராமிங் நுட்பமான மெமோயிசேஷனை, நடைமுறை எடுத்துக்காட்டுகள் மற்றும் உலகளாவிய கண்ணோட்டங்களுடன் ஆராயுங்கள். உங்கள் அல்காரிதம் திறன்களை மேம்படுத்தி, சிக்கலான பிரச்சனைகளை திறமையாக தீர்க்கவும்.

டைனமிக் ப்ரோகிராமிங்கில் தேர்ச்சி பெறுதல்: திறமையான சிக்கல் தீர்வுக்கான மெமோயிசேஷன் முறைகள்

டைனமிக் ப்ரோகிராமிங் (DP) என்பது ஒரு சக்திவாய்ந்த அல்காரிதம் நுட்பமாகும், இது உகப்பாக்கச் சிக்கல்களை சிறிய, ஒன்றுடன் ஒன்று மேற்பொருந்தும் துணைச் சிக்கல்களாக உடைத்துத் தீர்க்கப் பயன்படுகிறது. இந்த துணைச் சிக்கல்களை மீண்டும் மீண்டும் தீர்ப்பதற்குப் பதிலாக, DP அவற்றின் தீர்வுகளைச் சேமித்து, தேவைப்படும்போது அவற்றை மீண்டும் பயன்படுத்துகிறது, இது செயல்திறனை கணிசமாக மேம்படுத்துகிறது. மெமோயிசேஷன் என்பது DP-யின் ஒரு குறிப்பிட்ட மேலிருந்து கீழ் அணுகுமுறையாகும், இதில் நாம் ஒரு கேச் (பெரும்பாலும் ஒரு அகராதி அல்லது வரிசை) பயன்படுத்தி விலையுயர்ந்த செயல்பாட்டு அழைப்புகளின் முடிவுகளைச் சேமித்து, அதே உள்ளீடுகள் மீண்டும் ஏற்படும்போது சேமிக்கப்பட்ட முடிவைத் திருப்பித் தருகிறோம்.

மெமோயிசேஷன் என்றால் என்ன?

மெமோயிசேஷன் என்பது அடிப்படையில் கணக்கீட்டு ரீதியாக கடினமான செயல்பாட்டு அழைப்புகளின் முடிவுகளை "நினைவில்" வைத்து பின்னர் மீண்டும் பயன்படுத்துவதாகும். இது ஒரு வகையான கேச்சிங் ஆகும், இது தேவையற்ற கணக்கீடுகளைத் தவிர்ப்பதன் மூலம் செயலாக்கத்தை துரிதப்படுத்துகிறது. உங்களுக்குத் தேவைப்படும் ஒவ்வொரு முறையும் தகவலை மீண்டும் பெறுவதற்குப் பதிலாக, ஒரு குறிப்புப் புத்தகத்தில் தகவலைத் தேடுவதைப் போல இதை நினைத்துப் பாருங்கள்.

மெமோயிசேஷனின் முக்கிய கூறுகள்:

மெமோயிசேஷனை ஏன் பயன்படுத்த வேண்டும்?

மெமோயிசேஷனின் முதன்மை நன்மை மேம்பட்ட செயல்திறன் ஆகும், குறிப்பாக சாதாரண முறையில் தீர்க்கப்படும்போது அதிவேக நேரச் சிக்கலைக் கொண்ட சிக்கல்களுக்கு. தேவையற்ற கணக்கீடுகளைத் தவிர்ப்பதன் மூலம், மெமோயிசேஷன் செயலாக்க நேரத்தை அதிவேகத்திலிருந்து பல்லுறுப்புக்கோவையாகக் குறைக்கலாம், இது தீர்க்க முடியாத சிக்கல்களை தீர்க்கக்கூடியதாக மாற்றுகிறது. இது பல நிஜ-உலகப் பயன்பாடுகளில் முக்கியமானது, அவை:

மெமோயிசேஷன் முறைகள் மற்றும் எடுத்துக்காட்டுகள்

நடைமுறை எடுத்துக்காட்டுகளுடன் சில பொதுவான மெமோயிசேஷன் முறைகளை ஆராய்வோம்.

1. கிளாசிக் ஃபைபோனச்சி தொடர்

ஃபைபோனச்சி தொடர் மெமோயிசேஷனின் சக்தியை நிரூபிக்கும் ஒரு சிறந்த எடுத்துக்காட்டு. தொடர் பின்வருமாறு வரையறுக்கப்படுகிறது: F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) n > 1 க்கு. ஒரு சாதாரண ரெக்கர்சிவ் செயலாக்கம் தேவையற்ற கணக்கீடுகள் காரணமாக அதிவேக நேரச் சிக்கலைக் கொண்டிருக்கும்.

சாதாரண ரெக்கர்சிவ் செயலாக்கம் (மெமோயிசேஷன் இல்லாமல்)

def fibonacci_naive(n):
  if n <= 1:
    return n
  return fibonacci_naive(n-1) + fibonacci_naive(n-2)

இந்த செயலாக்கம் மிகவும் திறனற்றது, ஏனெனில் இது ஒரே ஃபைபோனச்சி எண்களை பலமுறை மீண்டும் கணக்கிடுகிறது. எடுத்துக்காட்டாக, `fibonacci_naive(5)` ஐக் கணக்கிட, `fibonacci_naive(3)` இரண்டு முறையும், `fibonacci_naive(2)` மூன்று முறையும் கணக்கிடப்படுகிறது.

மெமோயிசேஷன் செய்யப்பட்ட ஃபைபோனச்சி செயலாக்கம்

def fibonacci_memo(n, memo={}):
  if n in memo:
    return memo[n]
  if n <= 1:
    return n
  memo[n] = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo)
  return memo[n]

இந்த மெமோயிசேஷன் செய்யப்பட்ட பதிப்பு செயல்திறனை கணிசமாக மேம்படுத்துகிறது. `memo` அகராதி முன்னர் கணக்கிடப்பட்ட ஃபைபோனச்சி எண்களின் முடிவுகளை சேமிக்கிறது. F(n) ஐக் கணக்கிடுவதற்கு முன், செயல்பாடு அது ஏற்கனவே `memo` வில் உள்ளதா என சரிபார்க்கிறது. இருந்தால், சேமிக்கப்பட்ட மதிப்பு நேரடியாக திருப்பியளிக்கப்படுகிறது. இல்லையெனில், மதிப்பு கணக்கிடப்பட்டு, `memo` வில் சேமிக்கப்பட்டு, பின்னர் திருப்பியளிக்கப்படுகிறது.

எடுத்துக்காட்டு (பைதான்):

print(fibonacci_memo(10)) # வெளியீடு: 55
print(fibonacci_memo(20)) # வெளியீடு: 6765
print(fibonacci_memo(30)) # வெளியீடு: 832040

மெமோயிசேஷன் செய்யப்பட்ட ஃபைபோனச்சி செயல்பாட்டின் நேர சிக்கல் O(n) ஆகும், இது சாதாரண ரெக்கர்சிவ் செயலாக்கத்தின் அதிவேக நேர சிக்கலை விட குறிப்பிடத்தக்க முன்னேற்றமாகும். `memo` அகராதி காரணமாக இட சிக்கலும் O(n) ஆகும்.

2. கட்டம் கடத்தல் (பாதைகளின் எண்ணிக்கை)

m x n அளவுள்ள ஒரு கட்டத்தைக் கவனியுங்கள். நீங்கள் வலதுபுறம் அல்லது கீழ்நோக்கி மட்டுமே நகர முடியும். மேல்-இடது மூலையிலிருந்து கீழ்-வலது மூலைக்கு எத்தனை தனித்துவமான பாதைகள் உள்ளன?

சாதாரண ரெக்கர்சிவ் செயலாக்கம்

def grid_paths_naive(m, n):
  if m == 1 or n == 1:
    return 1
  return grid_paths_naive(m-1, n) + grid_paths_naive(m, n-1)

இந்த சாதாரண செயலாக்கம் மேலடுக்கு துணை சிக்கல்கள் காரணமாக அதிவேக நேர சிக்கலைக் கொண்டுள்ளது. ஒரு செல் (m, n) க்கான பாதைகளின் எண்ணிக்கையை கணக்கிட, நாம் (m-1, n) மற்றும் (m, n-1) க்கான பாதைகளின் எண்ணிக்கையை கணக்கிட வேண்டும், இது அதன் முன்னோடிகளுக்கான பாதைகளை கணக்கிடுவதை கோருகிறது, இப்படியே தொடரும்.

மெமோயிசேஷன் செய்யப்பட்ட கட்டம் கடத்தல் செயலாக்கம்

def grid_paths_memo(m, n, memo={}):
  if (m, n) in memo:
    return memo[(m, n)]
  if m == 1 or n == 1:
    return 1
  memo[(m, n)] = grid_paths_memo(m-1, n, memo) + grid_paths_memo(m, n-1, memo)
  return memo[(m, n)]

இந்த மெமோயிசேஷன் செய்யப்பட்ட பதிப்பில், `memo` அகராதி ஒவ்வொரு செல் (m, n)-க்கான பாதைகளின் எண்ணிக்கையை சேமிக்கிறது. செயல்பாடு முதலில் தற்போதைய செல்லுக்கான முடிவு ஏற்கனவே `memo` வில் உள்ளதா என சரிபார்க்கிறது. இருந்தால், சேமிக்கப்பட்ட மதிப்பு திருப்பியளிக்கப்படுகிறது. இல்லையெனில், மதிப்பு கணக்கிடப்பட்டு, `memo` வில் சேமிக்கப்பட்டு, திருப்பியளிக்கப்படுகிறது.

எடுத்துக்காட்டு (பைதான்):

print(grid_paths_memo(3, 3)) # வெளியீடு: 6
print(grid_paths_memo(5, 5)) # வெளியீடு: 70
print(grid_paths_memo(10, 10)) # வெளியீடு: 48620

மெமோயிசேஷன் செய்யப்பட்ட கட்டம் கடத்தல் செயல்பாட்டின் நேர சிக்கல் O(m*n) ஆகும், இது சாதாரண ரெக்கர்சிவ் செயலாக்கத்தின் அதிவேக நேர சிக்கலை விட குறிப்பிடத்தக்க முன்னேற்றமாகும். `memo` அகராதி காரணமாக இட சிக்கலும் O(m*n) ஆகும்.

3. நாணய மாற்று (குறைந்தபட்ச நாணயங்களின் எண்ணிக்கை)

நாணய வகைகளின் தொகுப்பு மற்றும் ஒரு இலக்குத் தொகை கொடுக்கப்பட்டால், அந்தத் தொகையை உருவாக்கத் தேவையான குறைந்தபட்ச நாணயங்களின் எண்ணிக்கையைக் கண்டறியவும். ஒவ்வொரு நாணய வகையின் வரம்பற்ற இருப்பு உங்களிடம் உள்ளது என்று நீங்கள் கருதலாம்.

சாதாரண ரெக்கர்சிவ் செயலாக்கம்

def coin_change_naive(coins, amount):
  if amount == 0:
    return 0
  if amount < 0:
    return float('inf')
  min_coins = float('inf')
  for coin in coins:
    num_coins = 1 + coin_change_naive(coins, amount - coin)
    min_coins = min(min_coins, num_coins)
  return min_coins

இந்த சாதாரண ரெக்கர்சிவ் செயலாக்கம் நாணயங்களின் சாத்தியமான அனைத்து சேர்க்கைகளையும் ஆராய்கிறது, இது அதிவேக நேர சிக்கலை விளைவிக்கிறது.

மெமோயிசேஷன் செய்யப்பட்ட நாணய மாற்று செயலாக்கம்

def coin_change_memo(coins, amount, memo={}):
  if amount in memo:
    return memo[amount]
  if amount == 0:
    return 0
  if amount < 0:
    return float('inf')
  min_coins = float('inf')
  for coin in coins:
    num_coins = 1 + coin_change_memo(coins, amount - coin, memo)
    min_coins = min(min_coins, num_coins)
  memo[amount] = min_coins
  return min_coins

மெமோயிசேஷன் செய்யப்பட்ட பதிப்பு ஒவ்வொரு தொகைக்கும் தேவையான குறைந்தபட்ச நாணயங்களின் எண்ணிக்கையை `memo` அகராதியில் சேமிக்கிறது. ஒரு குறிப்பிட்ட தொகைக்கான குறைந்தபட்ச நாணயங்களின் எண்ணிக்கையைக் கணக்கிடுவதற்கு முன், செயல்பாடு அந்த முடிவு ஏற்கனவே `memo` வில் உள்ளதா என சரிபார்க்கிறது. இருந்தால், சேமிக்கப்பட்ட மதிப்பு திருப்பியளிக்கப்படுகிறது. இல்லையெனில், மதிப்பு கணக்கிடப்பட்டு, `memo` வில் சேமிக்கப்பட்டு, திருப்பியளிக்கப்படுகிறது.

எடுத்துக்காட்டு (பைதான்):

coins = [1, 2, 5]
amount = 11
print(coin_change_memo(coins, amount)) # வெளியீடு: 3

coins = [2]
amount = 3
print(coin_change_memo(coins, amount)) # வெளியீடு: inf (மாற்றம் செய்ய முடியாது)

மெமோயிசேஷன் செய்யப்பட்ட நாணய மாற்று செயல்பாட்டின் நேர சிக்கல் O(amount * n) ஆகும், இங்கு n என்பது நாணய வகைகளின் எண்ணிக்கை. `memo` அகராதி காரணமாக இட சிக்கல் O(amount) ஆகும்.

மெமோயிசேஷன் மீதான உலகளாவிய கண்ணோட்டங்கள்

டைனமிக் ப்ரோகிராமிங் மற்றும் மெமோயிசேஷனின் பயன்பாடுகள் உலகளாவியவை, ஆனால் தீர்க்கப்படும் குறிப்பிட்ட சிக்கல்கள் மற்றும் தரவுத்தொகுப்புகள் பெரும்பாலும் வெவ்வேறு பொருளாதார, சமூக மற்றும் தொழில்நுட்ப சூழல்கள் காரணமாக பிராந்தியங்களுக்கு இடையில் வேறுபடுகின்றன. உதாரணமாக:

மெமோயிசேஷனுக்கான சிறந்த நடைமுறைகள்

மேம்பட்ட மெமோயிசேஷன் நுட்பங்கள்

முடிவுரை

மெமோயிசேஷன் என்பது ரெக்கர்சிவ் அல்காரிதம்களை மேம்படுத்துவதற்கும், விலையுயர்ந்த செயல்பாட்டு அழைப்புகளின் முடிவுகளை சேமிப்பதற்கும் ஒரு சக்திவாய்ந்த நுட்பமாகும். மெமோயிசேஷனின் கொள்கைகளைப் புரிந்துகொண்டு, அவற்றை மூலோபாய ரீதியாகப் பயன்படுத்துவதன் மூலம், உங்கள் குறியீட்டின் செயல்திறனை கணிசமாக மேம்படுத்தலாம் மற்றும் சிக்கலான சிக்கல்களை மிகவும் திறமையாக தீர்க்கலாம். ஃபைபோனச்சி எண்கள் முதல் கட்டம் கடத்தல் மற்றும் நாணய மாற்று வரை, மெமோயிசேஷன் பரந்த அளவிலான கணக்கீட்டு சவால்களைச் சமாளிக்க ஒரு பல்துறை கருவித்தொகுப்பை வழங்குகிறது. நீங்கள் உங்கள் அல்காரிதம் திறன்களை தொடர்ந்து வளர்த்துக் கொள்ளும்போது, மெமோயிசேஷனில் தேர்ச்சி பெறுவது உங்கள் சிக்கல் தீர்க்கும் ஆயுதக் களஞ்சியத்தில் ஒரு மதிப்புமிக்க சொத்தாக சந்தேகத்திற்கு இடமின்றி நிரூபிக்கப்படும்.

உங்கள் சிக்கல்களின் உலகளாவிய சூழலைக் கருத்தில் கொள்ள நினைவில் கொள்ளுங்கள், உங்கள் தீர்வுகளை வெவ்வேறு பிராந்தியங்கள் மற்றும் கலாச்சாரங்களின் குறிப்பிட்ட தேவைகள் மற்றும் கட்டுப்பாடுகளுக்கு ஏற்ப மாற்றியமைக்கவும். உலகளாவிய முன்னோக்கைத் தழுவுவதன் மூலம், பரந்த பார்வையாளர்களுக்குப் பயனளிக்கும் மிகவும் பயனுள்ள மற்றும் தாக்கத்தை ஏற்படுத்தும் தீர்வுகளை நீங்கள் உருவாக்க முடியும்.