Intoruction .pdf

‫ﺑﺎﺳﻤﻪ ﺗﻌﺎﻟ‬
‫ﻣﺒﺎﻧ ﺳﺎﺧﺘﻤﺎن دادهﻫﺎ و اﻟ ﻮرﯾﺘﻢﻫﺎ )‪(۴٠-٢۵۴‬‬
‫‪Introduction to Data Structures and Algorithms‬‬
‫داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﻣﺪرس‪ :‬ﻣﺤﻤﺪ ﻋﻠ آﺑﺎم‬
‫رﻓ ﻣﺸ ﻼت ﺷﻤﺎ‬
‫راﻫﻨﻤﺎی ﭘﺮوژه ﻋﻤﻠ‬
‫در اﯾﻦ راﻫﻨﻤﺎ ﺑﻪ ﺳﻮالﻫﺎی زﯾﺮ ﭘﺎﺳ ﻣ دﻫﯿﻢ‪.‬‬
‫• ﭼ ﻮﻧﻪ ﺗﻤﺮﯾﻦ ﺧﻮد را ارﺳﺎل ﮐﻨﻢ؟‬
‫• ﺳﻮالﻫﺎ ﭼﻪ ارﺗﺒﺎﻃ ﺑﻪ ﺳﺎﺧﺘﻤﺎندادهﻫﺎ و اﻟ ﻮرﯾﺘﻢﻫﺎ دارد؟‬
‫• ﺳﯿﺴﺘﻢ ارزﯾﺎﺑﯽ ﺑﺮﻧﺎﻣﻪﻫﺎ ﭼﻄﻮر اﺳﺖ؟‬
‫• ﮐﺪ ﻣﻦ ﺑﻪ درﺳﺘ ﮐﺎﻣﭙﺎﯾﻞ ﻣ ﺷﻮد اﻣﺎ ﺳﺮور ﺧﻄﺎی ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣ دﻫﺪ؛ ﻋﻠﺖ آن ﭼﯿﺴﺖ؟‬
‫• ﻣﺤﺪودﯾﺖ زﻣﺎن و ﺣﺎﻓﻈﻪ ﺑﻪ ﭼﻪ ﻣﻌﻨ اﺳﺖ؟‬
‫• ﭼﺮا ﺳﺮور ﺑﻪ ﻣﻦ ﻧﻤﺮهی ﺻﻔﺮ ﻣ دﻫﺪ در ﺣﺎﻟ ﮐﻪ ﮐﺪ ﻣﻦ ﮐﺎﻣﻼ درﺳﺖ اﺳﺖ؟‬
‫• ﮐﺪم را ﺑﺎرﻫﺎ و ﺑﺎرﻫﺎ ﺗﺴﺖ ﮐﺮدم اﻣﺎ ﺳﺮور ﻧﻤﺮهی ﺑﯿﺸﺘﺮ از ‪ ۴٠‬ﺑﻪ ﻣﻦ ﻧﻤ دﻫﺪ‪ .‬ﭼﺮا؟‬
‫‪١‬‬
‫ﭼ ﻮﻧﻪ ﺗﻤﺮﯾﻦ ﺧﻮد را ارﺳﺎل ﮐﻨﻢ؟‬
‫ﺑﺮای ارﺳﺎل ﺗﻤﺮﯾﻦﻫﺎ ﺑﺎﯾﺪ از ﺳﺎﻣﺎﻧﻪی ﺑﺮﺧﻂ ‪ http://learn.inoi.ir‬اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪ .‬ﻧﺎم ﮐﺎرﺑﺮی ﺷﻤﺎره داﻧﺸﺠﻮﯾﯽ ﺷﻤﺎ و رﻣﺰ‬
‫ﻋﺒﻮر ﺷﻤﺎ ‪ ١٢٣۴۵۶‬اﺳﺖ‪ .‬ﺑﺎ اﯾﻦ ﻧﺎم ﮐﺎرﺑﺮی وارد ﺳﺎﯾﺖ ﺷﻮﯾﺪ‪.‬‬
‫ﭘﺲ از ورود ﺑﻪ ﺳﺎﯾﺖ ﺑﻪ ﺑﺨﺶ اﻣﺘﺤﺎن ﺑﺮوﯾﺪ و »اﻣﺘﺤﺎﻧﺎت ﺧﺼﻮﺻ ﻣﻦ« را اﻧﺘﺨﺎب ﮐﻨﯿﺪ‪ .‬ﺳﭙﺲ ﺑﻪ ﺗﻤﺮﯾﻦ ﻋﻤﻠ ﻣﺮﺑﻮط وارد‬
‫ﺷﻮﯾﺪ‪ .‬از ﻗﺴﻤﺖ ﭘﺎﯾﯿﻦ ﺻﻔﺤﻪ ﻣ ﺗﻮاﻧﯿﺪ ﺗﻤﺮﯾﻦ ﺧﻮد را ارﺳﺎل ﮐﻨﯿﺪ‪ .‬ﭘﺲ از ارﺳﺎل ﺗﻤﺮﯾﻦ از ﻗﺴﻤﺖ ﺑﺎﻻ و ﺳﻤﺖ راﺳﺖ ﺻﻔﺤﻪ‬
‫ﻣﻨﺘﻈﺮ درﯾﺎﻓﺖ ﻧﻤﺮه ﺧﻮد ﺑﺎﺷﯿﺪ‪ .‬ﺳﺮور ‪ ۴‬ﭘﯿﻐﺎم ﻣﺨﺘﻠﻒ ﻣﻤ ﻦ اﺳﺖ ارﺳﺎل ﮐﻨﺪ‪:‬‬
‫• ﻧﺎﻣﺸﺨﺺ‪ :‬وﺿﻌﯿﺖ ﻧﺎﻣﺸﺨﺺ اﺳﺖ‪ .‬اﻣﺘﺤﺎن ﺑﻪ ﮔﻮﻧﻪای ﺗﻨﻈﯿﻢ ﺷﺪه ﮐﻪ ﭘﺲ از ﻫﺮ ارﺳﺎل ﻧﻤﺮهی آن داده ﻧﺸﻮد‪.‬‬
‫• اﻧﺘﻈﺎر ﺑﺮای ﻣﺤﺎﮐﻤﻪ‪ :‬ﺳﺮور اﻵن ﻣﺸﻐﻮل اﺳﺖ‪ .‬ﺑﺎﯾﺪ ﻣﻨﺘﻈﺮ ﺑﺎﺷﯿﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﻣﺤﺎﮐﻤﻪ ﺷﻮد‪.‬‬
‫• در ﺣﺎل ﻣﺤﺎﮐﻤﻪ‪ :‬ﺳﺮور ﻣﺸﻐﻮل ﻣﺤﺎﮐﻤﻪ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ اﺳﺖ‪ .‬ﮐﻤ ﺻﺒﺮ ﮐﻨﯿﺪ ﺗﺎ ﻣﺤﺎﮐﻤﻪ ﺗﻤﺎم ﺷﻮد‪) .‬ﻣﻤ ﻦ اﺳﺖ ﺗﺎ‬
‫دو‐ﺳﻪ دﻗﯿﻘﻪ ﻃﻮل ﺑ ﺸﺪ‪(.‬‬
‫• ﺧﻄﺎی ﮐﺎﻣﭙﺎﯾﻠﺮ‪ :‬ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ در ﺳﺮور ﺑﺎ ﺧﻄﺎی ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣﻮاﺟﻪ ﺷﺪه اﺳﺖ‪ .‬ﮐﺪ ﺧﻮد را اﺻﻼح ﮐﻨﯿﺪ‪.‬‬
‫• ﮐﺎﻣﭙﺎﯾﻞ درﺳﺖ‪ :‬ﻣﻌﻤﻮﻻ ﺑﺎ اﯾﻦ ﭘﯿﻐﺎم ﺑﺮﺧﻮرد ﺑﯿﺸﺘﺮی ﺧﻮاﻫﯿﺪ داﺷﺖ‪ .‬ﮐﺪ ﺷﻤﺎ ﺑﻪ درﺳﺘ ﮐﺎﻣﭙﺎﯾﻞ ﺷﺪه اﺳﺖ؛ ﻣ ﺗﻮاﻧﯿﺪ‬
‫ﻧﻤﺮهی ﺧﻮد را ﺑﺒﯿﻨﯿﺪ‪.‬‬
‫در ﺻﻮرﺗ ﮐﻪ در ﻣﺮاﺣﻞ ارﺳﺎل ﺗﻤﺮﯾﻦ ﺑﻪ ﻣﺸ ﻞ ﺑﺮﺧﻮردﯾﺪ ﺑﻪ آدرس ‪ [email protected]‬اﯾﻤﯿﻞ ﺑﺰﻧﯿﺪ‪.‬‬
‫‪١‬‬
‫‪٢‬‬
‫ﺳﻮالﻫﺎ ﭼﻪ ارﺗﺒﺎﻃ ﺑﻪ ﺳﺎﺧﺘﻤﺎندادهﻫﺎ و اﻟ ﻮرﯾﺘﻢﻫﺎ دارد؟‬
‫ﻣﻌﻤﻮﻻ ﺑﺮای ﺳﻮالﻫﺎﯾﯽ ﮐﻪ داده ﻣ ﺷﻮد ﯾ‬
‫ﺣﻞ ﺑﺪﯾﻬ وﺟﻮد دارد ﮐﻪ ﻓﻘﻂ ﺗﻮاﻧﺎﯾﯽ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴ اﺳﺖ و ﻫﯿﭻ ﻧﯿﺎزی ﺑﻪ درس‬
‫»ﻣﺒﺎﻧ ﺳﺎﺧﺘﻤﺎن دادهﻫﺎ و اﻟ ﻮرﯾﺘﻢﻫﺎ« ﻧﺪارد‪ .‬ﭼﻨﯿﻦ ﺣﻞﻫﺎﯾﯽ ﻋﻤﻮﻣﺎ ﻧﻤﺮهی ﺧﻮﺑﯽ ﻧﻤ ﮔﯿﺮﻧﺪ‪ .‬ﻣﺴﺌﻠﻪی اﺻﻠ ﻣﺤﺪودﯾﺖ زﻣﺎن‬
‫و ﺣﺎﻓﻈﻪ ﺳﻮالﻫﺎﺳﺖ ﮐﻪ آﻧﻬﺎ را ﺑﻪ اﯾﻦ درس ﻣﺮﺗﺒﻂ ﻣ ﮐﻨﺪ‪ .‬ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﺑﺎﯾﺪ در ﻣﺤﺪوده زﻣﺎﻧ ﻣﻄﺮح ﺷﺪه ﺑﺮای ﺳﻮالﻫﺎ ﺑﻪ‬
‫ﭘﺎﯾﺎن ﺑﺮﺳﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ ﻧﺒﺎﯾﺪ ﻫﯿﭽ ﺎه ﺑﯿﺸﺘﺮ از ﻣﺤﺪودﯾﺖ ﺣﺎﻓﻈﻪ ﮔﻔﺘﻪ ﺷﺪه در ﺳﻮال از ﻣﻨﺒﻊ ﺣﺎﻓﻈﻪی ﺳﯿﺴﺘﻢ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪.‬‬
‫ﻫﻤﭽﻨﯿﻦ ﺷﻤﺎ ﻧﻤ ﺗﻮاﻧﯿﺪ از دﯾ ﺮ ﻣﻨﺎﺑﻊ ﺳﯿﺴﺘﻢ ﻣﺎﻧﻨﺪ ﺻﺪا‪ ،‬ﺗﺼﻮﯾﺮ‪ ،‬ﻫﺎرددﯾﺴ‬
‫و ‪ ...‬اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪ .‬در اﯾﻦ ﺻﻮرت ﺟﻠﻮی اﺟﺮای‬
‫ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﮔﺮﻓﺘﻪ ﻣ ﺷﻮد و ﻧﻤﺮهی آن ﺑﺨﺶ ﺻﻔﺮ داده ﻣ ﺷﻮد‪.‬‬
‫‪٣‬‬
‫ﺳﯿﺴﺘﻢ ارزﯾﺎﺑﯽ ﺑﺮﻧﺎﻣﻪﻫﺎ ﭼ ﻮﻧﻪ اﺳﺖ؟‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎی ﺷﻤﺎ اﺑﺘﺪا ‪ compile‬ﻣ ﺷﻮد‪ .‬در ﺻﻮرت وﺟﻮد ﺧﻄﺎی ﮐﺎﻣﭙﺎﯾﻠﺮ ﻧﻤﺮهی ﺻﻔﺮ ﺑﻪ آن ﺑﺮﻧﺎﻣﻪ داده ﻣ ﺷﻮد‪ .‬در ﺻﻮرﺗ ﮐﻪ‬
‫روﻧﺪ ‪ compile‬درﺳﺖ اﻧﺠﺎم ﺷﻮد ﺑﻪ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﺗﻌﺪادی ‪ Test Case‬داده ﻣ ﺷﻮد و ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﺑﺎ آﻧﻬﺎ ﺗﺴﺖ ﻣ ﺷﻮد‪ .‬در‬
‫ﺻﻮرﺗ ﮐﻪ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﺑﺎ آن ‪ Test Case‬درﺳﺖ اﺟﺮا ﺷﺪ و ﺧﺮوﺟ ﺻﺤﯿﺢ ﺗﻮﻟﯿﺪ ﮐﺮد ﻧﻤﺮهی آن ‪ Test Case‬ﺑﻪ ﺑﺮﻧﺎﻣﻪی‬
‫ﺷﻤﺎ ﺗﻌﻠّﻖ ﻣﯿﺎﺑﺪ‪ .‬ﺗﻤﺎم ‪Test Case‬ﻫﺎ ﻧﻤﺮهی ﺑﺮاﺑﺮ دارﻧﺪ‪.‬‬
‫‪۴‬‬
‫ﮐﺪ ﻣﻦ ﺑﻪ درﺳﺘ ﮐﺎﻣﭙﺎﯾﻞ ﻣ ﺷﻮد اﻣﺎ ﺳﺮور ﺧﻄﺎی ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣ دﻫﺪ؛ ﻋﻠﺖ آن ﭼﯿﺴﺖ؟‬
‫اﮔﺮ ﺑﺮﻧﺎﻣﻪﺗﺎن را ﺑﻪ زﺑﺎن ‪ C‬ﯾﺎ ‪ C++‬ﻧﻮﺷﺘﻪاﯾﺪ ﻣﻤ ﻦ اﺳﺖ ﺑﻪ دﻟﯿﻞ اﺧﺘﻼف ﮐﺎﻣﭙﺎﯾﻠﺮ ﺳﺮور و ﮐﺎﻣﭙﯿﻮﺗﺮ ﺷﻤﺎ اﯾﻦ ﻣﺸ ﻞ رخ داده‬
‫ﺑﺎﺷﺪ‪ .‬ﮐﺎﻣﭙﺎﯾﻠﺮ ﺳﺮور ‪ gcc version 4.4.3‬اﺳﺖ‪ .‬ﻣﻤ ﻦ اﺳﺖ ﻧﯿﺎز ﺑﺎﺷﺪ ‪library‬ﻫﺎی ﺑﯿﺸﺘﺮی را در ﮐﺪﺗﺎن ‪include‬‬
‫ﮐﻨﯿﺪ‪ .‬در ﺻﻮرﺗ ﮐﻪ از ﻓﻀﺎی ﻧﺎم اﺳﺘﺎﻧﺪارد ‪ C++‬اﺳﺘﻔﺎده ﮐﺮدﯾﺪ دﺳﺘﻮر ‪ using namespace std‬ﻓﺮاﻣﻮش ﻧﺸﻮد‪.‬‬
‫در ﺻﻮرﺗ ﮐﻪ ﮐﺪﺗﺎن را ﺑﻪ زﺑﺎن ‪ Java‬ﻧﻮﺷﺘﻪاﯾﺪ دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺳﺮور ‪ javac 1.6.0 26‬اﺳﺖ ﭘﺲ ﺷﻤﺎ ﺑﺎﯾﺪ ﮐﺪ‬
‫ﺟﺎواﯾﺘﺎن را ﻣﻄﺎﺑﻖ ﺑﺎ اﺳﺘﺎﻧﺪارد ‪ Java 1.6‬ﺑﻨﻮﯾﺴﯿﺪ‪ .‬ﮐﺪ ﺟﺎوای ﺷﻤﺎ ﺑﺎﯾﺪ ﺷﺎﻣﻞ ﯾ‬
‫ﮐﻼس ﻋﻤﻮﻣ ﺑﻪ ﻧﺎم ‪ prog‬ﺑﺎﺷﺪ ﮐﻪ‬
‫ﺗﺎﺑﻊ ﻋﻤﻮﻣ ‪main‬ﺗﺎن در آن ﻗﺮار دارد‪.‬‬
‫‪۵‬‬
‫ﻣﺤﺪودﯾﺖ زﻣﺎن و ﺣﺎﻓﻈﻪ ﺑﻪ ﭼﻪ ﻣﻌﻨ اﺳﺖ؟‬
‫ﻣﺤﺪودﯾﺖ زﻣﺎن و ﯾ‬
‫ﺑﻪ ازای ﻫﺮ ‪ Test Case‬ﮐﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ داده ﻣ ﺷﻮد ﯾ‬
‫ﻣﺤﺪودﯾﺖ ﺣﺎﻓﻈﻪ ﻗﺮار داده ﻣ ﺷﻮد‬
‫ﮐﻪ در ﺻﻮرﺗ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺨﻮاﻫﺪ از اﯾﻦ ﻣﺤﺪودﯾﺖﻫﺎ ﺗﺠﺎوز ﮐﻨﺪ ﻣﺘﻮﻗﻒ ﻣ ﺷﻮد و ﻧﻤﺮهی آن ‪ Test Case‬ﺑﻪ ﺷﻤﺎ داده‬
‫ﻧﻤ ﺷﻮد‪.‬‬
‫ﻣﻬﻢ‪:‬‬
‫ﮐﺪ ﯾ‬
‫ﺣﺎل ﺳﻮال اﯾﻦ اﺳﺖ ﮐﻪ ﭼﻪ ﻃﻮر ﺑﻔﻬﻤﯿﻢ زﻣﺎن اﺟﺮای ﺑﺮﻧﺎﻣﻪی ﻣﺎ ﭼﻘﺪر ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﻗﺒﻞ از اﯾﻨﮑﻪ ﺷﺮوع ﺑﻪ ﻧﻮﺷﺘﻦ‬
‫اﻟ ﻮرﯾﺘﻢ ﮐﻨﯿﻢ ﺑﺎﯾﺪ ﻻزم اﺳﺖ زﻣﺎن و ﺣﺎﻓﻈﻪای ﮐﻪ ﺑﺮﻧﺎﻣﻪی ﻣﺎ ﻣ ﺧﻮاﻫﺪ اﺳﺘﻔﺎده ﮐﻨﺪ را ﺗﺨﻤﯿﻦ ﺑﺰﻧﯿﻢ‪.‬‬
‫ﺑﺮای اﯾﻨﮑﻪ ﺑﻔﻬﻤﯿﻢ اﻟ ﻮرﯾﺘﻢ ﻣﺎ ﭼﻘﺪر ﻃﻮل ﻣ ﮐﺸﺪ ﺑﺎﯾﺪ اﺑﺘﺪا ﭘﯿﭽﯿﺪﮔ اﻟ ﻮرﯾﺘﻢﻣﺎن را ﺣﺴﺎب ﮐﻨﯿﻢ‪ .‬در اﯾﻦ ﻣﺮﺣﻠﻪ ﺑﺎﯾﺪ ﺑﻪ‬
‫اﺻﻄﻼح ‪ Order‬اﻟ ﻮرﯾﺘﻢ را در ﺑﺪﺗﺮﯾﻦ ﺣﺎﻟﺖ ﻣﺤﺎﺳﺒﻪ ﮐﻨﯿﻢ‪ .‬ﭘﺲ از اﯾﻨﮑﻪ ‪ Order‬ﻣﺤﺎﺳﺒﻪ ﺷﺪ ﺣﺪاﮐﺜﺮ ﻣﻘﺎدﯾﺮی ﮐﻪ در ‪Test‬‬
‫‪Case‬ﻫﺎ ﺧﻮاﻫﺪ آﻣﺪ را در ﻓﺮﻣﻮل ‪ Order‬ﻗﺮار ﻣ دﻫﯿﻢ ﺗﺎ ﺑﻪ دﺳﺖ آورﯾﻢ ﺑﺮﻧﺎﻣﻪی ﻣﺎ ﭼﻨﺪ ﻋﻤﻠﯿﺎت ﻻزم دارد ﮐﻪ اﻧﺠﺎم دﻫﺪ ﺗﺎ ﺑﻪ‬
‫‪٢‬‬
‫‪ Test Case‬ﺑﺎ آن ﻣﺤﺪودﯾﺖﻫﺎ ﭘﺎﺳ دﻫﺪ‪ .‬ﺣﺎل ﺑﻪ ﺗﻮﺟﻪ ﺑﻪ آﻧﮑﻪ ﻣ داﻧﯿﻢ ﯾ‬
‫ﮐﺎﻣﭙﯿﻮﺗﺮ در ﺛﺎﻧﯿﻪ ﺣﺪود ‪ ۶ × ١٠٧‬ﻋﻤﻠﯿﺎت‬
‫اﻧﺠﺎم ﻣ دﻫﺪ زﻣﺎن ﻃ ﺷﺪه ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﺑﺮای آن ‪ Test Case‬را ﭘﯿﺶ ﺑﯿﻨ ﻣ ﮐﻨﯿﻢ‪.‬‬
‫ﺑ ﺬارﯾﺪ ﻣﺜﺎﻟ ﺑﺰﻧﻢ‪ .‬ﻣﺜﻼ ﺑﺮای ﺳﻮال اول ﺗﻤﺮﯾﻦ ﺳﺮی اول؛ ﯾ‬
‫ﯾﺎ ﻣﺎﮐﺴﯿﻤﻢ ﯾ‬
‫اﻟ ﻮرﯾﺘﻢ ﺑﺪﯾﻬ اﯾﻦ اﺳﺖ ﮐﻪ ﻫﺮ ﺑﺎر ﮐﻪ از ﻣﺎ ﺟﻤ ﯾ‬
‫ﺑﺎزه‬
‫‪k‬ﺗﺎﯾﯽ را ﻣ ﭘﺮﺳﺪ ﻣﺎ ﻫﻤﺎﻧﺠﺎ آن ﻋﻤﻠﯿﺎت را اﻧﺠﺎم دﻫﯿﻢ و ﭘﺎﺳ ﺑﺪﻫﯿﻢ‪ .‬اﯾﻦ ﯾﻌﻨ ﺑﻪ ازای ﻫﺮ ﭘﺮﺳﺶ از ﻧﻮع‬
‫‪ MAX‬ﻣﺎ از )‪ O(k‬ﻫﺰﯾﻨﻪ ﻣ ﮐﻨﯿﻢ و ﺑﻪ ازای ﻫﺮ ﭘﺮﺳﺶ از ﺟﻨﺲ ‪ SUM‬از )‪ O(n‬ﻫﺰﯾﻨﻪ ﻣ ﮐﻨﯿﻢ‪ .‬ﻣ ﺗﻮان ﮔﻔﺖ ﺑﻪ ﻃﻮر ﮐﻠ ﻫﺮ‬
‫ﭘﺮﺳﺶ ﻫﺰﯾﻨﻪی )‪ O(n‬دارد‪ .‬ﭘﺲ ﺑﺎ اﯾﻦ ﺣﺴﺎب ‪ q‬ﺗﺎ ﭘﺮﺳﺶ ﻫﺰﯾﻨﻪی )‪ O(nq‬ﺧﻮاﻫﻨﺪ داﺷﺖ‪ .‬ﺑﻪ ﺗﻮﺟﻪ ﺑﻪ اﯾﻨﮑﻪ در ﺳﻮال ﮔﻔﺘﻪ‬
‫ﺷﺪه ‪ n‬ﺣﺪاﮐﺜﺮ ‪ ١٠۵‬و ‪ q‬ﻫﻢ ﺣﺪاﮐﺜﺮ ‪ ١٠۵‬اﺳﺖ ﺗﻌﺪاد ﻋﻤﻠﯿﺎت ﺑﺮای ﯾ‬
‫‪ Test Case‬ﻣﺸ ﻞ ‪ ١٠١٠‬ﺧﻮاﻫﺪ ﺑﻮد و ﻫﻤﺎﻧﻄﻮر‬
‫ﮐﺎﻣﭙﯿﻮﺗﺮ )ﮐﻪ ﺳﺮور ﺳﺎﯾﺖ ﻫﻢ از آن ﻣﺴﺘﺜﻨ ﻧﯿﺴﺖ( در ﯾ‬
‫ﺛﺎﻧﯿﻪ ﺣﺪود ‪ ۶ × ١٠٧‬ﻋﻤﻠﯿﺎت اﻧﺠﺎم ﻣ دﻫﺪ؛ ﭘﺲ‬
‫ﮐﻪ ﮔﻔﺘﯿﻢ ﯾ‬
‫اﺟﺮای اﯾﻦ ﺑﺮﻧﺎﻣﻪ روی اﯾﻦ ‪ Test Case‬ﺣﺪود ‪ ١۶۶‬ﺛﺎﻧﯿﻪ ﻃﻮل ﺧﻮاﻫﺪ ﮐﺸﯿﺪ ﮐﻪ اﯾﻦ ﺧﯿﻠ ﺑﯿﺸﺘﺮ از ﻣﺤﺪودﯾﺖ ‪٣‬ﺛﺎﻧﯿﻪ ﻗﺮار‬
‫داده ﺷﺪه ﺑﺮای ﺳﻮال اﺳﺖ‪.‬‬
‫ﻣﻤ ﻦ اﺳﺖ ﮔﻔﺘﻪ ﺷﻮد ﺧﻮب در اﯾﻨﺠﺎ زﻣﺎن ﺧﯿﻠ دﺳﺖ ﺑﺎﻻ ﻣﺤﺎﺳﺒﻪ ﺷﺪه و در واﻗﻌﯿﺖ اﯾﻨﻄﻮر ﻧﯿﺴﺖ‪ .‬ﺑﻠﻪ دﺳﺖ ﺑﺎﻻ ﺣﺴﺎب‬
‫ﺷﺪه‪ ،‬اﻣﺎ ﺑﻪ واﻗﻌﯿﺖ ﻧﺰدﯾ‬
‫اﺳﺖ‪ .‬ﺿﻤﻦ اﯾﻨﮑﻪ ﻣﺎ اﯾﻨﺠﺎ از زﻣﺎن ﺧﻮاﻧﺪن ورودی ﺻﺮف ﻧﻈﺮ ﮐﺮدﯾﻢ‪) .‬زﻣﺎن ﺧﻮاﻧﺪن ﺣﺪود‬
‫‪ ٢ × ١٠۵‬ﻋﺪد ﺻﺤﯿﺢ(‬
‫ﻫﻤﭽﻨﯿﻦ ﻣﻤ ﻦ اﺳﺖ ﯾ‬
‫روش ﺑﺮای ﺑﻬﺘﺮ ﮐﺮدن زﻣﺎن در اﯾﻦ ﺳﻮال‪ ،‬اﯾﻦ ﺑﺎﺷﺪ ﮐﻪ ﺳﻮالﻫﺎﯾﯽ ﮐﻪ ﭘﺎﺳ ﻣ دﻫﯿﻢ را ذﺧﯿﺮه ﮐﻨﯿﻢ‬
‫ﺗﺎ اﮔﺮ ﺳﻮال ﺗﮑﺮاری ﭘﺮﺳﯿﺪه ﺷﺪ ﻣﺤﺎﺳﺒﺎت ﺗﮑﺮاری اﻧﺠﺎم ﻧﺪﻫﯿﻢ‪ .‬اﻣﺎ ﺗﻮﺟﻪ ﮐﻨﯿﺪ اﯾﻦ ﮐﺎر ﺧﯿﻠ زﻣﺎن اﺟﺮا را ﺑﻬﺘﺮ ﻧﻤ ﮐﻨﺪ زﯾﺮا‬
‫ﻣﻤ ﻦ اﺳﺖ ﺳﻮالﻫﺎ ﻃﻮری ﺑﺎﺷﻨﺪ ﮐﻪ اﺳﺎﺳﺎ ﺳﻮال ﺗﮑﺮاری وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﺣﺘ ﻣﻤ ﻦ اﺳﺖ اﯾﻦ ﺑﺮرﺳ ﺑﺮای ﺗﮑﺮاری ﺑﻮدن‬
‫ﯾﺎ ﻧﺒﻮدن ﯾ‬
‫ﺳﻮال ﺑﺎﻋﺚ ﺷﻮد زﻣﺎن اﺟﺮا ﺑﺪﺗﺮ ﻫﻢ ﺑﺸﻮد‪ .‬زﯾﺮا ﭼ‬
‫ﮐﺮدن اﯾﻨﮑﻪ ﯾ‬
‫ﺳﻮال ﺗﮑﺮاری اﺳﺖ ﯾﺎ ﻧﻪ ﺧﻮد ﻋﻤﻠﯿﺎت‬
‫زﻣﺎنﺑﺮی اﺳﺖ‪.‬‬
‫ﻟﻄﻔﺎ ﺗﻮﺟﻪ ﮐﻨﯿﺪ در ﺳﻮالﻫﺎ ﺳﻌ ﻣ ﺷﻮد ‪Test Case‬ﻫﺎ ﺑﻪ ﮔﻮﻧﻪای ﻃﺮاﺣ ﺷﻮﻧﺪ ﮐﻪ ﻓﻘﻂ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﻟ ﻮرﯾﺘﻢ درﺳﺖ ﻧﻤﺮهی‬
‫ﮐﺎﻣﻞ ﺑ ﯿﺮد و اﻟ ﻮرﯾﺘﻢﻫﺎ ﺑﺎ ﭘﯿﭽﯿﺪﮔ ﺑﺎﻻ ﻧﻤﺮهی ﺧﻮﺑﯽ ﻧﮕﯿﺮﻧﺪ‪.‬‬
‫‪۶‬‬
‫ﭼﺮا ﺳﺮور ﺑﻪ ﻣﻦ ﻧﻤﺮهی ﺻﻔﺮ ﻣ دﻫﺪ در ﺣﺎﻟ ﮐﻪ ﮐﺪ ﻣﻦ ﮐﺎﻣﻼ درﺳﺖ اﺳﺖ؟‬
‫ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﯾﻨﮑﻪ ‪Test Case‬ﻫﺎی ﻣﻮﺟﻮد روی ﺳﺮور اﮐﺜﺮا ﺑﺰرگ ﻫﺴﺘﻨﺪ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﺑﺎﯾﺪ ﺗﺎ ﺣﺪ ﺑﺴﯿﺎر ﺧﻮﺑﯽ درﺳﺖ ﺑﺎﺷﺪ ﺗﺎ‬
‫ﻧﻤﺮهای ﺑ ﯿﺮﯾﺪ‪ .‬اﮔﺮ ﺑﺮ ﺧﻼف اﻧﺘﻈﺎرﺗﺎن ﺳﺮور ﻧﻤﺮهی ﺻﻔﺮ ﺑﻪ ﺷﻤﺎ ﻣ دﻫﺪ در ﺣﺎﻟ ﮐﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪﺗﺎن ﻣﻄﻤﺌﻨﯿﺪ ﺑﻪ ﻧﮑﺎت زﯾﺮ دﻗﺖ‬
‫ﻓﺮﻣﺎﯾﯿﺪ‪:‬‬
‫• ﺳﻮال را ﯾ ﺒﺎر دﯾ ﺮ ﺑﺎ دﻗﺖ ﺑﺨﻮاﻧﯿﺪ ﺷﺎﯾﺪ ﺟﺎﯾﯽ را درﺳﺖ ﻣﺘﻮﺟﻪ ﻧﺸﺪهاﯾﺪ‪.‬‬
‫• ﯾ‬
‫ﺑﺎر ﺗﻤﺎم ﻗﺴﻤﺖﻫﺎی ﮐﺪﺗﺎن را ﺑﺨﻮاﻧﯿﺪ‪ .‬ﺣﺘ ﻗﺴﻤﺖ ورودی و ﺧﺮوﺟ ‪ ،‬دﻗﺖ ﮐﻨﯿﺪ ﺷﺎﯾﺪ اﺳﺘﺎﻧﺪارد ورودی و‬
‫ﺧﺮوﺟ ﺳﻮال را رﻋﺎﯾﺖ ﻧﮑﺮدهاﯾﺪ‪.‬‬
‫• ﺑﻪ ﺑﺨﺶ ﻣﺤﺪودﯾﺖﻫﺎ دﻗﺖ ﮐﻨﯿﺪ‪ .‬ﺷﺎﯾﺪ اﻧﺪازهی آراﯾﻪای را ﮐﻮﭼ‬
‫ﮔﺮﻓﺘﻪاﯾﺪ‪.‬‬
‫• ﻣﻤ ﻦ اﺳﺖ ﺑﻌﻀ ﻣﺘﻐﯿﯿﺮﻫﺎ در ‪ ٣٢bit‬ﺟﺎ ﻧﮕﯿﺮﻧﺪ‪ ،‬ﺷﺎﯾﺪ ﺑﺮای ﺑﻌﻀ ﻣﺘﻐﯿﯿﺮﻫﺎ ﺑﻪ ‪ ۶۴bit‬ﻓﻀﺎ ﺑﺮای ﻣﺘﻐﯿﯿﺮﻫﺎ ﻧﯿﺎز ﺑﺎﺷﺪ‪.‬‬
‫‪٣‬‬
‫‪٧‬‬
‫ﮐﺪم را ﺑﺎرﻫﺎ و ﺑﺎرﻫﺎ ﺗﺴﺖ ﮐﺮدم اﻣﺎ ﺳﺮور ﻧﻤﺮهی ﺑﯿﺸﺘﺮ از ‪ ۴٠‬ﺑﻪ ﻣﻦ ﻧﻤ دﻫﺪ‪ .‬ﭼﺮا؟‬
‫ﺑﻌﻀ از ﺳﻮالﻫﺎ ﭼﻨﺪ ‪ Test Case‬ﮐﻮﭼ‬
‫ﺗﺮ دارﻧﺪ ﺗﺎ اﻟ ﻮرﯾﺘﻢﻫﺎﯾﯽ ﺑﺎ ﭘﯿﭽﯿﺪﮔ ﮐﻤ ﺑﺎﻻﺗﺮ ﺑﺘﻮاﻧﻨﺪ ﻧﻤﺮهای ﺑ ﯿﺮﻧﺪ‪ .‬ﻣﻤ ﻦ‬
‫اﺳﺖ ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﻓﻘﻂ ﺑﻪ آن ‪ Test Case‬ﻫﺎ ﭘﺎﺳ درﺳﺖ ﻣ دﻫﺪ‪ .‬اﺣﺘﻤﺎﻻ ﯾﺎ زﻣﺎناﺟﺮای اﻟ ﻮرﯾﺘﻢﺗﺎن ﺑﺎﻻﺳﺖ ﯾﺎ ﺣﺎﻓﻈﻪی‬
‫ﻣﺼﺮﻓ ‪ ،‬ﺷﺎﯾﺪ ﻫﻢ آراﯾﻪﻫﺎﯾﺘﺎن را ﮐﻤ ﮐﻮﭼ‬
‫ﺗﻌﺮﯾﻒ ﮐﺮدهاﯾﺪ‪ .‬ﻣﻤ ﻦ اﺳﺖ ‪Test Case‬ﻫﺎی ﺑﺰرگ ﺑﻪ ﻣﺘﻐﯿﺮﻫﺎی ﺑﺰرگ )‬
‫ﺑﯿﺸﺘﺮ از ‪ ( ٣٢bit‬ﻧﯿﺎز داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪۴‬‬