கோட்ஜிம் பல்கலைக்கழகப் பாடத்தின் ஒரு பகுதியாக வழிகாட்டியுடன் விரிவுரைத் துணுக்கு. முழு பாடத்திற்கும் பதிவு செய்யவும்.


"வாழ்த்துக்கள், அமிகோ!"

"ஹலோ ரிஷி!"

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

"ம்ம்... என்ன அர்த்தம்?"

"வரிசையின் செல்கள் ஒரு நெடுவரிசை (அல்லது வரிசை) மட்டுமல்ல, ஒரு செவ்வக அட்டவணையையும் குறிக்கும்.

int[][]name = new int[width][height];

" வரிசை மாறியின் பெயர் எங்கே , அகலம் என்பது அட்டவணையின் அகலம் (கலங்களில்), மற்றும் உயரம் என்பது அட்டவணை உயரம். ஒரு உதாரணத்தைப் பாருங்கள்:

int[][] data = new int[2][5];
data[1][1] = 5;
நாங்கள் இரு பரிமாண வரிசையை உருவாக்குகிறோம்: 2 நெடுவரிசைகள் மற்றும் 5 வரிசைகள்.
செல் (1,1) இல் 5 ஐ எழுதுகிறோம்.

"இது நினைவகத்தில் எப்படி இருக்கும்:

இரு பரிமாண வரிசைகள்

"இரு பரிமாண வரிசைகளுக்கு, நீங்கள் வேகமான துவக்கத்தையும் பயன்படுத்தலாம்:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

"ஹ்ம்ம்... இப்போது அது சுவாரஸ்யமானது. முதல் உள் அடைப்புக்குறிக்குள் ஒரு தனிமத்தைக் குறிக்கிறது என்று கற்பனை செய்தால், அடுத்தது இரண்டாவது... எனவே இரு பரிமாண வரிசை என்பது வரிசைகளின் வரிசையைப் போன்றதா?"

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

"என்னிடம் அது பற்றிய ஒரு மனப் படம் உள்ளது. இந்த இரு பரிமாண வரிசைகள் எதற்காகப் பயன்படுத்தப்படுகின்றன?"

"புரோகிராமருக்கு இரு பரிமாண அணிவரிசைகள் அடிக்கடி தேவைப்படுகின்றன. நீங்கள் கூர்ந்து கவனித்தால், ஏறக்குறைய எந்த போர்டு கேமும் ஆஃப்-தி-ஷெல்ஃப் இரு பரிமாண வரிசையைப் பயன்படுத்தி செயல்படுத்தப்படுகிறது: செஸ், செக்கர்ஸ், டிக்-டாக்-டோ, கடல் போர் போன்றவை:"

கடல் போர்

"எனக்கு புரிந்தது! சதுரங்கம் அல்லது கடல் போர் இரண்டு பரிமாண வரிசைகளுக்கு சரியாக பொருந்துகிறது!"

"ஆம், ஆனால் நீங்கள் செல் ஆயத்தொகுப்புகளாக எண்களைப் பயன்படுத்த வேண்டும். 'pawn e2-e4' அல்ல, ஆனால் 'pawn (5,2) -> (5,4)'. ஒரு புரோகிராமராக உங்களுக்கு இது இன்னும் எளிதாக இருக்கும். "

வரிசைகளில் உறுப்புகளை வரிசைப்படுத்துதல்: (x, y) அல்லது (y, x)

"இரு பரிமாண வரிசைகளை உருவாக்குவது ஒரு சுவாரசியமான இக்கட்டான நிலையை எழுப்புகிறது. பயன்படுத்தி ஒரு வரிசையை உருவாக்கும் போது , ​​'இரண்டு வரிசைகள் மற்றும் 5 நெடுவரிசைகள்new int [2][5]; ' கொண்ட அட்டவணை நம்மிடம் உள்ளதா அல்லது 'இரண்டு நெடுவரிசைகள் மற்றும் 5 வரிசைகள்' உள்ளதா?"

"வேறு வார்த்தைகளில் கூறுவதானால், நாம் முதலில் அகலத்தையும் பின்னர் 'உயரம்... அல்லது நேர்மாறாகவும், முதலில் உயரத்தையும் பின்னர் அகலத்தையும் குறிப்பிடுகிறோமா என்பது முற்றிலும் தெளிவாக இல்லை?"

"ஆமாம், இது தான் தடுமாற்றம். மேலும் திட்டவட்டமான பதில் இல்லை."

"என்ன செய்ய?"

"முதலாவதாக, நமது இரு பரிமாண வரிசை உண்மையில் நினைவகத்தில் எவ்வாறு சேமிக்கப்படுகிறது என்பதைப் புரிந்துகொள்வது அவசியம் . இயற்கையாகவே, கணினி நினைவகத்தில் உண்மையில் எந்த அட்டவணையும் இல்லை: நினைவகத்தில் உள்ள ஒவ்வொரு இடத்திற்கும் ஒரு வரிசை எண் முகவரி உள்ளது: 0, 1, 2, ... எங்களைப் பொறுத்தவரை, இது 2 × 5 அட்டவணை, ஆனால் நினைவகத்தில் இது வெறும் 10 கலங்கள், அதற்கு மேல் எதுவும் இல்லை. வரிசைகள் மற்றும் நெடுவரிசைகளாகப் பிரிக்க முடியாது."

"நான் அதை புரிந்துகொண்டேன். எந்த பரிமாணம் முதலில் வருகிறது - அகலம் அல்லது உயரம் என்பதை எப்படி தீர்மானிப்பது?"

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

"அப்படியா? சரி, நம்மால் போராட முடியவில்லை என்றால், முதலில் அகலம் மற்றும் உயரம்?"

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

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

"அப்படியானால் அது நமக்கு என்ன செய்யும்?"

“ஏதாவது கவனிச்சீங்களா? இது நம்மிடம் இருந்தால் என்ன?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

"எங்கள் தரவை குறியீட்டு வரியில் வரியாக எழுதினால், 2 வரிசைகள் மற்றும் 5 நெடுவரிசைகள் கொண்ட அட்டவணையைப் பெறுவோம்."

"இப்போது நான் பார்க்கிறேன். 2 என்பது உயரம், 5 என்பது அகலம்... அப்படியானால் நாம் எந்த விருப்பத்தைப் பயன்படுத்த வேண்டும்?"

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

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

"நிறைய கணிதம் மற்றும் ஒருங்கிணைப்புகளுடன் (உதாரணமாக, கேம் என்ஜின்கள்) பணிபுரியும் திட்டத்தில் நீங்கள் இருப்பதைக் கண்டால், குறியீடு பெரும்பாலும் 'அகலம் x உயரம்' அணுகுமுறையைப் பின்பற்றும்.

இரு பரிமாண அணிவரிசைகள் எவ்வாறு வரிசைப்படுத்தப்படுகின்றன

"இப்போது, ​​பாடத்தின் தொடக்கத்தில் நீங்கள் கவனித்த இரு பரிமாண வரிசைகளின் சிறப்பு அம்சம் உங்களுக்கு நினைவிருக்கிறதா?"

"ஆம்! இரு பரிமாண வரிசைகள் உண்மையில் வரிசைகளின் வரிசைகள்தான்!"

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

இரு பரிமாண அணிவரிசைகள் எவ்வாறு வரிசைப்படுத்தப்படுகின்றன

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

"அருமை! ஆனால் அது நமக்கு என்ன தருகிறது?"

"ஒரு 'கன்டெய்னர் ஆஃப் வரிசைகள்' குறிப்புகளை சேமித்து வைப்பதால், நாம் மிக விரைவாகவும் எளிதாகவும் வரிசைகளை மாற்றலாம். 'கன்டெய்னர்களின் கொள்கலன்' பெற, நீங்கள் இரண்டிற்குப் பதிலாக ஒரு குறியீட்டைக் குறிப்பிட வேண்டும். எடுத்துக்காட்டு:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

"கீழே உள்ள குறியீட்டைப் பாருங்கள். வரிசைகளை மாற்ற அதைப் பயன்படுத்தலாம்:"

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
இரு பரிமாண அணிவரிசை





matrix[0]முதல் வரிசைக்கான குறிப்பைச் சேமிக்கிறது.
நாங்கள் குறிப்புகளை மாற்றுகிறோம்.

இதன் விளைவாக, matrixவரிசை இதுபோல் தெரிகிறது:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

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

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

"எல்லாம் தர்க்க ரீதியாகவும் தெளிவாகவும் தெரிகிறது. விரிவுரைக்கு நன்றி, ரிஷி!"

"நீங்கள் வரவேற்கப்படுகிறீர்கள், அதை புத்திசாலித்தனமாக நடைமுறைப்படுத்துங்கள்."