Introduction

Download Report

Transcript Introduction

‫مهدی ایل بیگی‬
‫دانشگاه آزاد اسالمی دماوند‬
‫‪ .1‬کتاب "اصول ساختمان داده ها" نوشته "سیمور لیپ شوتز" و ترجمه "مهندس ابراهیم‬
‫زاده قلزم”‪.‬‬
‫‪2. ”Fundamentals of Data Structures“ by Ellis Horowitz‬‬
‫‪and Sartaj Sahni.‬‬
‫‪ .3‬ساختمان داده ها‪ ،‬تننباوم آرون ام‪ .‬ساختمان داده ها در ‪.C‬‬
‫‪4. CLRS: Introduction to Algorithms (2nd Ed.) MIT Press.‬‬
‫‪” .5‬ساختمان داده ها“‪ ،‬حمید رضا مقسمی‪.‬‬
‫‪2‬‬
‫• آزمون میان ترم و پایان ترم‪ 14 :‬نمره‬
‫• تمرین ها و پروژه ها‪ 6 :‬نمره‬
‫• تاریخ امتحان میان ترم‪ :‬؟‬
‫‪3‬‬
‫• پردازش داده ها‪ ،‬مستلزم مراحل زير است‪:‬‬
‫‪ .1‬ذخیره داده ها‬
‫‪ .2‬بازيابي داده های ذخیره شده‬
‫‪ .3‬پردازش بر روی داده ها‬
‫• داده ها ميي تواننيد بيه صيوري هيال م تلزيي سيازمان د ي شيوند‪ .‬ميدل منطقي ييا رياضي ي‬
‫سازمان د داده ها به يك شكل خاص‪ ،‬ساختمان داده نام دارد‪.‬‬
‫برنامه = الگوريتم ها ‪ +‬ساختمان داده ها‬
‫‪4‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫‪5‬‬
‫مقدمهای بر مرتبه اجرایی و توابع بازگشتی‬
‫‬
‫آرایه‬
‫پشته و صف‬
‫لیست های پیوندی‬
‫درخت‬
‫درخت های ویژه‬
‫گراف‬
‫مرتب سازی‬
6
7
‫• اسامي دانشجويان دانشگاه‪ ،‬در ليستي نگهدارل مي شود‪.‬‬
‫• عملیاي مورد نظر‪...‬‬
‫– دانشجوهال جديد به اين ليست اضافه مي شوند‪.‬‬
‫– دانشجويان فارغ التحصيل از اين ليست حذف مي شوند‪.‬‬
‫– برال آگا از سوابق دانشجويان‪ ،‬بايد اين ليست را جستجو کرد‪.‬‬
‫• فرض کنيد‪:‬‬
‫– رکورد هر دانشجو با شماره دانشجويي او شناخته مي شود‪.‬‬
‫– اين شماره‪ ،‬عددل ‪8‬رقمي است‪.‬‬
‫‪8‬‬
‫• روش اول ‪ :‬براي نگهداري اطالعات دانشجويان‬
‫– از آرايه ال به طول ‪ 1000‬عضو استزاده مي کنيم‪.‬‬
‫– برال افزودن دانشجول جدييد‪ ،‬اوليین محيل خيار آراييه را پييداه کيرده و رکيورد او را بيت‬
‫مي کنيم‪.‬‬
‫– هنگييام حييذف نمييودن‪ ،‬خانييه آرايييه مررييوو بييه رکييورد مييورد نظيير پیييدا نمييوده و آن را خييار‬
‫مي کنيم‪.‬‬
‫• براي پيدا کردن رکورد خاص‪:‬‬
‫– الزم است تک تک اعضال آرايه را بررس ي کنيم‪.‬‬
‫– در ليست هال بزرگ اين کار مقرون به صرفه نيست‪.‬‬
‫‪9‬‬
‫• روش دوم ‪ :‬براي نگهداري اطالعات دانشجويان‬
‫– از آرايه ال به طول ‪ 1000‬عضو استزاده مي کنيم‪.‬‬
‫– هنگ ييام ح ييذف و اض ييافه نم ييودن رکورده ييا‪ ،‬ترتي ي آراي ييه را ب يير اس يياس ش ييماره دانش ييجويي‬
‫حزظ مي کنيم‪.‬‬
‫• الزم است عملياتي اضاف برال حزط ترتي انجام دهيم‪.‬‬
‫• براي پيدا کردن رکورد خاص‪ ،‬الزم است تنها بخش ي از آرايه را جستجو کنيم(چرا؟)‬
‫– عم ييل ح ييذف و اض ييافه نم ييودن رکورده ييا م م ييوال در مق يياط خ يياص (مث ييل ش ييرو س ييال‬
‫تحصيل ) انجام مي گیرند اما عمل جستجو همواره مورد نياز است‪.‬‬
‫– استزاده از آرايه مرت کاراتر از روش اول است‪.‬‬
‫‪10‬‬
‫• تابع زير برال محاسبه توان نوشته شده است‪:‬‬
‫) ‪long power (long x, long y‬‬
‫{‬
‫;‪long k = 1‬‬
‫)‪for (long n=1; n <= y; n++‬‬
‫;‪k = k * x‬‬
‫;‪return k‬‬
‫}‬
‫• اين تابع برال محاسبه ‪ 16 ، 416‬بار عمل ضرب انجام ميدهد‪.‬‬
‫‪11‬‬
‫• تابع زير نیز برال محاسبه توان نوشته شده است‪:‬‬
‫{ )‪long power (long x, long y‬‬
‫; ‪long k = 1‬‬
‫{ )‪while (y > 1‬‬
‫};‪if (y % 2 == 0) {x = x * x; y = y / 2‬‬
‫};‪else {k = k * x; x = x * x; y = (y-1) / 2‬‬
‫}‬
‫;‪return k * x‬‬
‫}‬
‫• اين تابع برال محاسبه ‪ 8 ،416‬بار عمل ضرب يا تقسيم انجام ميدهد‪.‬‬
‫‪12‬‬
‫• بييا اسييتزاده از آرايييه مرتي (مثييال ‪ ،)1‬مييي تييوان کييارايي برنامييه مييديريت‬
‫اطالعاي را بهبود ب شيد‪.‬‬
‫• ب ييا نگه ييدارل نسيج ييه محاس ييباي پيش ييین (مث ييال ‪ ،)2‬م ييي ت ييوان از انج ييام‬
‫دوراره آن ها جلوگیرل و در زمان صرفه جويي کرد‪.‬‬
‫‪13‬‬
‫‪ .1‬الگييوريتم بايييد بييدون ابهييام‪ ،‬م ييین و قب ي باشييد‪ ،‬بييه طييورل ييه هيير مرحلييه‬
‫روشن و واضح باشد‪.‬‬
‫‪ .2‬الگييوريتمه ييا باي ييد بييه ق ييدرل س يياده باشييند ييه توس ييط ييام يوتر قاب يل اج يرا‬
‫باشند‪.‬‬
‫‪ .3‬بايد خاتمه پذير باشند‪ ،‬ي ني پس از ت دادل مراحل‪ ،‬خاتمه يابند‪.‬‬
‫• ييارايي الگ ييوريتم براس يياس دو م ي ييار ان ييدازه گی ييرل م ييي ش ييود‪ .‬يك ييي از آن ه ييا‬
‫بهييرهورل از فضييا و ديگييرل ييارايي زمييان اسييت‪ .‬فضييا‪ ،‬حافظييه ال اسييت يه‬
‫ب يرال ذخیييره داده هييا الزم اسييت و زمييان‪ ،‬زمييان الزم ب يرال پييردازش داده هييا‬
‫است‪.‬‬
‫‪14‬‬
‫‪ .1‬سرعت سخت افزار‬
‫‪ .2‬نو کام ایلر‬
‫‪ .3‬اندازه داده ورودی مسئله‬
‫‪ .4‬پیچیدگی زمانی و فضایی الگوریتم‬
‫و‪...‬‬
‫‪15‬‬
‫• عوامييل مت ييددل در زمييان اج يرال الگييوريتم مييو ر هسييسند‪ ،‬وري آنچييه ييه بييه عنييوان ييارايي الگييوريتم‬
‫مبرح است‪ ،‬ت داد دف اي اجرال دستوراي ميباشد‪.‬‬
‫• دانشي ييمندان ي ييام يوتر‪ ،‬نشي ييانه گي ييذارل هي ييا و اصي ييبالحاي زيي ييادل را ب ي يرال در ارتبي يياو بي ييین اني ييدازه‬
‫ورودل و زمان اجرا مبرح ردند‪ .‬به عنوان مثيال‪ ،‬اگير بيا دو برابير شيدن انيدازه ورودل )‪ ،(n‬زميان‬
‫اجرال الگوريتم نیز دوررابر شود‪،‬آن گاه زمان اجرال الگوريتم به طور خبي رشيد ميي نيد‪ .‬بيه ايين‬
‫ترتي ‪ ،‬مي گوييم نرخ رشد‪ ،‬مرتبه ‪ n‬است‪.‬‬
‫• ازطرف ديگر‪ ،‬اگير بيا دو برابير شيدن انيدازه ورودل‪ ،‬زميان اجيرال الگيوريتم بهيار برابير شيود‪ ،‬آن گياه‬
‫الگوريتم با نرخ توان دوم رشد مي ند‪ .‬در اين مورد ميگوييم نرخ رشد آن‪ ،‬مرتبه ‪ n2‬است‪.‬‬
‫• )‪ :T(n‬تاب برحس ‪( n‬ت داد ورودل) است ه زمان الگوريتم را نشان ميدهد‪.‬‬
‫‪16‬‬
‫• نماد ‪ O‬را مي تيوان اختصيار وا ه هيال (‪ )Order of magnitude‬دانسيت‪ .‬ايين نمياد را نمياد‬
‫‪O‬بزرگ يا ‪ Big-O‬مي نامند‪.‬‬
‫• ت ريي ‪ :‬تيابع ‪ f1‬از مرتبيه )‪ O(f2‬اسيت‪ ،‬اگير بيرال اعيداد بيزرگ ‪ ،n‬بزرگتير از عيددل مثيل ‪،n0‬‬
‫ابت ‪ c‬وجود داشته که در راببه زير صدق ند‪:‬‬
‫•‬
‫)‪for all n >= n0 , f1(n) <= c f2(n‬‬
‫‪ c f2‬ران باالل تابع ‪ f1‬ناميده مي شود‪.‬‬
‫• مثال‪:‬‬
‫‪f1(n) = 2n2 + 3n + 7 , f2(n) = n2‬‬
‫)‪f2 ∈ O(f1‬‬
‫)‪f1 ∈ O(f2‬‬
‫‪17‬‬
‫)‪for all n >= 1 , f2(n) < f1(n‬‬
‫)‪for all n >= 6 , f1(n) < 3 f2(n‬‬
‫• تابع زیر از مرتبه‬
‫می باشد‪.‬‬
‫)‪O(n*m‬‬
‫• تابع زیر از مرتبه‬
‫)‪n‬می باشد‪.‬‬
‫‪O(log‬‬
‫‪For i := 1 to n‬‬
‫‪For j :=1 to m‬‬
‫;‪x++‬‬
‫‪18‬‬
‫;‪x = 0‬‬
‫;‪i = n‬‬
‫)‪While (i > 1‬‬
‫{‬
‫;‪x--‬‬
‫;‪i /= 2‬‬
‫}‬
‫• تابع زیر از مرتبه‬
‫می باشد‪.‬‬
‫)‪O(1‬‬
‫;‪x=0‬‬
‫;‪i = n‬‬
‫)‪While (i > 1‬‬
‫{‬
‫;‪x--‬‬
‫;‪i %= 2‬‬
‫}‬
‫• تابع زیر از مرتبه‬
‫‪19‬‬
‫‪O(n‬باشد‪.‬‬
‫)‪ 3‬می‬
‫‪For i := 1 to n‬‬
‫‪For j :=1 to m‬‬
‫‪For k :=1 to j‬‬
‫;‪x++‬‬
.‫می باشد‬2 n * log3 n)
O(log
a = n;
While (a > 1)
{
a /= 2;
b = n;
while (b > 1)
{
b /= 3;
x++;
}
}
‫• تابع زیر از مرتبه‬
O(log2 n * log3 n)
O(log3 n)
20
.‫باشد‬2‫می‬
O(n
)
‫• تابع زیر از مرتبه‬
.‫ می باشد‬O(n2)
‫• تابع زیر از مرتبه‬
for (k = 0; k <= n-1; k++)
for (i = 0; i <= n-k; i++)
a[i][i+k] = k;
for(i = 1; i <= n; i++)
for (j = i+1; j <= n; j++)
S++;
21
.‫باشد‬
‫ می‬+ log2 n))
O(n(m
For (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
O(m)
k = k + 1;
j = 1;
while (j < n)
{
O(log2 n)
k++;
j = 2 * j;
}
}
O(m + log2 n)
‫• تابع زیر از مرتبه‬
O(n(m + log2 n))
22
.‫باشد‬2‫می‬
O(n
)
‫• تابع زیر از مرتبه‬
S = 0;
for (i = 0 ; i < n; i++)
for (j = 0; j < n; j++)
for (k = 0; k < 3; k++)
S++;
:‫• ترتی بند مرتبه زمانی‬
• O(1) < O(log n) < O(n) < O(n log n) < O(nk) , k >=2
• O(nk) < O(2n) < O(an) < O(n!) < O(nn)
, a >= 2
23
.f1 ∈ O(f2) ‫ بیشتر باشد آنگاه‬f1 ‫ از تابع‬f2 ‫• اگر مرتبه تابع‬
1. n! ∈ O(nn)
2. 2n2nn + n2 log n ∈ O(2nnn)
3. n2 log n ∈ O(n3)
4. n2 / log n ∈ O(n2)
5. n2 ∈ O(n3)
6. log n ∈ O(√n)
7. 1/n ∈ O(√n)
8. 1/n ∈ O(log n)
24
‫• تابع بازگشتی تاب ی است که بصوري مستقیم یا غیر مستقیم خودش را فراخوانی کند‪.‬‬
‫• مثال‪ :‬تابع محاسبه فاکتوریل بصوري بازگشتی‪:‬‬
‫)‪int factorial(int n‬‬
‫{‬
‫;‪if (n <= 1) return 1‬‬
‫;)‪return n * factorial(n-1‬‬
‫}‬
‫• برای نوشتن هر تابع بازگشتی باید دو مورد را مشخص نمود‪:‬‬
‫‪ .1‬فرمول فراخوانی مجدد تابع‪.‬‬
‫‪ .2‬شرو توق فراخوانی ها و خاتمه تابع‪.‬‬
‫‪25‬‬
.‫ بدست آورید‬Rec(6) ‫• مقدار تابع زیر را با فراخوانی‬
int Rec(int n)
{
if (n == 1)
return(1);
else
return(Rec(n - 1) + Rec(n - 1));
}
26
.‫ بدست آورید‬Rec(5,3) ‫• مقدار تابع زیر را با فراخوانی‬
int Rec(int p, int q)
{
int R;
if (q <= 0)
return (1);
R = Rec(p, q/2);
R = R * R;
if (q%2 == 0)
return(R);
else
return(R * P);
}
27
‫• توابع بازگشتی برای حل مسائل زیر بنویسید‪.‬‬
‫‪ .1‬محاسبه حاصل جمع اعداد صزر تا ‪.n‬‬
‫‪ .2‬محاسبه عباراي ‪ ab ،a / b ،a * b‬و ‪ b % a‬بصوري بازگشتی‪.‬‬
‫‪ .3‬محاسبه جمله ‪n‬ام از سری فیبوناچی‪.‬‬
‫– س ييری فیبون يياچی ی ييک س ييری اس ييت ک ييه دو جمل ييه اول آن ‪ 1‬اس ييت و بقی ييه جمل ييه ه ييا براب يير ب ييا‬
‫مجمو دو جمله قبل هسسند‪.‬‬
‫…‪1, 1, 2, 3, 5, 8, 13, 21,‬‬
‫‪28‬‬
29