290 likes | 656 Views
آرایه ها Array. تعریف آرایه. لیستی از n عنصر ، متناهی (محدود) ، با عناصر هم نوع ، دسترسی از طریق اندیس که در حافظه در خانه های متوالی حافظه قرار می گیرند. آرایه به عنوان یک نوع داده انتزاعی داده ها: مشخصات آرایه عملگرها : پیمایش ، جستجو، مرتب کردن، اضافه و حذف، ادغام
E N D
تعریف آرایه • لیستی از n عنصر ، متناهی (محدود) ، با عناصر هم نوع ، دسترسی از طریق اندیس که در حافظه در خانه های متوالی حافظه قرار می گیرند. • آرایه به عنوان یک نوع داده انتزاعی • داده ها: مشخصات آرایه • عملگرها: پیمایش، جستجو، مرتب کردن، اضافه و حذف، ادغام • آرایه یک بعدی (خطی) • 10 عنصر از 0 تا 9 • تعریف در C++int a[10] • بازیابی مقدار X=a[3]; • ذخيره مقدار a[3]=X; • در C++اندیس از صفر شروع می شود.
اندازه آرایه • اندازه آرایه : تعداد خانه ها * اندازه هر خانه • int : 2 بایت • float : 4 بایت • char : 1 بایت • boolean : 1 بایت • تابع base(a) آدرس خانه شروع آرایه را برمی گرداند.
آدرس خانه ای خاص در آرایه یک بعدی address a[i] = base (a) + i * sizeof (type(a)) • مثال: در یک آرایه با تعریف float a[200]، اگر آدرس شروع آرایه در حافظه 1000 باشد، a25 در کدام آدرس قرار دارد؟ (25 – 0) × 4 + 1000 = 1100
حالت کلی [L1 … U1 , L2 … U2 , Ln … Un] Array [L … U] of items تعداد عناصر آرایه = U – L + 1 بعدی nتعداد عناصر آرایه n= [U1 – L1 + 1][U2 – L2 + 1][Un – Ln + 1] (space)فضای اشغال شده توسط آرایه = [U1 – L1 + 1][U2 – L2 + 1][Un – Ln + 1] * sizeof(type(array))
آدرس دهی سطری address (a[i,j]) = base (a)+ تعداد عناصر قبل* سایز = base (a) + [(n*i)+j] * sizeof (type(a)) = base (a) + [(u2-l2+1)*(i-l1) + (j-l2)] * sizeof (type(a)) i m= u1-l1+1 j n = u2-l2+1
آدرس دهی ستونی address (a[i,j]) = base (a)+ تعداد عناصر قبل* سایز = base (a) + [(m*j)+i] * sizeof (type(a)) = base (a) + [(u1-l1+1)*(j-l2) + (i-l1)] * sizeof (type(a)) i m= u1-l1+1 j n = u2-l2+1
A [60 , 6] = (60 – 1) × (26 – 1 + 1) + (6 – 1) × 2 + 1000 = 4078 A [20 , 4] = (4 – 1) × (100 – 1 + 1) + (20 – 1) × 2 + 1000 = 1638
رابطه بین اندیس ها در ماتریس مربعی • در ماتریس مربعی عناصر روی قطر اصلی دارای آدرس یکسانی در روشهای سطری و ستونی هستند. • اگر i<j باشد آنگاه A[i,j] بالای قطر اصلی است. • اگر i=j باشد آنگاه A[i,j] روی قطر اصلی است. • اگر i>j باشد آنگاه A[i,j] پایین قطر اصلی است. • اگر i+j<n-1 باشد آنگاه A[i,j] بالای قطر فرعی است. • اگر i+j=n-1 باشد آنگاه A[i,j] روی قطر فرعی است. • اگر i+j>n-1 باشد آنگاه A[i,j] پایین قطر فرعی است.
ماتریس های قطری • ماتریس مربعی است که تمامی درایه های آن غیر از قطر اصلی صفر باشد. • این ماتریس ها را در یک آرایه به طول قطر اصلی (تعداد سطرها یا ستون ها)، ذخیره می نماییم. • تعداد عناصر غیر صفر =n • نحوه ذخیره بصورت یک آرایه یک بعدی. • پس عضو (i, i) در اندیسi از آرايه یک بعديقرار دارد. • (نکته: اندیس آرایه ها در C از صفر شروع می شود) 1 0 0 0 03 0 0 0 0 6 0 0 0 0 10
ماتریس های سه قطری • ماتریس مربعی است که تمامی درایه های آن غیر از قطر اصلی، بالای قطر اصلی و پایین قطر اصلی صفر باشد. • تعداد عناصر غیر صفر = n+2(n-1) 1 3 0 0 4 3 9 0 0 1 6 4 0 0 1 2
ماتریس های مثلثی • ماتریس بالا مثلثی: ماتريسمربعيكه تمام درایه های پایین قطر اصلی در آن صفر هستند. • ماتریس پایین مثلثی: ماتريس مربعيكه تمام درایه های بالای قطر اصلی در آن صفر هستند. • تعداد عناصر غیر صفر =n(n+1)/2 1 0 0 0 2 3 0 0 4 5 6 0 7 8 9 10
ذخيره سازي ماتريسهاي خاص - ادامه • اين ماتريسها را مي توان نوع خاصي از ماتريس اسپارس دانست. • ذخيره سازي عناصر غير صفر در يك آرايه يك بعدي جهت صرفه جويي در حافظه.
ماتریس پراکنده یا اسپارس: • ماتریس هایی که اکثریت عناصر آنها مقدار صفر دارند . • با توجه به تعداد زیاد صفرها و بزرگ بودن ماتریسها ایجاد روش بهینه برای ذخیره سازی راه حل: استفاده از یک آرایه دو بعدی با سه ستون
row col value A[1] 0 0 15 A[2] 0 3 22 A[3] 0 5 -15 A[4] 1 1 11 A[5] 1 2 3 A[6] 2 3 -6 A[7] 4 0 91 A[8] 5 2 28 A[0] 6 6 8 تعداد سطرهايماتريس اوليه تعداد ستونهاي ماتريس اوليه تعداد عناصرغير صفر ماتريس اوليه
ترانهاده ماتريس اسپارس برايترانهادهكردناينماتريس شماره ي سطر و ستون را عوض كرده مقدار عنصر را در ستون value قرار ميدهيم: (0,0,15) (0,0,15) (0,3,22) (3,0,22) (0,5,-15) (5,0,-15)
ويژگيهاي كلاس اسپارس classMatrixTerm { friend classSparseMatrix private : introw, col, value;} In SparseMatrix: private: intRows, Cols, Terms; MatrixTermsmArray [MaxTerms];