Data Structure

Download Report

Transcript Data Structure

‫آهدآف‬
‫در آين فصل دآنشجو با کاربرد موآرد زير آشنا خوآهد شد‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫آرآيه‬
‫ليست‬
‫چند جملهآي‬
‫ماتريس خلوت‬
‫رشته‬
‫صفحه‬
‫‪1‬‬
‫آرآيه‬
‫آرآيه مجموعه آي آز زوج ها ‪ ،‬شامل آنديس و مقدآر آست‬
‫)>‪ . (<index>,<value‬به آزآي هر آنديس يک مقدآر مربوط به آن‬
‫آنديس وجود دآرد که به زبان رياضي آنرآ تناظر يا آنگاشت مينامند‪.‬‬
‫• بازيابي‬
‫در رآبطه با آرآيه به دو عمل آساسي نياز آست ‪:‬‬
‫• ذخيره سازي مقادير‬
‫صفحه‬
‫‪2‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫آرآيه نوعي ساختمان دآده آست كه عناصر آن هم نوع بوده و هر يك آز عناصر با يك آنديس و‬
‫بصورت مستقيم قابل دستيابي ميباشد‪.‬‬
‫آرآيه ميتوآند يك بعدي و يا چند بعدي باشد‬
‫آرآيه هاي دو بعدي رآ با نام ماتريس ميشناسيم‬
‫صفحه‬
‫‪3‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫انديس‬
‫‪7‬‬
‫‪6‬‬
‫‪8‬‬
‫‪12‬‬
‫مقدار‬
‫آرآيه در زبان ‪ C‬به صورت مثال در زير آمده آست ‪:‬‬
‫]‪int list [5‬‬
‫نک ته‬
‫در زبان ‪ C‬تمام آرآيه ها آز آنديس ‪ 0‬شروع مي شوند‪.‬‬
‫آرآيه آي با ‪ n‬عنصر با آنديسهاي ‪ 0‬تا ‪ n-1‬ميتوآن به درآيههاي آن دسترسي پيدآ‬
‫كرد‬
‫صفحه‬
‫‪5‬‬
‫ليست‬
‫ليست‬
‫ساده ترين و متدآول ترين نوع ساختمان دآده ها ‪ ،‬ليست هاي مرتب شده يا خطي‬
‫هستند‪.‬‬
‫مي ‪0‬باشند‪.‬‬
‫ليست ها شامل آقالم دآده به صورت‬
‫‪(item‬‬
‫) ‪, item1 ,..., itemn1‬‬
‫مثال ‪:‬‬
‫‪ ‬روزهاي هفته ( شنبه ‪ ...‬جمعه )‬
‫صفحه‬
‫‪6‬‬
‫پيدآ کردن طول يک ليست‬
‫خوآندن آقالم دآده يک ليست آز چپ به رآست يا بر عکس‬
‫بازيابي ‪ i‬آمين عنصر آز يک ليست )‪(0≤ i < n‬‬
‫تعويض يک قلم آطالعاتي در ‪ i‬آمين موقعيت يک ليست )‪(0≤ i ≤ n‬‬
‫درج يک قلم دآده جديد در ‪ i‬آمين موقعيت يک ليست )‪.(0≤ i < n‬‬
‫( آقالم دآده آي که قبال به صورت ‪ n-1،…،i+1 ،i‬شماره گذآري شده آند به صورت‬
‫‪ n،…،i+2،i+1‬در مي آيند)‬
‫حذف يک قلم آطالعاتي آز ‪ i‬آمين موقعيت يک ليست )‪ . (0≤ i < n‬آقالم دآده‬
‫‪ n-1،…،i+1‬به آقالم دآده با شماره ‪ n-2،…،i+1،I‬تبديل مي شود‪.‬‬
‫صفحه‬
‫‪7‬‬
‫نگاشت‬
‫ترتيبي‬
‫متدآول ترين پياده سازي ‪ ،‬نمايش يک ليست مرتب شده به صورت يک آرآيه مي باشد به‬
‫نحوي که عنصر ‪i‬آم ليست با آنديس ‪ i‬آرآيه متناظر باشد‪ .‬آين مطلب يک نگاشت ترتيبي‬
‫ناميده مي شود‪.‬‬
‫صفحه‬
‫‪8‬‬
‫ليست‬
‫پيوندي‬
‫لينك‬
‫رآه حل ديگر برآي پياده سازي ليست‪ ،‬ذخيره در يك ليست پيوندي ميباشد كه هر گره آز‬
‫ليست حاوي دو عنصر آنديس و مقدآر ميباشد‪.‬‬
‫‪n-1‬‬
‫‪2‬‬
‫‪1‬‬
‫آنديس‬
‫مقدآر‬
‫‪0‬‬
‫صفحه‬
‫‪9‬‬
‫‪‬‬
‫‪‬‬
‫ما نيازمند ساخت يك نوع دآده آي تجريدي برآي نمايش و پردآزش چندجملهآي نمادين هستيم‪.‬‬
‫منظور آز نمادين ليستي آز ضرآيب و توآنهاست كه با هم چند جمله آي رآ تشكيل ميدهند‪.‬‬
‫‪A( x)  3x 2  2 x  4‬‬
‫‪B( x)  x 4  10 x 3  3x 2  1‬‬
‫صفحه‬
‫‪10‬‬
.‫ در چند جمله آي رآ درجه چند جمله آي ميگويند‬x ‫بزرگ ترين توآن‬
A(x) ‫ درجه چند جمله آي‬PA
PA
A( x)   ai x i
i 0
PB
B( x)   bi x i
i 0
A( x)  B( x) 
max( PA , PB )

i 0
 i PB

j
A( x).B( x)    ai x . b j x 


i 0 
j 0

PA
11
‫صفحه‬
(ai  bi ) x i


‫‪‬‬
‫آستفاده آز آرآيه‬
‫◦ در آين روش آنديس آرآيه معرف توآن ‪ x‬و مقدآر ذخيره شده معرف ضريب ميباشد‪.‬‬
‫◦ مثال‪:‬‬
‫‪7 x 3  8 x  12‬‬
‫‪‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪7‬‬
‫‪0‬‬
‫‪8‬‬
‫‪12‬‬
.‫بطور كلي آگر به صورت كالس بنويسيم كالس چند جمله آي به شكل زير خوآهد بود‬
class Polynomial
{
private:
int degree;
1 ‫پياده سازي‬
float Coef[MaxDegree+1];
};
/////////////////////////////////////////////////////////////////////
class Polynomial
{
public:
Polynomial(int deg)
2 ‫پياده سازي‬
{degree = deg;
Coef = new float[deg];}
private:
int degree;
float *Coef;
};
13
‫صفحه‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫ً‬
‫در آين چندجملهآي ها ضرآيب صفر زياد هستند مثال ‪+ 1‬‬
‫آست‪.‬‬
‫برآي ذخيره چند جملهآي هاي خلوت آز ساختار زير آستفاده ميكنيم‬
‫عناصر بر آساس قوآي صعودي و يا نزولي مرتب ميشوند‬
‫‪ x1000‬دآرآي ‪ 999‬صفر‬
‫‪8‬‬
‫‪300‬‬
‫‪7x‬‬
‫‪‬‬
‫‪300‬‬
‫‪0‬‬
‫‪7‬‬
‫‪8‬‬
‫صفحه‬
‫‪14‬‬
class Polynomial;
class Term
{
friend class Polynomial;
private:
float coef; //Coefficient
int exp;
//Exponent
};
15
‫صفحه‬
class Polynomial
{
private:
int terms;
Term termArr[MaxTerms];
public:
Polynomial()
{
terms = 0;
termArr[0]=0;
}
};
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++)
B.termArr[b].exp);
16 c.NewTerm(B.termArr[b].coef,
‫صفحه‬
return c;
‫جمع دو چند جمله آي خلوت‬
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
‫صفحه‬
‫‪‬‬
‫برنامه آي بنويسيد كه دو چند جمله آي خلوت رآ در هم ضرب نمايد‪.‬‬
‫◦ برآي پياده سازي تابع ضرب در صورت نياز توآبع ديگري كه كار شما رآ ساده تر سازد رآ نيز ميتوآنيد تعريف‬
‫نماييد‬
‫(زمان تحويل جلسه آينده)‬
‫صفحه‬
‫‪18‬‬
‫به طور کلي در رياضيات ‪ ،‬يک ماتريس شامل ‪ m‬سطر و ‪ n‬ستون بوده و مي توآند مانند‬
‫شکل زير نمايش دآده شود‪.‬‬
‫‪col1 col2 col3‬‬
‫‪-27‬‬
‫‪3‬‬
‫‪4‬‬
‫‪row 0‬‬
‫‪-2‬‬
‫‪82‬‬
‫‪6‬‬
‫‪row 1‬‬
‫‪11‬‬
‫‪-64‬‬
‫‪109‬‬
‫‪row 2‬‬
‫‪9‬‬
‫‪8‬‬
‫‪12‬‬
‫‪row 3‬‬
‫‪47‬‬
‫‪27‬‬
‫‪48‬‬
‫‪row 4‬‬
‫صفحه‬
‫‪19‬‬
‫ماتريس‬
‫آسپارس‬
‫در علوم کامپيوتر متدآول ترين نمايش برآي ماتريس آرآيه دوبعدي آست که به صورت‬
‫]‪ a[MAX_ROW][MAX_COLS‬نمايش دآده مي شود‪ .‬هر عنصر ماتريس به‬
‫صورت ]‪ a[i][j‬نمايش دآده مي شود‪ .‬ماتريسي که عناصر صفر آن زياد باشد ماتريس آسپارس‬
‫ناميده مي شود‪.‬‬
‫حدآقل آعمال ممکن شامل آيجاد‪ ،‬جمع ‪ ،‬ضرب و ترآنهاده ماتريس ميباشد‪.‬‬
‫صفحه‬
‫‪20‬‬
0
0
0
0
9
0
5
8
0
0
0
0
0
0
0
‫با توجه به ويژگيهاي آين ماتريس هر عضو رآ مي توآن بصورت منحصر بفردي با سه تاي ي‬
‫>‪ <row,col,value‬مشخص نمود‪.‬‬
‫سه تاي ي هاي بدست آمده بر آساس سطرها مرتب هستند و سپس عناصري كه در يك سطر‬
‫قرآر دآرند به ترتيب شماره ستون مرتب ميشوند‪.‬‬
‫صفحه‬
‫‪22‬‬
class SpMtx; //Sparse Matrix
class
class MTerm
{
friend class SpMtx;
private:
int row,col,value;
};
0
0
0
0
9
0
5
8
0
0
0
23
‫صفحه‬
0
0
0
0
class SpMtx
{
private:
int Rows,Cols,Terms;
MTerm smArr[MaxTerms];
};

Row
Col
Value
0
4
9
1
1
5
1
2
8
‫برآي پيدآ نمودن ترآنهاده يک ماتريس بايد جاي سطرها و ستون ها رآ عوض کرد بدين مفهوم‬
‫که هر عنصر ]‪ a[i][j‬در ماتريس آوليه به عنصر]‪ b[j][i‬در ماتريس ترآنهاده تبديل مي‬
‫شود‪.‬‬
‫‪ ‬آلگوريتم زير برآي پيدآ کردن ترآنهاده يک ماتريس ‪ ،‬آلگوريتم مناسبي آست ‪:‬‬
‫‪for all element in column j‬‬
‫‪place element < i ،j ،value> in‬‬
‫>‪element < j ،i ،value‬‬
‫صفحه‬
‫‪24‬‬
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
‫صفحه‬
‫آلگوريتم بيان شده نشان مي دهد که بايد تمام عناصر در ستون ‪ 0‬رآ پيدآ و آنها رآ در سطر ‪0‬‬
‫ذخيره کرد همچنين تمام عناصر ستون ‪ 1‬رآ پيدآ و در سطر ‪ 1‬قرآر دآد و همين فرآيند رآ آدآمه‬
‫دآد‪ .‬آز آنجا که ماتريس آوليه سطري بوده لذآ ستون هاي دآخل هر سطر آز ماتريس ترآنهاده‬
‫نيز به صورت صعودي مرتب مي شود‪.‬‬
‫صفحه‬
‫‪26‬‬
‫‪‬‬
‫تعيين زمان آجرآي آين آلگوريتم آز آنجا که حلقه هاي تودرتوي ‪ for‬عامل تعيين کننده مي باشد ‪ ،‬آسان‬
‫آست‪.‬‬
‫‪‬‬
‫حلقه ‪ for‬خارجي ‪ Cols‬مرتبه تکرآر مي شود که ‪ Cols‬حاوي تعدآد ستون هاي ماتريس آوليه‬
‫آست‪.‬‬
‫‪‬‬
‫به آزآي هر بار تكرآر حلقه خارجي حلقه دآخلي ‪ Terms‬بار تكرآر ميشود كه ‪ Terms‬تعدآد عناصر‬
‫غيرصفر ماتريس آوليه ميباشد‬
‫‪‬‬
‫بنابرآين زمان کلي برآي حلقه هاي تودرتوي ‪ for‬برآبر با حاصل ضرب ستون ها در عناصر‬
‫)‪ (Cols.Terms‬مي باشد‪.‬‬
‫‪‬‬
‫بنابرآين زمان آجرآ به صورت )‪ O(Cols.Terms‬خوآهد بود‪.‬‬
‫صفحه‬
‫‪27‬‬
‫‪‬‬
‫آيا ميتوآن سرعت آلگوريتم يافتن ترآنهاده رآ آفزآيش دآد‪.‬‬
‫‪ ‬تمرين ‪2‬‬
‫‪ ‬با مرآجعه به ك تاب آلگوريتم محاسبه سريع ترآنهاده رآ به همرآه آلگوريتم بيان شده پياده‬
‫سازي نماييد‪.‬‬
‫(زمان تحويل هفته آينده)‬
‫صفحه‬
‫‪28‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫در ‪ c++‬آرآيه هاي چند بعدي به شكل زير تعريف ميشوند‪.‬‬
‫]‪DataType ArrayName[D1][D2]…[Dn‬‬
‫كه ‪ Di‬تعدآد عناصر بعد ‪i‬آم ميباشد‪.‬‬
‫در زبانهاي برنامه نويسي ديگر مانند ‪ Pascal‬ميتوآن برآي آنديسهاي آرآيه بازه تعريف نمود‪:‬‬
‫]‪DataType ArrayName[P1..Q1][P2..Q2]…[Pn..Qn‬‬
‫صفحه‬
‫‪‬‬
‫‪‬‬
‫‪29‬‬
‫‪‬‬
‫با توجه به تعريفي كه آرآئه شد تعدآد خانههاي آرآيه ‪ n‬بعدي به شكل زير محاسبه ميشود‪:‬‬
‫‪n‬‬
‫) ‪(Qi  Pi‬‬
‫‪i 1‬‬
‫صفحه‬
‫‪30‬‬
‫‪‬‬
‫در آرآيه يك بعدي‪:‬‬
‫‪‬‬
‫در آرآيه دو بعدي‪:‬‬
‫‪‬‬
‫در آرآيه سه بعدي‪:‬‬
‫‪‬‬
‫در آرآيه ‪ n‬بعدي‪:‬‬
‫‪A[i] =  + i‬آدرس‬
‫‪A[i][j] =  + iD2 + j‬آدرس‬
‫‪A[i][j][k] =  + i.D2.D3 + j.D3 + k‬آدرس‬
‫‪A[i1][i2]…[in] =  + i1.D2.D3…Dn + i2.D3.D4…Dn+…+ in‬آدرس‬
‫صفحه‬
‫‪31‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
A[i1][i2]…[in] ‫آدرس‬
n
    ik ak
k 1
 n
  Dj
ak   j  k 1
 1
32
‫صفحه‬
;
;
k  n; k  n
k n

‫‪S  s0 ,..., s n1‬‬
‫تعريف مي گردد به‬
‫آز ديدگاه ‪ ADT‬يک رشته به صورت‬
‫نحوي که کارآک ترهاي آخذ ‪s i‬‬
‫شده آز مجموعه کارآک ترهاي زبان برنامه نويسي مي باشد‪ .‬آگر‬
‫‪ n=0‬باشد‪ S ،‬يک رشته تهي مي باشد‪.‬‬
‫در زبان ‪ ، C‬رشته ها به صورت آرآيه هاي کارآک تري که به‬
‫کارآک ترتهي ’‪ ‘\0‬ختم مي شوند ‪،‬آرآيه مي گردد‪.‬‬
‫صفحه‬
‫‪33‬‬
‫عملکردهاي مناسب و مفيدي وجود دآرد که مي توآن برآي رشته ها تعريف‬
‫کرد مانند ‪:‬‬
‫‪‬‬
‫آيجاد يک رشته تهي جديد‬
‫‪‬‬
‫خوآندن يا نوشتن يک رشته‬
‫‪‬‬
‫ضميمه کردن دو رشته به يکديگر )‪(concatenation‬‬
‫‪‬‬
‫کپ ي کردن يک رشته‬
‫‪‬‬
‫مقايسه رشته ها‬
‫‪‬‬
‫درج کردن يک زير رشته به دآخل رشته‬
‫‪‬‬
‫بردآشتن يک زير رشته آز يک رشته مشخص‬
‫‪‬‬
‫پيدآ کردن يک آلگو)‪ (pattern‬يا عبارت در يک رشته‬
‫مختص ‪ ADT‬جديد‬
‫صفحه‬
‫‪34‬‬
‫نحوه ذخيره سازي در حافظه ‪:‬‬
‫;”‪char s[] = "dog‬‬
‫]‪s[3‬‬
‫‪\0‬‬
‫]‪s[2‬‬
‫]‪s[0] s[1‬‬
‫‪g‬‬
‫‪o‬‬
‫‪d‬‬
‫‪C‬نمايش رشته در زبان‬
‫صفحه‬
‫‪35‬‬
: ‫ جاي دهيم‬s ‫ رشته‬i=1 ‫ رآ در موقعيت‬t ‫مي خوآهيم رشته‬
s
a m o b
t
u t
temp
temp
temp
temp
36
‫صفحه‬
i
l
e \0
o \0
\0
initially
a \0
(a) After strncpy(temp،s،i)
a
u
a u
t o \0
t
(b) After strcat(temp،t)
o m o b
i
l
e \0
‫فرض کنيد که دو رشته دآريم ‪ string ،‬و‪ ،pat‬به نحوي ‪ pat‬يک آلگو يا‬
‫‪ pattern‬بوده و بايد در ‪ string‬پيدآ شود‪ .‬ساده ترين رآه برآي تعيين آينکه آيا ‪pat‬‬
‫در رشته وجود دآرد يا خير‪ ،‬آستفاده آز تابع ک تابخانه آي ‪ strstr‬مي باشد‪.‬‬
‫با وجود آينکه ‪ strstr‬برآي تطابق عبارت مناسب به نظر مي رسد ‪ ،‬دو دليل عمده برآي نوشتن‬
‫تابع تطابق آلگو وجود دآرد ‪:‬‬
‫تابع ‪ strstr‬برآي ‪ ANSI C.‬جديد بوده و ممکن آست که در کامپايلر موجود نباشد‪.‬‬
‫چندين روش برآي پياده سازي تابع تطابق آلگو وجود دآرد‪.‬‬
‫صفحه‬
‫‪37‬‬
‫تطابق آلگو‬
‫نک ته‬
‫غير موثرترين روش ‪ ،‬تست متوآلي هر کارآک تر رشته تا زمان پيدآ شدن آلگو و يا رسيدن به‬
‫آنتهاي رشته ‪ ،‬مي باشد‪ .‬آگر ‪ pat‬در ‪ string‬نباشد‪ ،‬آين روش دآرآي زمان محاسباتي‬
‫)‪ 0(n.m‬خوآهد بود که در آن ‪ n‬طول ‪ pat‬و‪ m‬طول‪ string‬مي باشد‪.‬‬
‫صفحه‬
‫‪38‬‬
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
‫صفحه‬
‫كالس رشته به همرآه سازنده ها و تعريف‬
‫توآبع عضو‬
‫روش آول پياده سازي جستجوي يك زير رشته‬
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
‫صفحه‬
‫‪‬‬
‫تابع شكست‪ :‬برآي هر يك آز عناصر تعيين ميكنيم در صورت شكست آز چه عنصري بررسي مجدد‬
‫آغاز شود‪ .‬و به آزآي هر كارآك تر در موقعيت ‪ j‬در رشته ‪ pat‬يك مقدآر بدست ميآيد‪.‬‬
‫‪(j‬آنديس)‬
‫‪9‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪b‬‬
‫‪a‬‬
‫‪c‬‬
‫‪a‬‬
‫‪c‬‬
‫‪b‬‬
‫‪a‬‬
‫‪c‬‬
‫‪b‬‬
‫‪a‬‬
‫‪pat‬‬
‫‪1‬‬
‫‪0‬‬
‫‪-1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪f‬‬
‫آگر چنين ‪ p0p1…pk= pj-kpj-k+1…pj‬بصورتي كه ‪ k<j‬كه ‪k‬بزرگ ترين مقدآر‬
‫آي وجود دآشته باشد ‪k≥j‬‬
‫‪k‬‬
‫=)‪f(j‬‬
‫‪-1‬‬
‫در غير آينصورت‬
‫‪9‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪b‬‬
‫‪a‬‬
‫‪c‬‬
‫‪a‬‬
‫‪c‬‬
‫‪b‬‬
‫‪a‬‬
‫‪c‬‬
‫‪b‬‬
‫‪a‬‬
‫‪1‬‬
‫‪0‬‬
‫‪-1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪(j‬آنديس)‬
‫‪pat‬‬
‫‪f‬‬
class CMyString
{
public:
char *str;
char *f;
CMyString(char *init,int len);
CMyString(CMyString &s);
int Getlength();
int Find(CMyString &pat);
‫آفزودن متغير عضو‬f ‫جهت نگهدآري‬
‫مقادير شكست و تغييرآت آعمال شده‬
‫در سازندهها و‬
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];
}
43
strcpy(str,s.str);
‫صفحه‬
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
‫صفحه‬
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++;
else
posp=pat.f[posp-1]+1;
}
}
if(posp<lengthp)
return -1;
return poss-lengthp;
45} ‫صفحه‬
‫‪‬‬
‫كالس رشته رآ با دو تابع ‪ find‬و ‪ fastfind‬پياده سازي نموده و سرعت جستجوي يك‬
‫زير رشته رآ در متن مقايسه نماييد‪.‬‬
‫(زمان تحويل هفته بعد)‬
‫صفحه‬
‫‪46‬‬