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 ,..., itemn1
مثال :
روزهاي هفته ( شنبه ...جمعه )
صفحه
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 n1
تعريف مي گردد به
آز ديدگاه 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