ﺑﺎﺳﻤﻪ ﺗﻌﺎﻟ دادهﺳﺎﺧﺘﺎرﻫﺎ و ﻣﺒﺎﻧ اﻟ ﻮرﯾﺘﻢﻫﺎ )(۴٠-٢۵۴ Data Structures and Fundamentals of Algorithms داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ ﻣﺪرس :ﻣﺤﻤﺪ ﻗﺪﺳ ﺗﻤﺮﯾﻦ ﺷﻤﺎرهی ٢ .١ﺑﺎ ﮐﻤ ﯾ ﻣﻮﻋﺪ ارﺳﺎل١٣٩٢/٨/٣ : آراﯾﻪ ﺑﻪ اﻧﺪازهی Nدو ﭘﺸﺘﻪ ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ ﮐﻪ ﺑﻪ ﻃﻮر ﻫﻤﺰﻣﺎن ،ﻫﺮ دو از ﻋﻤﻠﯿﺎت pushو pop ﭘﺸﺘﯿﺒﺎﻧ ﮐﻨﻨﺪ .اﻟ ﻮرﯾﺘﻤ ﮐﻪ اراﺋﻪ ﻣ دﻫﯿﺪ ﻓﻘﻂ وﻗﺘ ﮐﻪ ﻣﺠﻤﻮع اﻧﺪازه ﻋﻨﺎﺻﺮ دو ﭘﺸﺘﻪ ﺑﯿﺸﺘﺮ از Nﺑﺎﺷﺪ ،ﺑﺎﯾﺪ ﺧﻄﺎی Stack Over Flowرا اﻋﻼم ﮐﻨﺪ .ﺷﺒﻪ ﮐﺪ اﻟ ﻮرﯾﺘﻢ ﺧﻮد را ﺑﻨﻮﯾﺴﯿﺪ. .٢ﻫﻤﺎﻧﻄﻮر ﮐﻪ ﻣ داﻧﯿﺪ اﻟ ﻮرﯾﺘﻢ Insertion Sortﺑﻪ ﺻﻮرت زﯾﺮ اﺳﺖ: Algorithm 1 Insertion Sort for j ← 2 to length[A] do 1: ]Find position of A[j] in sorted subArray A[1] to A[j − 1 2: Insert A[j] into Founded position 3: end for 4: در ﮐﻼس ﺑﻪ ﺷﻤﺎ ﮔﻔﺘﻪ ﺷﺪه اﯾﻦ اﻟ ﻮرﯾﺘﻢ از ) O(n٢اﺳﺖ .اﮔﺮ ﺑﺘﻮاﻧﯿﻢ ﺧﻂﻫﺎی ٢و ٣را ﻃﻮری ﺗﻐﯿﯿﺮ دﻫﯿﻢ ﮐﻪ در زﻣﺎن ﺑﻬﺘﺮی اﻧﺠﺎم ﺷﻮﻧﺪ ،زﻣﺎن ﮐﻞ اﻟ ﻮرﯾﺘﻢ ﺑﻬﺘﺮ ﺧﻮاﻫﺪ ﺷﺪ. اﻟﻒ( ﺑﺎ ﮐﻤ ﺟﺴﺘﺠﻮی دودوﯾ ،زﻣﺎن اﺟﺮای ﺧﻂ ٢را ﺑﻬﺘﺮ ﮐﻨﯿﺪ .آﯾﺎ اﮔﺮ اﻋﺪاد را در آراﯾﻪای ﻧ ﻪ داﺷﺘﻪ ﺑﺎﺷﯿﻢ، زﻣﺎن ﮐﻠ اﻟ ﻮرﯾﺘﻢ ﺑﻬﺘﺮ ﺧﻮاﻫﺪ ﺷﺪ؟ ب( ﻓﺮض ﮐﻨﯿﺪ اﻋﺪاد در دادهﺳﺎﺧﺘﺎر ﻟﯿﺴﺖ ﭘﯿﻮﻧﺪی ﻧ ﻪ داﺷﺘﻪ ﺷﺪهاﻧﺪ .زﻣﺎن ﮐﻞ اﻟ ﻮرﯾﺘﻢ را ﺗﺤﻠﯿﻞ ﮐﻨﯿﺪ. .٣ﯾ ﻟﯿﺴﺖ ﭘﯿﻮﻧﺪی از اﻋﺪاد دارﯾﻢ ﮐﻪ در آن ﻫﺮ ﻋﻀﻮ ﺗﻨﻬﺎ ﺑﻪ ﻋﻀﻮ ﺑﻌﺪی دﺳﺘﺮﺳ دارد .روﺷ ﮐﺎرا اراﺋﻪ دﻫﯿﺪ ﮐﻪ ﺑﺪون ﺗﻐﯿﯿﺮ در ﺳﺎﺧﺘﺎر ﻟﯿﺴﺖ و ﺗﻨﻬﺎ ﺑﺎ اﺳﺘﻔﺎده از ) O(١ﺣﺎﻓﻈﻪ اﺿﺎﻓ ﻣﺸﺨﺺ ﮐﻨﺪ آﯾﺎ در اﯾﻦ ﻟﯿﺴﺖ دور وﺟﻮد دارد ﯾﺎ ﺧﯿﺮ )ﺗﻮﺟﻪ ﮐﻨﯿﺪ ﮐﻪ ﻻزم اﺳﺖ ﺳﺎﺧﺘﺎر ﻟﯿﺴﺖ در ﻃﻮل اﺟﺮای اﻟ ﻮرﯾﺘﻢ ﺛﺎﺑﺖ ﺑﻤﺎﻧﺪ و ﯾ ﺴﺎن ﻣﺎﻧﺪن آن ﺗﻨﻬﺎ در اﺑﺘﺪا و اﻧﺘﻬﺎ ﮐﺎﻓ ﻧﯿﺴﺖ(. .۴ﯾ ﻟﯿﺴﺖ ﭘﯿﻮﻧﺪی ﯾ ﻄﺮﻓﻪ ﺑﺎ Nﮔﺮه دارﯾﻢ .ﯾ ﻄﺮﻓﻪ ﺑﻮدن ﯾﻌﻨ ﺑﺮای ﻫﺮ ﮔﺮه آن ،ﻓﻘﻂ اﺷﺎرهﮔﺮ ﺑﻪ ﮔﺮه ﺑﻌﺪی آن را √ دارﯾﻢ .اﻟ ﻮرﯾﺘﻤ اراﺋﻪ دﻫﯿﺪ ﮐﻪ ﺑﺎ ﭘﯿﺶﭘﺮدازﺷ در زﻣﺎن ) O(Nﺗﻐﯿﯿﺮی در ﻟﯿﺴﺖ اﯾﺠﺎد ﮐﻨﺪ ،ﮐﻪ ﺑﺘﻮان در ) O( N √ ﺑﻪ ﻋﻨﺼﺮ ﻗﺒﻠ ﻫﺮ ﻋﻨﺼﺮ دﺳﺘﺮﺳ داﺷﺖ .ﺷﻤﺎ ﻓﻘﻂ ﻣﺠﺎز ﺑﻪ اﺳﺘﻔﺎده از ) O( Nﺣﺎﻓﻈﻪی ﺟﺪﯾﺪ ﻫﺴﺘﯿﺪ. .۵ﯾ ﺷﻤﺎرﻧﺪۀ kﺑﯿﺘ را در ﻧﻈﺮ ﺑ ﯿﺮﯾﺪ )ﺑﯿﺖ ﺑﺎ اﻧﺪﯾﺲ ٠ﮐﻢ ارزشﺗﺮﯾﻦ ﺑﯿﺖ اﺳﺖ( ﮐﻪ ﻣﻘﺪار اوﻟﯿﮥ آن ٠اﺳﺖ .ﺗﻨﻬﺎ ﻋﻤﻠ ﮐﻪ ﺑﺮ روی اﯾﻦ داده ﺳﺎﺧﺘﺎر اﻧﺠﺎم ﻣ ﺷﻮد ،اﻓﺰاﯾﺶ ١واﺣﺪ ﺑﻪ آن اﺳﺖ .ﺷﺒﻪ ﮐﺪ روﯾﻪ ) incrementﻋﻤﻞ اﻓﺰاﯾﺶ( را ﺑﻨﻮﯾﺴﯿﺪ. اﻟﻒ( ﺛﺎﺑﺖ ﮐﻨﯿﺪ ﻫﺰﯾﻨﮥ ﻫﺮ ﻋﻤﻞ اﻓﺰاﯾﺶ ﺑﻪ ﻃﻮر ﺳﺮﺷ ﻨ ) O(١اﺳﺖ. ١ ب( ﻧﺸﺎن دﻫﯿﺪ اﮔﺮ ﻋﻤﻞ decrementرا ﺑﻪ ﺷﻤﺎرﻧﺪه اﺿﺎﻓﻪ ﮐﻨﯿﻢ دﯾ ﺮ ﻫﺰﯾﻨﮥ ﺳﺮﺷ ﻨ ﻟﺰوﻣﺎً ) O(١ﻧﯿﺴﺖ .وﻟ اﮔﺮ از ﺳﯿﺴﺘﻢ ﻧﻤﺎﯾﺶ دﯾ ﺮی ﮐﻪ در آن ﻫﺮ رﻗﻢ ١ ،٠ﯾﺎ ٢اﺳﺖ اﺳﺘﻔﺎده ﮐﻨﯿﻢ ،ﻣ ﺗﻮان اﯾﻦ دو ﻋﻤﻞ را ﻃﻮری ﭘﯿﺎده ﺳﺎزی ﮐﺮد ﮐﻪ ﻫﺰﯾﻨﮥ ﺳﺮﺷ ﻨ ﻫﺮ ﯾ ﺛﺎﺑﺖ ﺑﺎﺷﺪ. .۶داده ﺳﺎﺧﺘﺎر آراﯾﻪ ﭘﻮﯾﺎ ١را در ﯾ از زﺑﺎنﻫﺎی C++ﯾﺎ Javaﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ .٢ﻣﺸﺨﺺ اﺳﺖ ﮐﻪ اﺳﺘﻔﺎده از دادهﺳﺎﺧﺘﺎرﻫﺎی اﯾﻦ زﺑﺎنﻫﺎ ﻣﺠﺎز ﻧﯿﺴﺖ و ﺷﻤﺎ ﻓﻘﻂ ﺑﺎ ﮐﻤ آراﯾﻪﻫﺎ و ﻣﺘﻐﯿﺮﻫﺎی ﺳﺎده ﺑﺎﯾﺪ اﯾﻦ ﺑﺮﻧﺎﻣﻪ را ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ. اﻟﻒ( داده ﺳﺎﺧﺘﺎر آراﯾﻪ ﭘﻮﯾﺎ را ﻃﻮری ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ ﮐﻪ از دﺳﺘﻮرات زﯾﺮ ﺑﺼﻮرت ﺳﺮﺷ ﻦ در ) O(١ﭘﺸﺘﯿﺒﺎﻧ ﮐﻨﺪ. ورودی و ﺧﺮوﺟ :در ﺧﻂ اول ورودی ﻋﺪد tﺗﻌﺪاد دﺳﺘﻮرﻫﺎﯾ ﮐﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ داده ﺧﻮاﻫﺪ ﺷﺪ ،ﻣ آﯾﺪ .در t ﺧﻂ ﺑﻌﺪی ،در ﻫﺮ ﺧﻂ ،ﯾ از دﺳﺘﻮرات زﯾﺮ ﺧﻮاﻫﺪ آﻣﺪ. • :Push back aﻋﺪد aرا ﺑﻪ اﻧﺘﻬﺎی آراﯾﻪ اﺿﺎﻓﻪ ﻣ ﮐﻨﺪ و ﻣﻘﺪار Capacityو Sizeآراﯾﻪ را ﺑﺮوز ﻣ ﮐﻨﺪ. • :Sizeاﻧﺪازهی آراﯾﻪ را در ﺧﺮوﺟ ﭼﺎپ ﮐﻨﯿﺪ. • :Capacityﻇﺮﻓﯿﺖ آراﯾﻪ را در ﺧﺮوﺟ ﭼﺎپ ﮐﻨﯿﺪ. • :Pop backﻋﻨﺼﺮ اﻧﺘﻬﺎﯾ آراﯾﻪ را ﭘﺎک ﻣ ﮐﻨﺪ و ﻣﻘﺪار Capacityو Sizeآراﯾﻪ را ﺑﺮوز ﻣ ﮐﻨﺪ. • :Get iﻋﻨﺼﺮ iام آراﯾﻪ را در ﺧﺮوﺟ ﭼﺎپ ﻣ ﮐﻨﺪ ).(٠ ≤ i < size Size دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ Capacityدر اﺑﺘﺪا ١اﺳﺖ و اﮔﺮ ﻫﻨ ﺎم pushﻧﺴﺒﺖ = ١ Capacity Size ﺑﺎﺷﺪ Capacity ،ﻧﺼﻒ ﺧﻮاﻫﺪ ﺷﺪ )دﻗﺖ ﮐﻨﯿﺪ ﺧﻮاﻫﺪ ﺷﺪ .ﻫﻤﭽﻨﯿﻦ ﻫﺮﮔﺎه ﺑﻌﺪ از ﭘﺎک ﮐﺮدن < ١/۴ Capacity ﮐﻪ Capacityاﻧﺪازه آراﯾﻪای اﺳﺖ ﮐﻪ ﻋﻨﺎﺻﺮ در آن ﻧ ﻬﺪاری ﻣ ﺷﻮﻧﺪ(. ﺑﺎﺷﺪ Capacity ،دو ﺑﺮاﺑﺮ ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ: ١ ٢ﺑﺮای آﺷﻨﺎﯾ ﺑﯿﺸﺘﺮ ﺑﺎ اﯾﻦ داده ﺳﺎﺧﺘﺎر ﻣ ﺗﻮاﻧﯿﺪ ﺑﻪ اﯾﻦ ﻟﯿﻨ Dynamic Array ﻣﺮاﺟﻌﻪ ﮐﻨﯿﺪhttp://en.wikipedia.org/wiki/Dynamic_array : ٢ stdin stdout 1 10 0 Capacity 1 Size 2 Push back 1 4 Size 3 Push back 2 Push back 3 Get 1 Capacity Size 5 10 8 Push back 1 4 Push back 2 8 Push back 3 Push back 4 Push back 5 Get 4 Capacity Pop back Get 3 Capacity ﻣﺤﺪودﯾﺖﻫﺎ: • ١ ≤ t ≤ ١٠۶ • ﺗﻤﺎم اﻋﺪاد ورودی در ﺑﺎزه ] [−١٠٩ , ١٠٩ﻫﺴﺘﻨﺪ. ب( در اﯾﻦ ﻗﺴﻤﺖ ،داده ﺳﺎﺧﺘﺎر ﻗﺴﻤﺖ )اﻟﻒ( را ﺑﻪﮔﻮﻧﻪای ﺗﻐﯿﯿﺮ دﻫﯿﺪ ﮐﻪ از دﺳﺘﻮرات زﯾﺮ ﻧﯿﺰ ﺑﺼﻮرت ﺳﺮﺷ ﻦ در ) O(١ﭘﺸﺘﯿﺒﺎﻧ ﮐﻨﺪ. • :Push front aﻋﺪد aرا ﺑﻪ اﺑﺘﺪای آراﯾﻪ اﺿﺎﻓﻪ ﻣ ﮐﻨﺪ و ﻣﻘﺪار Capacityو sizeآراﯾﻪ را ﺑﺮوز ﻣ ﮐﻨﺪ. • :Pop frontﻋﺪد اﺑﺘﺪاﯾ آراﯾﻪ را ﭘﺎک ﻣ ﮐﻨﺪ و ﻣﻘﺪار Capacityو sizeآراﯾﻪ را ﺑﺮوز ﻣﯿ ﻨﺪ. ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ: ٣ stdin stdout 1 9 3 Push back 1 1 Push front 2 4 Push back 3 Pop front Get 0 Get 1 Push front -1 Get 1 Capacity 3 11 4 Push back 1 4 Push back 2 4 Pop front Push front 3 Pop back Push back 4 Get 0 Get 1 Pop front Get 0 Get 1 ﻣﺤﺪودﯾﺖﻫﺎ: • ١ ≤ t ≤ ١٠۶ • ﺗﻤﺎم اﻋﺪاد ورودی در ﺑﺎزه ] [−١٠٩ , ١٠٩ﻫﺴﺘﻨﺪ. .٧اﻟﻒ( ﺷﻬﺮ اﺗﻮﭘﯿﺎ N ،ﮐﻮه ﺑﺎ ارﺗﻔﺎعﻫﺎی h١ , h٢ , . . . , hNدارد .ﻣ ﺧﻮاﻫﯿﻢ در اﯾﻦ ﺷﻬﺮ ﯾ ﺧﻂ ﺗﻠﻪﮐﺎﺑﯿﻦ راهاﻧﺪازی ﮐﻨﯿﻢ ﺑﻪ ﻃﻮری ﮐﻪ از روی kﮐﻮه ﻣﺘﻮاﻟ ﻋﺒﻮر ﮐﻨﺪ .ﺑﺮای اﯾﻦ ﮐﺎر ،ﺑﺎﯾﺪ ﺑﺎ ﺧﺎکﺑﺮداری ارﺗﻔﺎع ﻫﻤﻪی اﯾﻦ ﮐﻮهﻫﺎ را ﺑﺮاﺑﺮ ﮐﻨﯿﻢ .اﮔﺮ ارﺗﻔﺎع ﺛﺎﻧﻮﯾﻪی ﮐﻮهﻫﺎ را d١ , d٢ , . . . , dnﺑﻨﺎﻣﯿﻢ؛ ﻫﺰﯾﻨﻪی ﺳﺎﺧﺖ ﺗﻠﻪﮐﺎﺑﯿﻦ از ﮐﻮه tام ﺗﺎ ﮐﻮه t + k − ١ام، ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ: h i − di t+k−١ ∑ i=t اﻟ ﻮرﯾﺘﻤ اراﺋﻪ دﻫﯿﺪ ﮐﻪ در ) O(nﮐﻤﺘﺮﯾﻦ ﻫﺰﯾﻨﻪی ﺳﺎﺧﺖ ﺗﻠﻪﮐﺎﺑﯿﻦ را ﻣﺸﺨﺺ ﮐﻨﺪ. ب( اﻟ ﻮرﯾﺘﻢ ﺧﻮد را ﺑﺮای ﻗﺴﻤﺖ )اﻟﻒ( ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ. ورودی ۴ در ﺧﻂ اول ورودی دو ﻋﺪد Nو kآﻣﺪهاﻧﺪ .در ﺳﻄﺮ ﺑﻌﺪی Nﻋﺪد ﻃﺒﯿﻌ آﻣﺪه اﺳﺖ ﮐﻪ ﻋﺪد iام ﻣﻌﺮف ارﺗﻔﺎع ﮐﻮه iام ﻣ ﺑﺎﺷﺪ. ﺧﺮوﺟ در ﺗﻨﻬﺎ ﺧﻂ ﺧﺮوﺟ ﮐﻤﺘﺮﯾﻦ ﻣﯿﺰان ﻫﺰﯾﻨﻪ ﺑﺮای ﺳﺎﺧﺖ ﺗﻠﻪﮐﺎﺑﯿﻦ را ﺑﻨﻮﯾﺴﯿﺪ. ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ: stdin stdout 26 4 7 14 8 17 2 7 23 1 15 3 7 14 8 17 2 7 23 1 ﻣﺤﺪودﯾﺖﻫﺎ: • ١ ≤ k ≤ n ≤ ١٠۶ • ﺗﻤﺎم اﻋﺪاد ورودی در ﺑﺎزه ] [−١٠٩ , ١٠٩ﻫﺴﺘﻨﺪ. ۵
© Copyright 2025 Paperzz