فصل دوم : آرايه ها و ساختارها

46
حه ف ص ه راي ا ت س لي لهاي م ج د ن چ وت ل خ س ي ر ت ما ه ت& ش ر اهداف د& واهد ش خ ا ن& ش را ت وارد ر م رد ت کار ا وب ج& ش ي ل دا ص ف: ن ي :در ا1

Upload: affrica

Post on 12-Jan-2016

58 views

Category:

Documents


0 download

DESCRIPTION

فصل دوم : آرايه ها و ساختارها. اهداف. در اين فصل دانشجو با کاربرد موارد زير آشنا خواهد شد:. آرايه ليست چند جمله‌اي ماتريس خلوت رشته. بازيابي. ذخيره‌ سازي مقادير. آرايه. در رابطه با آرايه به دو عمل اساسي نياز است :. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: فصل دوم :  آرايه ها و ساختارها

صفحه

آرايهليستچند‌جمله‌ايماتريس‌خلوترشته

اهداف

:در‌اين‌فصل‌دانشجو‌با‌کاربرد‌موارد‌زير‌آشنا‌خواهد‌شد

1

Page 2: فصل دوم :  آرايه ها و ساختارها

صفحه

آرايه‌مجموعه‌اي‌از‌زوج‌ها‌،‌شامل‌انديس‌و‌مقدار‌‌.‌به‌ازاي‌هر‌انديس‌>(‌index<,<value)>است

يک‌مقدار‌مربوط‌به‌آن‌انديس‌وجود‌دارد‌که‌به‌زبان‌رياضي‌‌آنرا‌تناظر‌يا‌انگاشت‌مي‌نامند.

آرايهآرايه

در‌رابطه‌با‌آرايه‌به‌دو‌:‌عمل‌اساسي‌نياز‌است

‌بازيابي•

‌ذخيره‌‌سازي‌•مقادير

2

Page 3: فصل دوم :  آرايه ها و ساختارها

صفحه

آرايه‌نوعي‌ساختمان‌داده‌است‌كه‌عناصر‌آن‌هم‌نوع‌بوده‌و‌هر‌يك‌از‌عناصر‌با‌يك‌انديس‌و‌بصورت‌

مستقيم‌قابل‌دستيابي‌ميباشد.‌آرايه‌ميتواند‌يك‌بعدي‌و‌يا‌چند‌بعدي‌باشدآرايه‌هاي‌دو‌بعدي‌را‌با‌نام‌ماتريس‌ميشناسيم

3

Page 4: فصل دوم :  آرايه ها و ساختارها

انديس 0 1 2 3

مقدار 12 8 6 7

Page 5: فصل دوم :  آرايه ها و ساختارها

صفحه

‌به‌صورت‌مثال‌در‌زير‌آمده‌Cآرايه‌در‌زبان‌است‌:

int‌list‌[5]

‌شروع‌مي‌‌0تمام‌آرايه‌ها‌از‌انديس‌Cدر‌زبان‌شوند.

‌ميتوان‌‌n-1تا‌‌0عنصر‌با‌انديسهاي‌nآرايه‌اي‌با‌به‌درايه‌هاي‌آن‌دسترسي‌پيدا‌كرد

نکته

5

Page 6: فصل دوم :  آرايه ها و ساختارها

صفحه

ليست

ساده‌تcرين‌و‌متcداول‌تcرين‌نcوع‌سcاختمان‌داده‌هcا‌ساده‌تcرين‌و‌متcداول‌تcرين‌نcوع‌سcاختمان‌داده‌هcا‌،‌ليست‌هاي‌مرتب‌شده‌يا‌خطي‌هستند.‌،‌ليست‌هاي‌مرتب‌شده‌يا‌خطي‌هستند.‌

ليستليست

مثال‌:مثال‌:

‌...روزهاي‌هفته‌)‌شنبه‌...‌‌روزهاي‌هفته‌)‌شنبه‌‌جمعه‌(جمعه‌(

),...,,( 110 nitemitemitem ‌‌ليست‌ها‌شامل‌اقالم‌داده‌به‌صورتليست‌ها‌شامل‌اقالم‌داده‌به‌صورت‌‌مي‌باشند.‌‌مي‌باشند.

6

Page 7: فصل دوم :  آرايه ها و ساختارها

صفحه

پيدا‌کردن‌طول‌يک‌ليست

‌خواندن‌اقالم‌داده‌يک‌ليست‌از‌چپ‌به‌راست‌يا‌بر‌عکس

(i‌<‌n≥‌0)‌امين‌عنصر‌از‌يک‌ليست‌iبازيابي‌‌

(i‌≤‌n≥‌0)‌امين‌موقعيت‌يک‌ليست‌‌iتعويض‌يک‌قلم‌اطالعاتي‌در‌

.‌(i‌<‌n≥‌0)‌امين‌موقعيت‌يک‌ليست‌‌iدرج‌يک‌قلم‌داده‌جديد‌در‌

‌شماره‌گذاري‌i‌،‌i+1‌،…،n-1)‌اقالم‌داده‌اي‌که‌قبال‌به‌صورت‌‌در‌مي‌آيند(i+1،i+2،…،nشده‌اند‌به‌صورت‌

‌.‌(i‌<‌n≥‌0)‌امين‌موقعيت‌يک‌ليست‌‌iحذف‌يک‌قلم‌اطالعاتي‌از‌تبديل‌‌‌I،i+1،…،n-2داده‌با‌شماره‌‌به‌اقالم‌i+1،…،n-1اقالم‌داده‌مي‌شود.

7

Page 8: فصل دوم :  آرايه ها و ساختارها

صفحه

متداول‌ترين‌پياده‌سازي‌،‌نمايش‌يک‌ليست‌مرتب‌شده‌به‌صورت‌يک‌آرايه‌مي‌باشد‌به‌نحوي‌که‌

‌آرايه‌متناظر‌باشد.‌اين‌iام‌ليست‌با‌انديس‌iعنصر‌مطلب‌يک‌نگاشت‌ترتيبي‌ناميده‌مي‌شود.

نگاشت‌نگاشت‌ترتيبيترتيبي

8

Page 9: فصل دوم :  آرايه ها و ساختارها

صفحه

راه‌حل‌ديگر‌براي‌پياده‌سازي‌ليست،‌ذخيره‌در‌يك‌ليست‌پيوندي‌ميباشد‌كه‌هر‌گره‌از‌ليست‌

حاوي‌دو‌عنصر‌انديس‌و‌مقدار‌ميباشد.

ليست‌ليست‌پيونديپيوندي

انديسمقدار

كلين

10 n-12

9

Page 10: فصل دوم :  آرايه ها و ساختارها

صفحه

ما‌نيازمند‌ساخت‌يك‌نوع‌داده‌اي‌تجريدي‌براي‌نمايش‌و‌پردازش‌چندجمله‌اي‌نمادين‌هستيم.

منظور‌از‌نمادين‌ليستي‌از‌ضرايب‌و‌توانهاست‌كه‌با‌هم‌چند‌جمله‌اي‌را‌تشكيل‌ميدهند.

1310)(

423)(234

2

xxxxB

xxxA

10

Page 11: فصل دوم :  آرايه ها و ساختارها

صفحه

بزرگترين‌توان‌xدر‌چند‌جمله‌اي‌را‌درجه‌چند‌جمله‌‌اي‌ميگويند.

PAدرجه‌چند‌جمله‌اي‌‌A)x(

11

A B

BA

B

A

P

i

P

j

jj

ii

PP

i

iii

P

i

ii

P

i

ii

xbxaxBxA

xbaxBxA

xbxB

xaxA

0 0

),max(

0

0

0

.)().(

)()()(

)(

)(

Page 12: فصل دوم :  آرايه ها و ساختارها

استفاده‌از‌آرايه‌و‌مقدار‌ذخيره‌xدر‌اين‌روش‌انديس‌آرايه‌معرف‌توان‌◦

شده‌معرف‌ضريب‌ميباشد.‌مثال:◦

70812

3210 1287 3 xx

Page 13: فصل دوم :  آرايه ها و ساختارها

صفحه

بطور‌كلي‌اگر‌به‌صورت‌كالس‌بنويسيم‌كالس‌چند‌جمله‌اي‌به‌شكل‌زير‌خواهد‌بود.

class‌Polynomial{private:

int‌degree;float‌Coef[MaxDegree+1];

};/////////////////////////////////////////////////////////////////////class‌Polynomial{public:

‌Polynomial)int‌deg({degree‌=‌deg;Coef‌=‌new‌float[deg];}

private:int‌degree;float‌*Coef;

};

1پياده‌سازي‌

2پياده‌سازي‌

13

Page 14: فصل دوم :  آرايه ها و ساختارها

صفحه

‌� در‌اين‌چندجمله‌اي‌ها‌ضرايب‌صفر‌زياد‌هستند‌مثالx1000‌+‌1صفر‌است.‌999داراي‌‌

براي‌ذخيره‌چند‌جمله‌اي‌هاي‌خلوت‌از‌ساختار‌زير‌استفاده‌ميكنيم

عناصر‌بر‌اساس‌قواي‌صعودي‌و‌يا‌نزولي‌مرتب‌ميشوند

78

3000 87 300 x

14

Page 15: فصل دوم :  آرايه ها و ساختارها

صفحه

class‌Polynomial;class‌Term{friend‌class‌Polynomial;private:

float‌coef;‌‌//Coefficient

int‌exp; ‌‌‌//Exponent};

class‌Polynomial{private:

int‌terms;Term‌termArr[MaxTerms];

public:Polynomial)({

terms‌=‌0;termArr[0]=0;

}};

15

Page 16: فصل دوم :  آرايه ها و ساختارها

16صفحه

Polynomial‌Polynomial::Add)const‌Polynomial&‌B({Polynomial‌c;int‌a=0‌,‌b=0;float‌temp;while)a<terms‌&&‌b<B.terms({‌‌switch‌)compare)termArr[a].exp,B.termArr[b].exp((‌‌{‌‌‌‌case‌‘=‘:

temp‌=‌termArr[a].coef+B.termArr[b].coef;if)temp(‌‌c.NewTerm)temp,‌termArr[a].exp(;a++;‌‌b++;

‌‌‌‌ break;‌‌‌‌case‌‘<‘:

c.NewTerm)B.termArr[b].coef,‌B.termArr[b].exp(;b++;

‌‌‌‌ break;‌‌‌‌case‌‘<‘:

c.NewTerm)termArr[a].coef,‌termArr[a].exp(;a++;

‌‌‌‌ break;

‌‌}}for)‌;‌a<terms;‌a++(

c.NewTerm)termArr[a].coef,‌termArr[a].exp(;for)‌;‌b<B.terms;‌b++(

‌c.NewTerm)B.termArr[b].coef,‌B.termArr[b].exp(;return‌c;}

جمع‌دو‌چند‌جمله‌اي‌خلوت

Page 17: فصل دوم :  آرايه ها و ساختارها

صفحه

void‌Polynomial::NewTerm)float‌c‌,‌int‌e(‌{‌‌‌if)terms‌<=‌MaxTerms(‌‌‌{‌‌‌‌‌‌‌cerr<<“Too‌many‌terms‌in‌polynomial\n”;‌‌‌‌‌‌‌return;‌‌‌}‌‌‌termArr[terms].coef‌=‌c;‌‌‌termArr[terms].exp‌=‌e;‌‌‌terms++;}

17

Page 18: فصل دوم :  آرايه ها و ساختارها

صفحه

برنامه‌اي‌بنويسيد‌كه‌دو‌چند‌جمله‌اي‌خلوت‌را‌در‌هم‌ضرب‌نمايد.

براي‌پياده‌سازي‌تابع‌ضرب‌در‌صورت‌نياز‌توابع‌ديگري‌كه‌◦كار‌شما‌را‌ساده‌تر‌سازد‌را‌نيز‌ميتوانيد‌تعريف‌نماييد

))زمان‌تحويل‌جلسه‌آيندهزمان‌تحويل‌جلسه‌آينده((

18

Page 19: فصل دوم :  آرايه ها و ساختارها

صفحه

‌mبه‌طور‌کلي‌در‌رياضيات‌،‌يک‌ماتريس‌شامل‌ستون‌بوده‌و‌مي‌تواند‌مانند‌شکل‌زير‌‌nسطر‌و‌

نمايش‌داده‌شود.

27- 3 4

6 82 2-

109 64- 11

12 8 9

48 27 47

row 0

row 1

row 2

row 3

row 4

col1 col2 col3

19

Page 20: فصل دوم :  آرايه ها و ساختارها

صفحه

در‌علوم‌کامپيوتر‌متداول‌ترين‌نمايش‌براي‌ماتريس‌a[MAX_ROW]آرايه‌دوبعدي‌است‌که‌به‌صورت‌

[MAX_COLS]نمايش‌داده‌مي‌شود.‌هر‌عنصر‌‌‌نمايش‌داده‌مي‌شود.‌a[i][j]ماتريس‌به‌صورت‌

ماتريس‌ماتريسي‌که‌عناصر‌صفر‌آن‌زياد‌باشد‌‌ناميده‌مي‌شود.اسپارس

ماتريس‌ماتريس‌اسپاراسپارسس

ايجاد،‌جمع‌،‌ضرب‌و‌ايجاد،‌جمع‌،‌ضرب‌و‌حداقل‌اعمال‌ممکن‌شامل‌‌ميباشد.ترانهاده‌ماتريسترانهاده‌ماتريس

20

Page 21: فصل دوم :  آرايه ها و ساختارها

0 0 0 0 9

0 5 8 0 0

0 0 0 0 0

Page 22: فصل دوم :  آرايه ها و ساختارها

صفحه

با‌توجه‌به‌ويژگيهاي‌اين‌ماتريس‌هر‌عضو‌را‌مي‌توان‌بصورت‌منحصر‌بفردي‌با‌سه‌تايي‌

<row,col,value>.مشخص‌نمود‌

سه‌تايي‌هاي‌بدست‌آمده‌بر‌اساس‌سطرها‌مرتب‌هستند‌و‌سپس‌عناصري‌كه‌در‌يك‌سطر‌قرار‌دارند‌

به‌ترتيب‌شماره‌ستون‌مرتب‌ميشوند.

22

Page 23: فصل دوم :  آرايه ها و ساختارها

صفحه

0 0 0 0 9

0 5 8 0 0

0 0 0 0 0

Row Col Value

0 4 9

1 1 5

1 2 8

class‌SpMtx;‌‌‌//Sparse‌Matrix‌classclass‌MTerm{friend‌class‌SpMtx;private:

int‌row,col,value;};

class‌SpMtx{private:

int‌Rows,Cols,Terms;MTerm‌smArr[MaxTerms];

};

23

Page 24: فصل دوم :  آرايه ها و ساختارها

صفحه

براي‌پيدا‌نمودن‌ترانهاده‌يک‌ماتريس‌بايد‌جاي‌سطرها‌و‌ستون‌ها‌را‌عوض‌کرد‌بدين‌مفهوم‌که‌هر‌

در‌‌b[j][i]در‌ماتريس‌اوليه‌به‌عنصر‌a[i][j]عنصر‌ماتريس‌ترانهاده‌تبديل‌مي‌شود.‌

‌،الگوريتم‌زير‌براي‌پيدا‌کردن‌ترانهاده‌يک‌ماتريس‌،‌الگوريتم‌زير‌براي‌پيدا‌کردن‌ترانهاده‌يک‌ماتريس‌الگوريتم‌مناسبي‌است‌:الگوريتم‌مناسبي‌است‌:

for all element in column j

place element < i ، j ،value> in

element < j ، i ،value>

24

Page 25: فصل دوم :  آرايه ها و ساختارها

صفحه

SpMtx‌SpMtx::Transpose)({SpMtx‌b;b.Rows‌=‌Cols;b.Cols‌=‌Rows;b.Terms‌=‌Terms;if)Terms<=0(‌‌‌return‌b;int‌CurB=0;for)int‌c=0‌;‌c<Cols‌;‌c++(‌‌‌for)int‌i=0‌;‌i<Terms‌;‌i++(‌‌‌‌‌‌if)smArr[i].Col‌==‌c(‌‌‌‌‌‌{

‌b.smArr[CurB].row=c;‌b.smArr[CurB].col=smArr[i].row;‌b.smArr[CurB].value=smArr[i].value;‌CurB++;

‌‌‌‌‌‌}return‌b;}

25

Page 26: فصل دوم :  آرايه ها و ساختارها

صفحه

الگوريتم‌بيان‌شده‌نشان‌مي‌دهد‌که‌بايد‌تمام‌‌ذخيره‌‌0را‌پيدا‌و‌آنها‌را‌در‌سطر‌0عناصر‌در‌ستون‌

‌را‌پيدا‌و‌در‌سطر‌1کرد‌همچنين‌تمام‌عناصر‌ستون‌‌قرار‌داد‌و‌همين‌فرآيند‌را‌ادامه‌داد.‌از‌آنجا‌که‌1

ماتريس‌اوليه‌سطري‌بوده‌‌لذا‌ستون‌هاي‌داخل‌هر‌سطر‌از‌ماتريس‌ترانهاده‌نيز‌به‌صورت‌صعودي‌

مرتب‌مي‌شود.

26

Page 27: فصل دوم :  آرايه ها و ساختارها

صفحه

تعيين‌زمان‌اجراي‌اين‌الگوريتم‌از‌آنجا‌که‌حلقه‌هاي‌تودرتوي‌

for.عامل‌تعيين‌کننده‌مي‌باشد‌،‌آسان‌است‌

حلقه‌forخارجي‌‌Colsمرتبه‌تکرار‌مي‌شود‌که‌‌Colsحاوي‌‌

تعداد‌ستون‌هاي‌ماتريس‌اوليه‌است.

به‌ازاي‌هر‌بار‌تكرار‌حلقه‌خارجي‌حلقه‌داخلي‌Termsبار‌تكرار‌‌

‌تعداد‌عناصر‌غيرصفر‌ماتريس‌اوليه‌ميباشدTermsميشود‌كه‌

بنابراين‌زمان‌کلي‌براي‌حلقه‌هاي‌تودرتوي‌forبرابر‌با‌حاصل‌‌

‌مي‌باشد.‌(Cols.Terms)ضرب‌ستون‌ها‌در‌عناصر‌

بنابراين‌زمان‌اجرا‌به‌صورت‌O)Cols.Terms(.خواهد‌بود‌

27

Page 28: فصل دوم :  آرايه ها و ساختارها

صفحه

آيا‌ميتوان‌سرعت‌الگوريتم‌يافتن‌ترانهاده‌را‌افزايش‌داد.

2تمرين‌

با‌مراجعه‌به‌كتاب‌الگوريتم‌محاسبه‌سريع‌

ترانهاده‌را‌به‌همراه‌الگوريتم‌بيان‌شده‌پياده‌

سازي‌نماييد.))زمان‌تحويل‌هفته‌آيندهزمان‌تحويل‌هفته‌آينده((

28

Page 29: فصل دوم :  آرايه ها و ساختارها

صفحه

در‌c++.آرايه‌هاي‌چند‌بعدي‌به‌شكل‌زير‌تعريف‌ميشوند‌ DataType‌‌ArrayName[D1][D2]…[Dn]

كه‌Diتعداد‌عناصر‌بعد‌‌‌i.ام‌ميباشددر‌زبانهاي‌برنامه‌نويسي‌ديگر‌مانند‌Pascalميتوان‌براي‌‌

انديسهاي‌آرايه‌بازه‌تعريف‌نمود: DataType‌‌ArrayName[P1..Q1][P2..Q2]…[Pn..Qn]

29

Page 30: فصل دوم :  آرايه ها و ساختارها

30صفحه

با‌توجه‌به‌تعريفي‌كه‌ارائه‌شد‌تعداد‌خانه‌هاي‌آرايه‌nبعدي‌‌به‌شكل‌زير‌محاسبه‌ميشود:

)(1

ii

n

iPQ

Page 31: فصل دوم :  آرايه ها و ساختارها

صفحه

:در‌آرايه‌يك‌بعدي

‌A[i]‌=‌‌+‌iآدرس

:در‌آرايه‌دو‌بعدي

‌A[i][j]‌=‌‌+‌iD2‌+‌jآدرس

:در‌آرايه‌سه‌بعدي

‌A[i][j][k]‌=‌‌+‌i.D2.D3‌+‌j.D3‌+‌kآدرس

در‌آرايه‌n:بعدي‌

‌A[i1][i2]…[in]‌=‌‌+‌i1.D2.D3…Dn‌+‌i2.D3.D4…Dn+…+‌inآدرس

31

Page 32: فصل دوم :  آرايه ها و ساختارها

صفحه

آدرس‌A[i1][i2]…[in]

32

; 1

; ; 1

1

nk

nknkDa

ai

n

kjj

k

n

kkk

Page 33: فصل دوم :  آرايه ها و ساختارها

33صفحه

تعريف‌يک‌رشته‌به‌صورت‌‌ADTاز‌ديدگاه‌‌‌‌‌‌کاراکترهاي‌اخذ‌شده‌از‌مي‌گردد‌به‌نحوي‌که‌

مجموعه‌کاراکترهاي‌زبان‌برنامه‌نويسي‌مي‌باشد.‌‌يک‌رشته‌تهي‌مي‌باشد. Sباشد،‌n=0اگر‌

10 ,..., nssS

is

‌،‌رشته‌ها‌به‌صورت‌آرايه‌هاي‌کاراکتري‌که‌بهCدر‌زبان‌‌ختم‌مي‌شوند‌،آرايه‌مي‌گردد.’0\‘‌کاراکترتهي‌

Page 34: فصل دوم :  آرايه ها و ساختارها

34صفحه

عملکردهاي‌مناسب‌و‌مفيدي‌وجود‌دارد‌که‌مي‌توان‌براي‌رشته‌ها‌تعريف

کرد‌مانند‌:‌

ايجاد‌يک‌رشته‌تهي‌جديد

خواندن‌يا‌نوشتن‌يک‌رشته‌

ضميمه‌کردن‌دو‌رشته‌به‌يکديگر‌(concatenation)‌کپي‌کردن‌يک‌رشته

مقايسه‌رشته‌ها

درج‌کردن‌يک‌زير‌رشته‌به‌داخل‌رشته

برداشتن‌يک‌زير‌رشته‌از‌يک‌رشته‌مشخص

پيدا‌کردن‌يک‌الگو(pattern)يا‌عبارت‌در‌يک‌رشته‌

‌جديدADTمختص‌

Page 35: فصل دوم :  آرايه ها و ساختارها

35صفحه

d o g \0

‌نحوه‌ذخيره‌سازي‌در‌حافظه:

char‌‌s[]‌=‌"dog”;

s[0] s[1] ‌‌s[2]‌‌‌‌‌s[3]

‌Cنمايش‌رشته‌در‌زبان

Page 36: فصل دوم :  آرايه ها و ساختارها

36صفحه

a m o b i l e \0

u t o \

0

‌جاي‌‌sرشته‌‌i=1را‌در‌موقعيت‌tمي‌خواهيم‌رشته‌دهيم‌:

a u t o m o b i l e \0

a u t o \0

a \

0

\0

s

t

temp initially

)a(‌After‌strncpy)temp،s،i(

)b(‌After‌strcat)temp،t(

temptemptemp

Page 37: فصل دوم :  آرايه ها و ساختارها

صفحه

،‌به‌‌patوstringفرض‌کنيد‌که‌دو‌رشته‌داريم‌،‌‌بوده‌و‌بايد‌در‌‌patternيک‌الگو‌يا‌patنحوي‌stringپيدا‌شود.‌ساده‌ترين‌راه‌براي‌تعيين‌اينکه‌آيا‌‌

patدر‌رشته‌وجود‌دارد‌يا‌خير،‌استفاده‌از‌تابع‌‌‌مي‌باشد.strstrکتابخانه‌اي‌‌براي‌تطابق‌عبارت‌مناسب‌به‌نظر‌strstrبا‌وجود‌اينکه‌

مي‌رسد‌،‌دو‌دليل‌عمده‌براي‌نوشتن‌تابع‌تطابق‌الگو‌وجود‌دارد‌:

‌جديد‌بوده‌و‌ممکن‌است‌.‌ANSI Cبراي‌‌strstrتابع‌که‌در‌کامپايلر‌موجود‌نباشد.

‌چندين‌روش‌براي‌پياده‌سازي‌تابع‌تطابق‌الگو‌وجود‌37دارد.

Page 38: فصل دوم :  آرايه ها و ساختارها

صفحه

تطابق‌الگو

غير‌موثرترين‌روش‌،‌تست‌متوالي‌هر‌کاراکتر‌رشته‌تا‌زمان‌پيدا‌شدن‌الگو‌و‌يا‌رسيدن‌به‌انتهاي‌رشته‌،‌

‌نباشد،‌اين‌روش‌داراي‌‌stringدر‌patمي‌باشد.‌اگر‌ ‌طول‌‌nخواهد‌بود‌که‌در‌آن‌(n.m)0زمان‌محاسباتي‌

patوmطول‌ string‌.مي‌باشد‌

نکتهنکته

38

Page 39: فصل دوم :  آرايه ها و ساختارها

صفحه

class CMyString{public:

char *str;CMyString(char *init,int len);CMyString(CMyString &s);int Getlength();int Find(CMyString &pat);

};CMyString::CMyString(char *init,int le){

str=new char[le];strcpy(str,init);

}CMyString::CMyString(CMyString &s){

str=new char[s.Getlength()+1];strcpy(str,s.str);

}int CMyString::Getlength(){

return strlen(str);}

كالس‌رشته‌به‌همراه‌كالس‌رشته‌به‌همراه‌سازنده‌ها‌و‌تعريف‌سازنده‌ها‌و‌تعريف‌توابع‌عضوتوابع‌عضو

39

Page 40: فصل دوم :  آرايه ها و ساختارها

صفحه

int CMyString::Find(CMyString &pat){

char *p=pat.str,*s=str;int srcL = Getlength() , patLen = pat.Getlength();int i,j;for(i=0;i<= srcL - patLen ; i++){

for(j=0;j< patLen ; j++)if(s[i+j]!=p[j])

break;if(j== patLen )

return i;}return -1;

}

روش‌اول‌پياده‌سازي‌جستجوي‌يك‌زير‌روش‌اول‌پياده‌سازي‌جستجوي‌يك‌زير‌رشتهرشته

40

Page 41: فصل دوم :  آرايه ها و ساختارها

تابع‌شكست:‌براي‌هر‌يك‌از‌عناصر‌تعيين‌ميكنيم‌در‌صورت‌شكست‌از‌چه‌عنصري‌بررسي‌مجدد‌آغاز‌شود.‌

‌يك‌‌patدر‌رشته‌jو‌به‌ازاي‌هر‌كاراكتر‌در‌موقعيت‌مقدار‌بدست‌مي‌آيد.

jاندي(س(

0 1 2 3 4 5 6 7 8 9

pat a b c a b c a c a b

f -1 -1 -1 0 1 2 3 -1 0 1

Page 42: فصل دوم :  آرايه ها و ساختارها

j)انديس( 0 1 2 3 4 5 6 7 8 9

pat a b c a b c a c a bf -1 -1 -1 0 1 2 3 -1 0 1

f)j(=(=

-‌p0p1…pk=‌pj-kpjبصورتي‌كه‌‌k<jكه‌‌kبزرگترين‌مقدار

k+1…pjاگر‌چنين‌‌k≤jاي‌وجود‌داشته‌باشد‌‌kk

-1-1 در‌غير‌اينصورت

Page 43: فصل دوم :  آرايه ها و ساختارها

صفحه

class CMyString{public:

char *str;

char *f;CMyString(char *init,int len);CMyString(CMyString &s);int Getlength();int Find(CMyString &pat);

void Fastfind(CString &pat);void Fail();

};CMyString::CMyString(char *init,int le){

str=new char[le];

f=new char[le];strcpy(str,init);

}CMyString::CMyString(CMyString &s){

str=new char[s.Getlength()+1];

f=new char[s.Getlength()+1];strcpy(str,s.str);

}

‌‌‌fافزودن‌متغير‌عضوجهت‌نگهداري‌مقادير‌شكست‌و‌تغييرات‌اعمال‌شده‌در‌‌سازنده‌ها‌و

43

Page 44: فصل دوم :  آرايه ها و ساختارها

صفحه

int CMyString::Fail(){

int lengthp=Getlength();f[0]=-1;for(int j=1 ; j<lengthp ; j++){

int pf = f[j-1];while(str[j]!=str[pf+1] && pf>=0)

i=f[pf];if(str[j]==str[pf+1])

f[j]=pf+1;else

f[j]=-1;}

}

44

Page 45: فصل دوم :  آرايه ها و ساختارها

صفحه

int CMyString::Fastfind(CMyString &pat){

pat.Fail();int posp=0,poss=0;int lengthp=pat.Getlength(),lengths=Getlength();while(posp<lengthp && poss<lengths){

if(pat.str[posp]==str[poss]){

posp++;poss++;

}else{

if(posp==0)poss++;

elseposp=pat.f[posp-1]+1;

}}if(posp<lengthp)

return -1;return poss-lengthp;

}45

Page 46: فصل دوم :  آرايه ها و ساختارها

صفحه

كالس‌رشته‌را‌با‌دو‌تابع‌findو‌‌fastfindپياده‌سازي‌‌نموده‌و‌سرعت‌جستجوي‌يك‌زير‌رشته‌را‌در‌متن‌

مقايسه‌نماييد.

))زمان‌تحويل‌هفته‌بعدزمان‌تحويل‌هفته‌بعد((

46