Instructor: Mr.Vahidipour Arrays and Structures Instructor: Mr.Vahidipour
آرايه ها و ساختارها ADT (Abstraction data type) آرايه ها يونيون ها و ساختارها ماتريس هاي اسپارس آرايه هاي چند بعدي چند جمله اي ها رشته ها
آرایه - Array مجموعه ای از داده كه در خانه های پشت سرهم حافظه قرارمی گیرند. مجموعه ای از زوجها شامل اندیس و مقدار<i .x> است. به ازا هر اندیس یک مقدار مربوط به آن اندیس وجود دارد (تناظر یا نگاشت) int a [6] = { 3,5,2,7,9,10,11} a[0] a[1] a[2] a[3] a[4] a[5] a[6] 3 5 2 7 9 10 11
ADTمربوط به آرايه ها - GeneralArray(int j, RangList list ,float InitialValue=DefaultValue); /* Creates a j dimension array of floats where the range of the kth dimension is given by the kth element of list.*/ - float Retrieve (index i); //if(i is in the index set )return the item associated with i in the array else return error -void Store( index i, float x); //if (i is in the index set ) insert new pair<i,x> else return error.
آرایه در حافظه یک آرایه یک بعدی بسادگی بوسیله نسبت دادن دو کروشه به نام یک متغیر تعریف میشود: int list[5]; آدرس اولین عنصر آدرس مبنا یا پایه نامیده می شود. Variable Memory addres List[0] base address = a List[1] a+1*sizeof(int) List[2] a+2*sizeof(int) List[3] a+3*sizeof(int) List[4] a+4*sizeof(int)
آدرس دهی آرایه یک بعدی ElementType List [n]; آدرس دهی آرایه یک بعدی ElementType List [n]; List [0]= ٭( base address = α) List [i] = ٭(α + i * size of (ElementType))
ساختار - Structure آرایه ها مجموعه داده های از یک نوع. ساختارها داده هایی از انواع مختلف در کنار هم. ساختار= struct. ساختار = Record مجموعه ای از اقلام داده ها (Field)
تعريف و دسترسي به عناصر struct { char name [ 10 ] ; int age ; float salary ; } person ; Strcpy ( person.name , “james” ); Person.age = 32 ; Person.salary = 250000;
یونیون – Union یونیون ها مانند ساختارها ولي در آن واحد فقط از یک نوع تعریف شده استفاده می کند. از بزرگترین مقداردهی برای آن نوع استفاده می کند. union test{ int x; char y; }
ماتریس اسپارس – Sparse Matrix ماتریسی که عناصر صفر آن زیاد باشد . صرفه جویی در زمان و حافظه. چگونه بايستي اطلاعات يك ماتريس پرصفر را در حافظه ذخيره كنيم تا حافظه كمتري مصرف شود؟ (چه ساختمان داده اي ؟) آيا عملياتهاي مربوط به آرايه ها (ADT) بر روي اين ساختمان داده قابل پياده سازي است؟
<row , column ,value > ماتریس اسپارس نگهداري عناصر غير صفر ماتريس و اطلاعات مربوط <row , column ,value > عناصر بترتيب سطري و در هر سطر بترتيب ستوني ذخيره مي شود.
ماتریس اسپارس – مثال col0 col1 col2 col3 col4 col5 Row0 15 0 0 22 0 -15 Row1 0 11 3 0 0 0 Row2 0 0 0 -6 0 0 Row3 0 0 0 0 0 0 Row4 91 0 0 0 0 0 Row5 0 0 28 0 0 0
ماتریس اسپارس – مثال row col value A[0] 6 6 8 A[1] 0 0 15 A[2] 0 3 22 تعداد سطرهاي ماتريس اوليه تعداد ستونهاي ماتريس اوليه تعداد عناصرغیر صفر ماتريس اوليه
ADT ماتريس اسپارس Class SparseMatrix { //Object: A set of triples <row, column, value> … public: SparseMatrix(int MaxRow,int MaxCol); /* Create a SparseMatrix that can hold up to MaxItems=MaxRow*MaxCol */ SparseMartix Transpose(); SparseMatrix Add(SparseMatrix b); SparseMatrix Multiply(SparceMatrix b); }
ترانهاده ماتریس اسپارس براي ترانهاده كردن اين ماتريس شماره ي سطر و ستون را عوض كرده مقدار عنصر را در ستون value قرار مي دهيم: (0,0,15) (0,0,15) (0,3,22) (3,0,22) (0,5,-15) (5,0,-15)
ترانهاده ماتریس اسپارس - مثال Row col value row col value A[0] b[0] A[1] b[1] A[2] b[2] A[3] b[3] A[4] b[4] 3 5 4 5 3 4 1 1 2 6 2 2 1 1 1 1 5 1 1 5 2 6 2 2
ويژگيهاي كلاس اسپارس class MatrixTerm { friend class SparseMatrix private : int row, col, value;} In SparseMatrix: private: int Rows, Cols, Terms; MatrixTerm smArray [MaxTerms];
تابع ترانهاده ي ماتریس اسپارس SparseMartix SparseMartix::Transpose() //return the transpose of a (*this) { SparseMatrix b; b.Rows=Cols; //rows in b = columns in a b.Cols=Rows; //columns in b = rows in a b.Terms=Terms; //terms in b = terms in a if ( Terms> 0){ int currentb = 1; for ( int c = 0; c < Cols ; c++) for( int j = 0; j < Terms; j ++) if( smArray[j].col ==c) { b. smArray[currentb].row = c; b. smArray[currentb].col = smArray [j].row; b. smArray[currentb].value = smArray [j].value; currentb ++;} } return b;}
تحلیل تابع ترانهاده حلقه های تودرتو عبارات ifو انتسابها در زمان ثابتی انجام میشود. حلقه for خارجی به تعداد ستونهای ماتریس اولیه حلقه for داخلی به تعداد عناصر در ماتریس اولیه O(columns * terms)
تابع ترانهاده ي سریعتر؟ می توان ترانهاده ی یک ماتریس را در زمانی که تابع سطر و ستون است بدست آورد؟ O(columns + terms)
ترانهاده ی سریع محاسبه تعداد عناصر در هر ستون ماتریس اصلی؛ با این عمل تعداد عناصر در هر ردیف ماتریس ترانهاده مشخص می شود. با این اطلاعات موقعیت شروع هر سطر در ماتریس ترانهاده را داریم. حال میتوانیم عناصر ماتریس اصلی را یکی یکی به موقعیت صحیح در ماتریس ترانهاده منتقل کنیم.
الگوريتم ترانهاده ي سريع SparseMatrix SparseMatrix :: fast_transpose() { int *RowSize = new int[Cols]; int *RowStart= new int[Cols]; SparseMatrix b; b.Rows = Cols; b.Cols = Rows; b.Terms = Terms; If (Terms > 0) { for (i = 0; i < Cols ; i++) RowSize[i] = 0; for(I = 0 ; i<Terms ; i++) RowSize[smArray[i].col]++; // compute RowSize[i]= number of terms in row i of b
الگوريتم ترانهاده ي سريع - ادامه RowStart[0] = 0; for ( i=1;I <Cols; i++) RowStart[i] = RowStart[i-1]+ RowSize[i-1]; // RowStart[i] = starting position of row i in b; for( i = 1; i <Terms; i++) { j = RowStart [smArray[i].col] ++ ; b. smArray[j].row = smArray[i].col; b. smArray[j].com = smArray[i].row; b. smArray[j].value = smArray [i].value; } }// end if (Terms>0) delete [] RowSize; delete [] RowStart; return b;}
سوالات؟ تحليل تابع ترانهاده سريع FastTranspose (قسمت 2-4-3) ضرب دو ماتريس اسپارس (قسمت 2-4-4) آيا ساختمان داده ديگري براي نمايش ماتريس اسپارس مي شناسيد؟ (سوالات 7 و 8 از تمرينات بخش 2-4)
نمایش آرایه ها تعداد عناصر آرايه چگونه مي توانيم عناصراين آرايه چند بعدي را در حافظه يك بعدي ذخيره سازي نماييم ؟ ( نگاشت از فضاي چند بعدي به يك بعدي )
نمایش آرایه ها - ادامه دو راه متداول: سطری و ستونی. آرایه دو بعدی a[u0][u1] دارای u0 سطربه نحوی که هر سطر شامل u1 عنصر مي باشد (سطري) دارای u1 ستون به نحوی که هر ستون شامل u0 عنصر مي باشد (ستوني)
آدرس دهی سطري در آرایه دوبعدی Variable Memory address A[0][0] α +(0 * u1+ 0)*E A[0][1] α +(0 * u1+ 1)*E … A[1][0] α +(1 * u1+ 0)*E A[i][0] α +(i * u1 + 0)*E A[i][j] α +(i * u1 + j)*E ElementType A[u0][u1]; E=sizeof (ElementType) base address = α
نمایش آرایه سه بعدی u1 آرایه دوبعدی با ابعاد u2*u3. تعیین مکان A[i][j][k] از مكان شروع ذخيره سازي ماتريس α به تعداد i ماتريس u2*u3 ذخيره شده است. A[i][0][0] حال j سطر u3 عنصري در ادامه قرار گرفته است. A[i][j][0] از اين نقطه k عنصر جاي مي گيرد.
آرایه سه بعدی
فرمول کلی برای آرایه های چندبعدی A[u1][u2]………..[un] A[i1][i2]…[in] فرمول آدرس عنصر α +i1 u1 u2….un +i2 u2 u3….un . +in-1 un +in
ذخيره سازي ماتريسهاي خاص
ذخيره سازي ماتريسهاي خاص - ادامه اين ماتريسها را مي توان نوع خاصي از ماتريس اسپارس دانست. ذخيره سازي عناصر غير صفر در يك آرايه يك بعدي جهت صرفه جويي در حافظه.
ذخيره سازي ماتريسهاي خاص - ادامه ارائه فرمول نگاشت از فضاي دو بعدي به يك بعدي k is index in array= f(i , j)
سوالات فرمول كلي ذخيره سازي ستوني آرايه هاي چند بعدي فرمول ذخيره سازي براي ماتريسهاي خاص (تمرينات 4 تا 8 قسمت 8-2 تمرين هاي تكميلي فصل 2) براي ذخيره سازي چندجمله اي ها و عمليانهاي ويژه آنها ساختمان داده اي مناسب طراحي كنيد. ADT مربوطه را بنويسيد ؟(بخش 2-3)
رشته ها یک نوع داده ی دیگری که عناصر آن کاراکتر هستند. عملکردهای زیادی برای کار با رشته هاوجود دارد: ایجاد یک رشته تهی ضمیمه کردن دو رشته به هم (concatenation) , خواندن یا نوشتن یک رشته کپی کردن یک رشته مقایسه رشته ها درج کردن یک زیر رشته برداشتن یک زیر رشته از یک رشته مشخص.
ADT رشته ها class String { //object: A finite ordered set of zero or more character public: String (char *init ,int m); int operator == (String t); int operator !();//if *this is empty return 1 int Length(); String Concate (String t); String Substr (int i, int j); int Find(String Pat); //Return on index I such that Pat matches the substring of *this that begins at position i. Return -1 is either empty or not a substring of *this. }
1(pattern matching)تطابق الگو یک الگو یا یک زیر رشته را در یک رشته بزرگتر جستجو کنیم. تست متوالی هر کاراکتر رشته تا زمان پیدا شدن الگو یا رسیدن به انتهای رشته میباشد. اگر n طول رشته و m طول الگو باشد O(mn)
تطابق الگو كنوث-موريس-پرات زمان اجرايي O(m+n) در بدترين حالت لازم است تمام كاراكترهاي داخل الگو و رشته حداقل يكبار با هم مقايسه شوند. بخش 2-6-2