ﺑﺎﺳﻤﻪ ﺗﻌﺎﻟ
دادهﺳﺎﺧﺘﺎرﻫﺎ و ﻣﺒﺎﻧ اﻟ ﻮرﯾﺘﻢﻫﺎ )(۴٠-٢۵۴
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
٣
© Copyright 2026 Paperzz