Chapter 1: Introduction

Download Report

Transcript Chapter 1: Introduction

‫‪1‬‬
‫آرایه ها ‪Array‬‬
‫تعریف آرایه‬
‫• لیستی از ‪ n‬عنصر ‪ ،‬متناهی (محدود) ‪ ،‬با عناصر هم نوع ‪ ،‬دسترس ی از طریق‬
‫اندیس که در حافظه در خانه های متوالی حافظه قرار می گیرند‪.‬‬
‫• آرایه به عنوان یک نوع داده انتزاعی‬
‫▫ داده ها‪ :‬مشخصات آرایه‬
‫▫ عملگرها‪ :‬پیمایش‪ ،‬جستجو‪ ،‬مرتب کردن‪ ،‬اضافه و حذف‪ ،‬ادغام‬
‫• آرایه یک بعدی (خطی)‬
‫▫‬
‫▫‬
‫▫‬
‫▫‬
‫▫‬
‫‪2‬‬
‫‪ 10‬عنصر از ‪ 0‬تا ‪9‬‬
‫تعریف در ‪int a[10] C++‬‬
‫بازیابی مقدار ;]‪X=a[3‬‬
‫ذخیره مقدار ;‪a[3]=X‬‬
‫در ‪ C++‬اندیس از صفر شروع می شود‪.‬‬
‫اندازه آرایه‬
‫• اندازه آرایه ‪ :‬تعداد خانه ها * اندازه هر خانه‬
‫▫ ‪ 2 : int‬بایت‬
‫▫ ‪ 4 : float‬بایت‬
‫▫ ‪ 1 : char‬بایت‬
‫▫ ‪ 1 : boolean‬بایت‬
‫• تابع )‪ base(a‬آدرس خانه شروع آرایه را برمی گرداند‪.‬‬
‫‪3‬‬
‫آدرس خانه ای خاص در آرایه یک بعدی‬
‫))‪address a[i] = base (a) + i * sizeof (type(a‬‬
‫• مثال‪ :‬در یک آرایه با تعریف ]‪ ،float a[200‬اگر آدرس‬
‫شروع آرایه در حافظه ‪ 1000‬باشد‪ a25 ،‬در کدام آدرس‬
‫قرار دارد؟‬
‫‪(25 – 0) × 4 + 1000 = 1100‬‬
‫‪4‬‬
‫آرایه دو بعدی (ماتریس)‬
‫‪5‬‬
‫روش ذخیره ماتریس ها‬
‫‪6‬‬
‫حالت کلی‬
[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))
7
‫آدرس دهی سطری‬
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
8
‫آدرس دهی ستونی‬
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
9
10
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
11
‫آرايه سه بعدی‬
‫رابطه بین اندیس ها در ماتریس مربعی‬
‫• در ماتریس مربعی عناصر روی قطر اصلی دارای آدرس یکسانی در‬
‫روشهای سطری و ستونی هستند‪.‬‬
‫• اگر ‪ 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‬پایین قطر فرعی است‪.‬‬
‫‪13‬‬
‫ذخیره سازي ماتريسهاي خاص‬
‫‪15‬‬
‫ماتریس های خاص‬
‫• ماتریس مربعی است که تمامی درایه های آن غیر از قطر اصلی صفر باشد‪.‬‬
‫• این ماتریس ها را در یک آرایه به طول قطر اصلی (تعداد سطرها یا ستون ها)‪ ،‬ذخیره می نماییم‪.‬‬
‫‪ ‬تعداد عناصر غیر صفر = ‪n‬‬
‫‪ ‬نحوه ذخیره بصورت یک آرایه یک بعدی‪.‬‬
‫‪ ‬پس عضو )‪ (i, i‬در اندیس ‪ i‬از آرايه یک بعدي‬
‫‪( ‬نکته‪ :‬اندیس آرایه ها در ‪ C‬از صفر شروع می شود)‬
‫قرار دارد‪.‬‬
‫‪100 0‬‬
‫‪030 0‬‬
‫‪006 0‬‬
‫‪0 0 0 10‬‬
‫• ماااتریس مربعاای اساات کااه تمااامی درایااه هااای آن غیاار از قطاار اصاالی‪ ،‬بااایی قطاار اصاالی و پااایین قطاار اصاالی صاافر‬
‫باشد‪.‬‬
‫‪ ‬تعداد عناصر غیر صفر = )‪n+2(n-1‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪2‬‬
‫‪0‬‬
‫‪9‬‬
‫‪6‬‬
‫‪1‬‬
‫‪3‬‬
‫‪3‬‬
‫‪1‬‬
‫‪0‬‬
‫‪1‬‬
‫‪4‬‬
‫‪0‬‬
‫‪0‬‬
‫• ماتریس بای مثلثی‪ :‬ماتريس مربعي كه تمام درایه های پایین قطر اصلی در آن صفر هستند‪.‬‬
‫• ماتریس پایین مثلثی‪ :‬ماتريس مربعي كه تمام درایه های بایی قطر اصلی در آن صفر هستند‪.‬‬
‫• تعداد عناصر غیر صفر = ‪n(n+1)/2‬‬
‫‪100 0‬‬
‫‪230 0‬‬
‫‪456 0‬‬
‫‪7 8 9 10‬‬
‫ذخیره سازي ماتريسهاي خاص ‪ -‬ادامه‬
‫• اين ماتريسها را مي توان نوع خاص ي از ماتريس اسپارس دانست‪.‬‬
‫• ذخیره سازي عناصر غیر صفر در يك آرايه يك بعدي جهت صرفه جويي در حافظه‪.‬‬
‫ماتریس پراکنده یا اسپارس‪:‬‬
‫• ماتریس هایی که اکثریت عناصر آنها مقدار صفر دارند ‪.‬‬
‫ایجاد روش بهینه‬
‫• با توجه به تعداد زیاد صفرها و بزرگ بودن ماتریسها‬
‫برای ذخیره سازی‬
‫راه حل‪ :‬استفاده از یک آرایه دو بعدی با سه ستون‬
‫تعداد سطرهاي ماتريس اوليه‬
‫تعداد ستونهاي ماتريس اوليه‬
‫تعداد عناصرغير صفر‬
‫ماتريس اوليه‬
‫‪21‬‬
‫‪value‬‬
‫‪8‬‬
‫‪col‬‬
‫‪6‬‬
‫‪row‬‬
‫‪A[0] 6‬‬
‫‪15‬‬
‫‪22‬‬
‫‪-15‬‬
‫‪11‬‬
‫‪3‬‬
‫‪-6‬‬
‫‪91‬‬
‫‪28‬‬
‫‪0‬‬
‫‪3‬‬
‫‪5‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪0‬‬
‫‪2‬‬
‫]‪A[1‬‬
‫]‪A[2‬‬
‫]‪A[3‬‬
‫]‪A[4‬‬
‫]‪A[5‬‬
‫]‪A[6‬‬
‫]‪A[7‬‬
‫]‪A[8‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪5‬‬
‫ترانهاده ماتريس اسپارس‬
‫براي ترانهاده كردن اين ماتريس شماره ي سطر و ستون را‬
‫عوض كرده مقدار عنصر را در ستون ‪ value‬قرار مي‬
‫دهيم‪:‬‬
‫)‪(0,0,15‬‬
‫)‪(3,0,22‬‬
‫)‪(5,0,-15‬‬
‫)‪(0,0,15‬‬
‫)‪(0,3,22‬‬
‫)‪(0,5,-15‬‬
‫ترانهاده ماتريس اسپارس ‪ -‬مثال‬
‫ويژگيهاي كالس اسپارس‬
class MatrixTerm {
friend class SparseMatrix
private :
int row, col, value;}
In SparseMatrix:
private:
int Rows, Cols, Terms;
MatrixTerm smArray [MaxTerms];