DS921_HW5.pdf

‫ﺑﺎﺳﻤﻪ ﺗﻌﺎﻟ‬
‫دادهﺳﺎﺧﺘﺎرﻫﺎ و ﻣﺒﺎﻧ اﻟ ﻮرﯾﺘﻢﻫﺎ )‪(۴٠-٢۵۴‬‬
‫‪Data Structures and Fundamentals of Algorithms‬‬
‫داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﻣﺪرس‪ :‬ﻣﺤﻤﺪ ﻗﺪﺳ‬
‫ﻣﻮﻋﺪ ارﺳﺎل‪١٣٩٢/٩/٣٠ :‬‬
‫ﺗﻤﺮﯾﻦ ﺷﻤﺎرهی ‪۵‬‬
‫‪ .١‬ﺑﻪ ﺷﻤﺎ ‪ n‬ﻋﺪد ‪ x١ , x٢ ..., xn‬داده ﻣ ﺷﻮد‪ .‬ﻫﺪف ﯾﺎﻓﺘﻦ ﻋﻨﺼﺮی اﺳﺖ ﮐﻪ ﺑﯿﺶ از‬
‫‪n‬‬
‫‪٢‬‬
‫ﺑﺎر در ﻟﯿﺴﺖ اﻋﺪاد ﻇﺎﻫﺮ ﺷﺪه‬
‫اﺳﺖ‪ .‬اﻟ ﻮرﯾﺘﻤ از )‪ O(n‬اراﺋﻪ دﻫﯿﺪ ﮐﻪ اﯾﻦ ﻋﻨﺼﺮ را )در ﺻﻮرت وﺟﻮد( ﻣﺸﺨﺺ ﮐﻨﺪ‪ .‬دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ ﻟﯿﺴﺖ اﻋﺪاد‬
‫ﻟﺰوﻣﺎ ﻣﺮﺗﺐ ﻧﯿﺴﺖ‪.‬‬
‫ﻣﻮﻗﻌﯿﺖ ﺷﻐﻠ ‪ n‬ﻧﻔﺮ ﺑﺎ ﺗﻮاﻧﺎﯾ ﻫﺎی ‪ a١ , a٢ , ..., an‬درﺧﻮاﺳﺖ ﮐﺎر دادهاﻧﺪ‪ .‬ﻣ ﺧﻮاﻫﯿﻢ ﺗﻮاﻧﺎﺗﺮﯾﻦ ﺷﺨﺺ‬
‫‪ .٢‬ﺑﺮای ﯾ‬
‫را اﺳﺘﺨﺪام ﮐﻨﯿﻢ )ﺷﺨﺼ ﮐﻪ دارای ) ‪ max(aj‬اﺳﺖ( ‪ .‬ﺑﺮای اﯾﻦ ﮐﺎر از اﻟ ﻮرﯾﺘﻢ زﯾﺮ اﺳﺘﻔﺎده ﻣ ﮐﻨﯿﻢ‪:‬‬
‫»اﺑﺘﺪا ﻧﻔﺮ اول )ﺑﺎ ﺗﻮاﻧﺎﯾ ‪ (a١‬را اﺳﺘﺨﺪام ﮐﻦ ‪ .‬ﺳﭙﺲ ﺑﺮای ‪ ،٢ ≤ i ≤ n‬اﮔﺮ ﺗﻮاﻧﺎﯾ ﻧﻔﺮ ‪i‬ام ﺑﯿﺸﺘﺮ از ﺷﺨﺺ‬
‫اﺳﺘﺨﺪام ﺷﺪه ﺑﻮد‪ ،‬او را اﺧﺮاج و ﻧﻔﺮ ‪ i‬ام را اﺳﺘﺨﺪام ﮐﻦ‪«.‬‬
‫ﻧﺸﺎن دﻫﯿﺪ ﺗﻌﺪاد اﺧﺮاج ﺷﺪن ﻫﺎی اﻓﺮاد در اﻟ ﻮرﯾﺘﻢ ﻓﻮق ﺑﻪ ﺻﻮرت آﻣﺎری از )‪ O(lg n‬اﺳﺖ‪.‬‬
‫‪ .٣‬اﻟ ﻮرﯾﺘﻤ اراﺋﻪ دﻫﯿﺪ ﮐﻪ ﺑﺎ ﺣﺪاﮐﺜﺮ ‪ n + lg n‬ﻣﻘﺎﯾﺴﻪ‪ ،‬دو ﻋﻨﺼﺮ ﺑﯿﺸﯿﻨﻪ ﯾ‬
‫آراﯾﻪ ‪ n‬ﻋﻀﻮی ﺑﺎ اﻋﻀﺎی ﻣﺘﻤﺎﯾﺰ را ﺑﯿﺎﺑﺪ‪.‬‬
‫ﺗﻌﺪاد ﻣﻘﺎﯾﺴﻪﻫﺎی اﻟ ﻮرﯾﺘﻢ ﺧﻮد را ﺑﻪ ﺻﻮرت دﻗﯿﻖ ﺣﺴﺎب و درﺳﺘ آن را اﺛﺒﺎت ﮐﻨﯿﺪ‪.‬‬
‫‪ .۴‬ﺑﻪ ﯾ‬
‫اﻟ ﻮرﯾﺘﻢ ﻣﺮﺗﺐﺳﺎزی »ﻣﺮﺗﺐﺳﺎزی ﭘﺎﯾﺪار ‪ «١‬ﻣ ﮔﻮﯾﯿﻢ ﻫﺮﮔﺎه ﻣﻮﻗﻌﯿﺖ ﻋﻨﺎﺻﺮ ﯾ ﺴﺎن ﻧﺴﺒﺖ ﺑﻪ ﻫﻢ در آن ﺣﻔﻆ‬
‫ﺷﻮد‪ .‬ﺑﻪ ﻃﻮر ﻣﺜﺎل آراﯾﻪ } ‪ {٣٢١ ١٢٢‬ﺑﻌﺪ از ﻣﺮﺗﺐﺳﺎزی ﭘﺎﯾﺪار ﺑﻪ ﺷ ﻞ}‪ {١٢١ ٢٢ ٣‬در ﻣ آﯾﺪ‪.‬‬
‫)آ( ﻧﺸﺎن دﻫﯿﺪ ‪ Quick Sort‬ﯾ‬
‫اﻟ ﻮرﯾﺘﻢ ﻣﺮﺗﺐﺳﺎزی ﭘﺎﯾﺪار ﻧﯿﺴﺖ‪.‬‬
‫)ب( روﺷ ﺑﺮای ‪ partition‬در ‪ Quick Sort‬اراﺋﻪ دﻫﯿﺪ ﮐﻪ در زﻣﺎن )‪ O(n‬اﺟﺮا ﺷﻮد و ‪ Quick Sort‬را ﺑﻪ ﯾ‬
‫ﻣﺮﺗﺐ ﺳﺎزی ﭘﺎﯾﺪار ﺗﺒﺪﯾﻞ ﮐﻨﺪ‪.‬‬
‫‪ .۵‬ﺻﺤﯿ ﯾﺎ ﻏﻠﻂ ﺑﻮدن ﻣﻮارد زﯾﺮ را )ﺑﺎ ذﮐﺮ دﻟﯿﻞ و اﺛﺒﺎت ﮐﺎﻣﻞ( ﻣﺸﺨﺺ ﮐﻨﯿﺪ‪.‬‬
‫)آ( ﯾ‬
‫ﻫﺮم ﺑﺎ ‪ n‬ﻋﻨﺼﺮ را ﻣ ﺗﻮان در زﻣﺎن )‪ O(n‬ﺑﻪ ﯾ‬
‫)ب( ﻫﺮ اﻟ ﻮرﯾﺘﻢ ﻣﻘﺎﯾﺴﻪای ﮐﻪ ﻧﺰدﯾ‬
‫از )‪ Ω(lg n‬اﺳﺖ‪ A[i] .‬ﻧﺰدﯾ‬
‫د‪.‬د‪.‬ج ﺗﺒﺪﯾﻞ ﮐﺮد‪.‬‬
‫ﺗﺮﯾﻦ ﻋﻨﺼﺮ ﻣﻮﺟﻮد در ﯾ‬
‫آراﯾﻪ ‪ n‬ﻋﻨﺼﺮی ﺑﻪ ﻋﺪد ورودی ‪ x‬را ﭘﯿﺪا ﮐﻨﺪ اﻟﺰاﻣﺎ‬
‫ﺗﺮﯾﻦ ﻋﻨﺼﺮ اﺳﺖ اﮔﺮ |]‪ |x − A[i‬ﮐﻤﺘﺮﯾﻦ ﻣﻘﺪار را داﺷﺘﻪ ﺑﺎﺷﺪ‪.‬‬
‫)ج( در اﻟ ﻮرﯾﺘﻢ ‪ Insertion − Sort‬ﺑﺮای ﻣﺮﺗﺐﺳﺎزی آراﯾﻪای ﺑﺎ ‪ n‬ﻋﻨﺼﺮ‪:‬‬
‫اﮔﺮ اﻋﺪاد آراﯾﻪ را اﺑﺘﺪا ﺑﻪ ﺻﻮرت ﺗﺼﺎدﻓ ﺑﺮ ﺑﺰﻧﯿﻢ آﻧ ﺎه زﻣﺎن اﺟﺮای اﯾﻦ اﻟ ﻮرﯾﺘﻢ ﺑﻪ ﺻﻮرت آﻣﺎری از )‪O(n lg n‬‬
‫ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪Stable Sort‬‬
‫‪١‬‬
‫‪١‬‬
‫‪ .۶‬در ورودی ﻋﺪد ‪ n‬و ﺳﭙﺲ ‪ n‬ﻋﺪد ‪ a١ , a٢ , ...an‬ﺑﻪ ﺷﻤﺎ داده ﻣ ﺷﻮد‪ .‬از ﺷﻤﺎ ﺧﻮاﺳﺘﻪ ﺷﺪه ﺗﺎ ﺗﻌﺪاد دوﺗﺎﯾ ﻫﺎی )‪(i, j‬‬
‫ﺑﻪ ﻗﺴﻤ ﮐﻪ ‪ ١ ⩽ i < j ⩽ n‬و ‪ ai > aj‬ﻫﺴﺖ را ﺑﯿﺎﺑﯿﺪ)ﺑﻪ اﮐﯿﺪ ﺑﻮدن ﻧﺎﻣﺴﺎوی دﻗﺖ ﮐﻨﯿﺪ(‪.‬‬
‫ﻣﺤﺪودﯾﺖﻫﺎ‪:‬‬
‫‪٢ ≤ n ≤ ٧٠٠٠٠‬‬
‫‪ ai‬ﻫﺎ اﻋﺪاد ﺻﺤﯿ ﻫﺴﺘﻨﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﯾﺪ ﺑﺘﻮاﻧﺪ ﺑﻪ ورودی ﺑﺎ ﻣﺤﺪودﯾﺖ ﻫﺎی ﻓﻮق در ﮐﻤﺘﺮ از ‪ ١‬ﺛﺎﻧﯿﻪ ﭘﺎﺳ دﻫﺪ‪.‬‬
‫ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ‪:‬‬
‫‪stdin‬‬
‫‪stdout‬‬
‫‪3‬‬
‫‪5‬‬
‫‪2 3 1 5 4‬‬
‫‪٢‬‬
‫‪ n .٧‬ﭘﺎرهﺧﻂ ﻋﻤﻮدی و ‪ m‬ﭘﺎرهﺧﻂ اﻓﻘ داده ﺷﺪه اﺳﺖ‪ .‬ﻫﺪف ﯾﺎﻓﺘﻦ ﺗﻌﺪاد ﻧﻘﺎط ﺗﻘﺎﻃ اﯾﻦ ﭘﺎرهﺧﻂﻫﺎ ﺑﺎ ﯾ ﺪﯾ ﺮ اﺳﺖ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪای ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ اﯾﻦ ﭘﺎرهﺧﻂ ﻫﺎ را از ورودی ﮔﺮﻓﺘﻪ و ﺗﻌﺪاد ﻧﻘﺎط ﺗﻘﺎﻃ را درﺧﺮوﺟ ﭼﺎپ ﮐﻨﺪ‪.‬‬
‫ورودی ‪:‬‬
‫در ﺧﻂ اول ﻋﺪد ‪ n‬و ﺳﭙﺲ در ‪ n‬ﺧﻂ ﺑﻌﺪی در ﻫﺮ ﺧﻂ ﺳﻪ ﻋﺪد ‪ −١٠٩ ≤ ai , bi , ci ≤ ١٠٩‬ﻣ آﯾﺪ ﮐﻪ ﻧﺸﺎندﻫﻨﺪه‬
‫ﭘﺎرهﺧﻂ ﻋﻤﻮدی ﺑﺎ ﻣﺸﺨﺼﺎت ‪ x = ai‬و ‪ bi ≤ y ≤ ci‬اﺳﺖ‪.‬‬
‫ﺳﭙﺲ ﻋﺪد ‪ m‬و در ‪ m‬ﺧﻂ ﺑﻌﺪی ‪ ،‬ﻣﺎﻧﻨﺪ ﺑﺎﻻ ﺳﻪ ﻋﺪد ‪ −١٠٩ ≤ ai , bi , ci ≤ ١٠٩‬ﻣ آﯾﺪ ﮐﻪ ﻧﺸﺎندﻫﻨﺪه ﭘﺎرهﺧﻂ‬
‫اﻓﻘ ﺑﺎ ﻣﺸﺨﺼﺎت ‪ y = ai‬و ‪ bi ≤ x ≤ ci‬اﺳﺖ‪.‬‬
‫ﺧﺮوﺟ ‪:‬‬
‫در ﺗﻨﻬﺎ ﺳﻄﺮ ﺧﺮوﺟ ﺗﻌﺪاد ﺗﻘﺎﻃ ﻫﺎی اﯾﻦ ‪ m + n‬ﭘﺎرهﺧﻂ را ﭼﺎپ ﮐﻨﯿﺪ‪.‬‬
‫ﻣﺤﺪودﯾﺘﻬﺎ ‪:‬‬
‫‪m + n ≤ ١٠۵‬‬
‫ﻫﯿ دو ﭘﺎرهﺧﻂ ﻋﻤﻮدی ﯾﺎ دو ﭘﺎرهﺧﻂ اﻓﻘ ﺑﺎ ﯾ ﺪﯾ ﺮ اﺷﺘﺮاک ﻧﺪارﻧﺪ‪.‬‬
‫راﻫﻨﻤﺎﯾ ‪ :‬ﻣ ﺗﻮاﻧﯿﺪ از ﺑﺮﻧﺎﻣﻪای ﮐﻪ در ﺗﻤﺮﯾﻦ ﺳﻮم ﻧﻮﺷﺘﯿﺪ ﺑﺮای اﯾﻦ ﺗﻤﺮﯾﻦ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪.‬‬
‫ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ‪:‬‬
‫‪stdin‬‬
‫‪stdout‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2 -2 2‬‬
‫‪3 1 4‬‬
‫‪2‬‬
‫‪2 1 4‬‬
‫‪3 1 4‬‬
‫‪٣‬‬