Assignment1.pdf

‫ﺗﻤﺮﻳﻦ ﺳﺮﯼ اول‬
‫ﺳﺎﺧﺘﻤﺎن دادﻩهﺎ و اﻟﮕﻮرﻳﺘﻢهﺎ‬
‫ﺳﺮرﺳﻴﺪ ﺗﺤﻮﻳﻞ ‪١٣٨۵/١٢/٢۴ :‬‬
‫‪ .١‬ﺗﺸﺨﻴﺺ رﺷﺘﻪ ﺣﺮوف‪:‬‬
‫ﺑﺮاﯼ هﺮ ﻳﮏ از ﻣﺠﻤﻮﻋﻪ هﺎﯼ زﻳﺮ ﺑﺎ اﺳﺘﻔﺎدﻩ از ﺗﻌﺪادﯼ ﭘﺸﺘﻪ )ﮐﻪ ﺑﺮاﯼ هﺮ ﻗﺴﻤﺖ ﻣﺸﺨﺺ‬
‫ﺷﺪﻩ اﺳﺖ( اﻟﮕﻮرﻳﺘﻤﯽ ﻃﺮاﺣﯽ ﮐﻨﻴﺪ ﮐﻪ رﺷﺘﻪ اﯼ را از ورودﯼ درﻳﺎﻓﺖ ﮐﻨﺪ و وﺟﻮد ﻳﺎ ﻋﺪم وﺟﻮد ﺁن‬
‫رﺷﺘﻪ را در ﻣﺠﻤﻮﻋﻪ رﺷﺘﻪ هﺎ ﺗﻌﻴﻴﻦ ﮐﻨﺪ‪ .‬در اﻟﮕﻮرﻳﺘﻢ اﺳﺘﻔﺎدﻩ ﺷﺪﻩ ﺗﻨﻬﺎ ﻣﺠﺎز هﺴﺘﻴﺪ از دادﻩ هﺎﯼ ﺑﺎ‬
‫ﻧﻮع ﮐﺎراﮐﺘﺮ و ﺑﻮﻟﯽ )‪ (boolean‬اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ‪) .‬ﻋﺪد ﺑﺎﻻﯼ هﺮ ﺣﺮف ﻧﺸﺎن دهﻨﺪﻩ ﺗﻌﺪاد ﺗﮑﺮار ﺁن‬
‫ﺣﺮف اﺳﺖ(‬
‫)‪a) {anbmambn | m, n ≥ 0} (1 Stack‬‬
‫)‪b) {aibjckdl | i+j > k+l & i, j, k, l ≥ 0} (1 Stack‬‬
‫)‪c) {aibjckdl | i+k > j+l & i, j, k, l ≥ 0} (1 Stack‬‬
‫)‪d) {an^2 | n ≥ 0} (3 Stacks‬‬
‫* در ﺻﻮرﺗﯽ ﮐﻪ ﺑﺮاﯼ ﺑﺨﺶ ‪ d‬ﺑﺘﻮاﻧﻴﺪ اﻟﮕﻮرﻳﺘﻤﯽ ﺑﺎ ‪ ٢‬ﭘﺸﺘﻪ اراﺋﻪ دهﻴﺪ ﻧﻤﺮﻩ اﺿﺎﻓﯽ درﻳﺎﻓﺖ‬
‫ﺧﻮاهﻴﺪ ﮐﺮد‪.‬‬
‫‪ .٢‬ﺻﻒ هﺎ و ﭘﺸﺘﻪ هﺎ‪:‬‬
‫اﻟﻒ( دو ﭘﺸﺘﻪ ﺑﺎ ﻇﺮﻓﻴﺖ ‪ N‬در اﺧﺘﻴﺎر دارﻳﻢ ﮐﻪ ﺗﻨﻬﺎ ﻣﯽ ﺗﻮاﻧﻴﻢ اﻋﻤﺎل ‪ push‬و ‪ pop‬را روﯼ‬
‫ﺁﻧﻬﺎ ﺑﻪ ﮐﺎر ﺑﺮﻳﻢ‪ .‬اﻟﮕﻮرﻳﺘﻤﯽ ﻃﺮاﺣﯽ ﮐﻨﻴﺪ ﮐﻪ ﺑﺎ اﺳﺘﻔﺎدﻩ از اﻳﻦ دو ﭘﺸﺘﻪ ﻳﮏ ﺻﻒ را ﺷﺒﻴﻪ ﺳﺎزﯼ ﮐﻨﺪ‪.‬‬
‫ﺑﺪﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﺑﺘﻮاﻧﺪ اﻋﻤﺎل ‪ enqueue‬و ‪ dequeue‬را ﭘﺸﺘﻴﺒﺎﻧﯽ ﮐﻨﺪ‪ .‬ﺧﻄﺎهﺎﯼ ‪ Overflow‬و‬
‫‪ Underflow‬را ﻧﻴﺰ ﻣﺪ ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ‪ .‬زﻣﺎن اﺟﺮاﯼ اﻟﮕﻮرﻳﺘﻢ را ﻧﻴﺰ ﺗﺤﻠﻴﻞ ﮐﻨﻴﺪ‪.‬‬
‫ب( ﻣﺎﻧﻨﺪ ﺑﺨﺶ ﻗﺒﻞ ﺑﺎ اﺳﺘﻔﺎدﻩ از دو ﺻﻒ ﻳﮏ ﭘﺸﺘﻪ را ﭘﻴﺎدﻩ ﺳﺎزﯼ ﮐﻨﻴﺪ‪ .‬زﻣﺎن اﺟﺮاﯼ‬
‫اﻟﮕﻮرﻳﺘﻢ را ﻧﻴﺰ ﺗﺤﻠﻴﻞ ﮐﻨﻴﺪ‪.‬‬
‫‪ .٣‬ﺻﻒ دوﻃﺮﻓﻪ‪:‬‬
‫ﻳﮏ ﭘﺸﺘﻪ ﺗﻨﻬﺎ اﺟﺎزﻩ اﻓﺰودن و ﺑﺮداﺷﺘﻦ ﻋﻨﺎﺻﺮ را از ﺑﺎﻻﯼ ﺧﻮد ﻣﯽ دهﺪ‪ .‬ﻳﮏ ﺻﻒ ﻧﻴﺰ ﺗﻨﻬﺎ‬
‫اﺟﺎزﻩ اﻓﺰودن ﺑﻪ اﻧﺘﻬﺎ و ﺑﺮداﺷﺘﻦ از اﺑﺘﺪا را ﻣﯽ دهﺪ‪ .‬اﻣﺎ ﻳﮏ ﺻﻒ دو ﻃﺮﻓﻪ ﭼﻨﻴﻦ ﻣﺤﺪودﻳﺘﯽ‬
‫ﻧﺪارد و ﻣﯽ ﺗﻮان ﻋﻤﻞ اﻓﺰودن و ﺑﺮداﺷﺘﻦ را ﺑﺮاﯼ اﺑﺘﺪا و اﻧﺘﻬﺎﯼ ﺁن ﺑﻪ ﮐﺎر ﺑﺮد‪ .‬ﺑﺮاﯼ ﭼﻬﺎر‬
‫ﻋﻤﻞ ‪ pop_front ، push_back ،push_front‬و ‪ pop_back‬در ﻳﮏ ﺻﻒ دوﻃﺮﻓﻪ‬
‫اﻟﮕﻮرﻳﺘﻢ هﺎﻳﯽ ﻃﺮاﺣﯽ ﮐﻨﻴﺪ ﮐﻪ در زﻣﺎن )‪ O(1‬اﺟﺮا ﺷﻮﻧﺪ‪.‬‬
‫‪ .۴‬ﻳﮏ ﻣﺮﺗﺐ ﺳﺎزﯼ ﺧﺎص‪:‬‬
‫ﺁراﻳﻪ ‪ n‬ﺗﺎﻳﯽ ‪ A‬ﺑﺎ اﻋﺪاد ﻣﺘﻤﺎﻳﺰ ‪ ١‬ﺗﺎ ‪ n‬ﭘﺮ ﺷﺪﻩ اﺳﺖ‪ .‬اﻟﮕﻮرﻳﺘﻢ زﻳﺮ ﺑﺮاﯼ ﻣﺮﺗﺐ ﮐﺮدن ﺁراﻳﻪ‬
‫ﭘﻴﺸﻨﻬﺎد ﺷﺪﻩ اﺳﺖ‪:‬‬
‫{)‪void Mysort (int []A, int n‬‬
‫;‪int t, i‬‬
‫)‪for (i=1; i<=n; i++‬‬
‫{)‪while (A[i] != i‬‬
‫;]‪t = A[i‬‬
‫;]]‪A[i] = A[A[i‬‬
‫;‪A[t] = t‬‬
‫}‬
‫}‬
‫اﻟﻒ( ﺑﺮاﯼ اﺛﺒﺎت درﺳﺖ ﺑﻮدن ﻳﮏ اﻟﮕﻮرﻳﺘﻢ ﻣﺮﺗﺐ ﺳﺎزﯼ ﺑﺎﻳﺪ ﭼﻪ ﮔﺰارﻩ هﺎﻳﯽ را اﺛﺒﺎت ﮐﺮد؟‬
‫ب( ﻧﺸﺎن دهﻴﺪ اﻳﻦ اﻟﮕﻮرﻳﺘﻢ درﺳﺖ ﮐﺎر ﻣﯽ ﮐﻨﺪ‪.‬‬
‫پ( زﻣﺎن اﺟﺮاﯼ اﻳﻦ اﻟﮕﻮرﻳﺘﻢ را ﺗﺤﻠﻴﻞ ﮐﻨﻴﺪ‪.‬‬
‫‪ .۵‬ﻣﺤﺎﺳﺒﻪ ‪:Xn‬‬
‫اﻟﮕﻮرﻳﺘﻢ زﻳﺮ ﺑﺮاﯼ ﻣﺤﺎﺳﺒﻪ ‪ Xn‬ﻧﻮﺷﺘﻪ ﺷﺪﻩ اﺳﺖ‪:‬‬
‫{ )‪int Pow(int x, int n‬‬
‫)‪if (n==0‬‬
‫;‪return 1‬‬
‫)‪if (n%2 == 0‬‬
‫;)‪return pow(x, n/2) * pow(x, n/2‬‬
‫‪else‬‬
‫‪return pow(x, n/2) * pow(x, n/2) * x‬‬
‫}‬
‫اﻟﻒ( ﭘﻴﭽﻴﺪﮔﯽ زﻣﺎﻧﯽ اﻟﮕﻮرﻳﺘﻢ ﺑﺎﻻ را ﻣﺤﺎﺳﺒﻪ ﮐﻨﻴﺪ و ﺑﺎ ﻧﻤﺎد ‪ O‬ﻧﻤﺎﻳﺶ دهﻴﺪ‪.‬‬
‫ب( ﺑﺎ ﺗﻐﻴﻴﺮ اﻳﻦ اﻟﮕﻮرﻳﺘﻢ زﻣﺎن اﺟﺮاﯼ ﺁن را ﺑﻪ )‪ O(log n‬ﺗﻐﻴﻴﺮ دهﻴﺪ‪.‬‬
‫پ( اﻟﮕﻮرﻳﺘﻤﯽ را ﮐﻪ در ﻗﺴﻤﺖ ﻗﺒﻞ ﺑﻪ دﺳﺖ ﺁوردﻳﺪ ﺑﻪ ﺻﻮرت ﻏﻴﺮ ﺑﺎزﮔﺸﺘﯽ در ﺁورﻳﺪ ﺑﻪ‬
‫ﻃﻮرﯼ ﮐﻪ ﭘﻴﭽﻴﺪﮔﯽ زﻣﺎﻧﯽ ﺁن ﺗﻐﻴﻴﺮ ﻧﮑﻨﺪ‪.‬‬
‫‪ .۶‬ﻋﻨﺼﺮ اﮐﺜﺮﻳﺖ‪:‬‬
‫در ﺁراﻳﻪ اﯼ ‪ n‬ﺗﺎﻳﯽ ﺗﻤﺎﻣﯽ اﻋﺪاد ﻣﺘﻤﺎﻳﺰ هﺴﺘﻨﺪ ﺑﻪ ﺟﺰ ﻋﺪد ‪ x‬ﮐﻪ‬
‫اﺳﺖ‪ .‬اﻟﮕﻮرﻳﺘﻤﯽ ﻃﺮاﺣﯽ ﮐﻨﻴﺪ ﮐﻪ در زﻣﺎن )‪ O(n‬ﻣﻘﺪار ‪ x‬را ﭘﻴﺪا ﮐﻨﺪ‪.‬‬
‫‪ .٧‬ﻣﺴﺎﻟﻪ ‪ 3-3‬از ﮐﺘﺎب ‪CLRS‬‬
‫ﺑﺎر‬
‫ﺗﮑﺮار‬
‫ﺷﺪﻩ‬
‫ﺗﻮﺿﻴﺤﺎت‪:‬‬
‫ƒ‬
‫ƒ‬
‫ƒ‬
‫ƒ‬
‫ƒ‬
‫ƒ‬
‫ﭘﺎﺳﺦ هﺎﯼ ﺧﻮد را ﺑﻪ ﺻﻮرت اﻟﮑﺘﺮوﻧﻴﮑﯽ و در ﻗﺎﻟﺐ ﻓﺎﻳﻞ ‪ PDF‬ﻳﺎ ‪ Word‬ﺑﻪ ﺁدرس‬
‫‪ [email protected]‬ﺑﻔﺮﺳﺘﻴﺪ‪.‬‬
‫ﻣﻮﺿﻮع ﻧﺎﻣﻪ )‪ (subject‬را ﺑﺮاﺑﺮ ???????‪ HW1-8‬ﻗﺮار دهﻴﺪ ﺑﻪ ﻃﻮرﯼ ﮐﻪ ﺷﻤﺎرﻩ‬
‫داﻧﺸﺠﻮﻳﯽ ﺷﻤﺎ ﺑﻪ ﺟﺎﯼ ﻋﻼﻣﺖ هﺎﯼ ﺳﻮال ﺟﺎﻳﮕﺰﻳﻦ ﺷﺪﻩ ﺑﺎﺷﺪ‪ .‬در ﺑﺪﻧﻪ ﻧﺎﻣﻪ و در داﺧﻞ‬
‫ﻓﺎﻳﻞ ارﺳﺎﻟﯽ ﻧﻴﺰ ﻧﺎم و ﻧﺎم ﺧﺎﻧﻮادﮔﯽ ﺧﻮد را ﺑﻪ هﻤﺮاﻩ ﺷﻤﺎرﻩ داﻧﺸﺠﻮﻳﯽ ذﮐﺮ ﮐﻨﻴﺪ‪.‬‬
‫ﺑﻪ ﭘﺎﺳﺦ هﺎﯼ ﻣﺸﺎﺑﻪ ﺟﺮﻳﻤﻪ ﺗﻌﻠﻖ ﺧﻮاهﺪ ﮔﺮﻓﺖ‪ ،‬ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ ﺷﺪت ﺗﻮﺻﻴﻪ ﻣﯽﺷﻮد ﮐﻪ‬
‫ﺧﻮدﺗﺎن ﺑﻪ ﺗﻨﻬﺎﻳﯽ ﺗﻤﺮﻳﻦ هﺎ را ﺣﻞ ﮐﻨﻴﺪ‪.‬‬
‫ﭘﺎﺳﺦ هﺎﯼ ﺷﻤﺎ ﺑﻪ دﻗﺖ ﺗﺼﺤﻴﺢ ﺧﻮاهﺪ ﺷﺪ‪ ،‬ﺑﻨﺎﺑﺮاﻳﻦ ﺳﻌﯽ ﮐﻨﻴﺪ ﺑﻪ ﺳﻮاﻻت ﭘﺎﺳﺦ هﺎﯼ‬
‫ﻣﺤﮑﻢ‪ ،‬ﻣﺴﺘﺪل و ﺗﺎ ﺣﺪ اﻣﮑﺎن ﮐﻮﺗﺎﻩ ﺑﺪهﻴﺪ‪.‬‬
‫ﻣﻬﻠﺖ ارﺳﺎل ﭘﺎﺳﺦ هﺎ ﺗﺎ ﻧﻴﻤﻪ ﺷﺐ روز ﺳﺮرﺳﻴﺪ اﺳﺖ‪ .‬ﺑﻪ ﭘﺎﺳﺦ هﺎﻳﯽ ﮐﻪ ﺗﺎ ‪ ۴٨‬ﺳﺎﻋﺖ‬
‫ﺑﻌﺪ از ﻣﻮﻋﺪ ﻓﺮﺳﺘﺎدﻩ ﻣﯽﺷﻮﻧﺪ‪ ،‬ﺑﻪ ﻧﺴﺒﺖ ﺟﺮﻳﻤﻪ اﯼ ﺗﻌﻠﻖ ﻣﯽﮔﻴﺮد اﻣﺎ ﺗﺎﺧﻴﺮ ﺑﻴﺶ از ‪۴٨‬‬
‫ﺳﺎﻋﺖ ﺑﻪ هﻴﭻ وﺟﻪ ﻗﺎﺑﻞ ﻗﺒﻮل ﻧﻴﺴﺖ‪ .‬در ﺿﻤﻦ ﻣﺸﮑﻼت اﺣﺘﻤﺎﻟﯽ ﺳﺮور ‪ CE‬را ﻣﺪ‬
‫ﻧﻈﺮ ﻗﺮار دهﻴﺪ و ﺗﺮﺟﻴﺤﺎً ﺑﺮاﯼ ارﺳﺎل از ﺳﺮور دﻳﮕﺮﯼ اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ‪.‬‬
‫ﺻﻮرت ﺗﻤﺮﻳﻦ هﺎ ﮔﻮﻳﺎ هﺴﺘﻨﺪ‪ ،‬وﻟﯽ در ﺻﻮرﺗﯽ ﮐﻪ ﺳﻮاﻟﯽ دارﻳﺪ ﻣﯽ ﺗﻮاﻧﻴﺪ در ﺑﺨﺶ‬
‫‪ Discussion Area‬ﺳﺎﻳﺖ درس ﺳﻮال ﺧﻮد را ﻣﻄﺮح ﮐﻨﻴﺪ‪.‬‬