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];