Ì ÒØ Ñ Ò Ø ØÖÙ ØÙÖ Ö ĐÓÖ ¾ Ì ½ ½ ¾½ Ñ Ö ¾¼¼¾ Ì º ¹ ½¾º Ò Ú Ö È Ø Ö Ý Ö Ø Ð ¾½¼ ÐÐ Ö ¼ Å Ü ÔÓĐ Ò ¼º ØÝ ÖĐ Ò Ö ¼ Ô ¼ Ô ¼ Ô À Đ ÐÔÑ Ðº Ò Ú ĐÓÐ Ò ĐÓ Ö Ö ÒÚĐ Ò ß ÃÙÖ Ó Ò Ø ËØÖÙØÙÖ Ò Ð ÓÖ Ø Ñ Ò Â Ú ¾Ò Ú Å Ð Ìº ÓÓ Ö Ó ÊÓ ÖØÓ Ì Ñ ² ̵º ß ÓÐ Ö Ø ÙÖ Ó Ð Ø ËØÖÙØÙÖ Ò Â Ú Ú Ì ÑÓØ Ý Ù º ß Ð ÓÖ Ø Ñ Ø ËØÖÙØÙÖ Ò ÈÖÓ Ð Ñ ËÓÐÚ Ò Û Ø Ú Å Ö ÐÐ Ò Ï º ß Ø ËØÖÙØÙÖ Ò Ð ÓÖ Ø Ñ Ò ÐÝ Ò Ú Å Ö ÐÐ Ò Ï º ß ÁÒØÖÓ ÙØ ÓÒ ØÓ Ð ÓÖ Ø Ñ ¾Ò Ø ÓÒ Ú Ì ÓÑ Àº ÓÖÑ ÒÒ ÖÐ º Ä Ö ÓÒ ÊÓÒ Ð Ê Ú Ø Ó Ð «ÓÖ ËØ ÖÒº Ë Ö Ú ØÝ Ð Ø Ó ÔÓÒ Ö Ô ÔÔ Ö Ø Ô ØØ ÐĐ ÑÔÐ Ø Đ ØØº ĐÓÖ Ú Ö ÒÝ ÙÔÔ Ø Ô ÒÝØØ Ð º Ë Ö Ú Ò Ø Ô Ò Ú Ô ÔÔ Ö Øº ÐÐ Ú Ö ÑÓØ Ú Ö ÚĐ Ðº ÈÓĐ Ò Ú Ö Ò ĐÓÖ ÓÒĐÓ Ø Ð Ò ÓÑÔÐ Ö ÐÐ Ö Ó ØÖÙ ØÙÖ Ö ÐĐÓ Ò Ò Öº ÇÑ Ù ÒÚĐ Ò Ö Ó Ö Ò Ò ÓÒ Ú Ø ÐÐ ØÒ ĐÓ ÖÒ Ñ Ø Ù ÓÔ Ö Ó Ò ÇÑ Ù Ó ÒÚĐ Ò Ö Ö Ø ÙÖ Ó ÖĐ Ö Ø ÓÑ Ù ØÝ Ð Ø Ð Ö ĐÓÖ Ú Ð Ø Ó Ú Ò ØØ ÓÑ Ú ÒÓÑ ØØ Ò Ó Ú Ð Ö Ö Ô Ò ÓÑ Ú µ ÄÝ Ø ÐÐ ½
½º ÒØ ØØ Ù Ð Ö Ø Ð Ò ÑĐ Ò Ò ½ ¾ ØØ ÒĐ ÖØ ĐÓ ØÖĐ º ĐÓÖ Ø Ù ÒÚĐ Ò Ð ÓÖ ØÑ Ò ĐÓÖ Ò Đ ØØÒ Ò ÒĐ Ö ĐÓ ØÖĐ Ø Ü ÓÓ Ö Ó Ì Ñ º½ ÐÐ Ö Ù ¹ µ Ó Ò Ù ÒÚĐ Ò Ð ÓÖ ØÑ Ò ĐÓÖ Ò Đ ØØÒ Ò ÎĹØÖĐ Ø Ü ÓÓ Ö Ó Ì Ñ º¾ Ó Ù ½ º¾µº Î Ð Ø ÒĐ ÖØ ĐÓ ØÖĐ ÐÐ Ö ÎĹØÖĐ Ñ Ò Ö ÖÓÖ ĐÓÖ Ø Ô Ú Ð Ò ÓÖ Ò Ò Ñ Ò Đ ØØ Ö Ò Ð Ñ ÒØ Òº Î ÒÙ Ø ØØ Ô Đ Ø Ó ÚĐ Ö Ø ÐÐ Òº µ ÐÐÑĐ ÒÒ ÒĐ Ö ĐÓ ØÖĐ Ò Ð ÑÝ Ø Ó Ð Ò Ö º Î Ö ĐÓÖ Ú ÐÐ Ñ Ò ÙÒ Ú ØØ Ó Ø ÐÐ ØØ ØÖĐ Ø ĐÓ Ð Ö Ð Ø Ò ÓÑ ÑĐÓ Ð Ø ¾Ôµ µ Î Ð Ò Đ Ö Ò Ñ Ò Ñ Ð ĐÓ Ò Ó ØØ ÒĐ ÖØ ĐÓ ØÖĐ ÓÑ ÒÒ ÐÐ Ö Ð Ñ ÒØ Ò ½ ¾ Ò Ú Ð Ò ÓÖ Ò Ò Ñ Ò Ò Đ ØØ Ò Ð ¹ Ñ ÒØ Ò ØØ Ù Ö ÒÒ Ñ Ò Ñ Ð ĐÓ Ð Ö ÓÖ Ò Ò Ö Đ Ö ÑĐÓ Ð Ø ÖĐ Ö ÓÑ Ù Ò Ö Ò µ Ê Ø Ó Ø Ö ÙÐØ Ö Ò ØÖĐ Ø ¾Ôµ µ Î Ð Ò Đ Ö Ò Ñ Ü Ñ Ð ĐÓ Ò Ó ØØ ÒĐ ÖØ ĐÓ ØÖĐ ÓÑ ÒÒ ÐÐ Ö Ð Ñ ÒØ Ò ½ ¾ Ò Ú Ð Ò ÓÖ Ò Ò Ñ Ò Ò Đ ØØ Ò Ð ¹ Ñ ÒØ Ò ØØ Ù Ö ÒÒ Ñ Ü Ñ Ð ĐÓ Ð Ö ÓÖ Ò Ò Ö Đ Ö ÑĐÓ Ð Ø ÖĐ Ö ÓÑ Ù Ò Ö Ò µ Ê Ø Ó Ø Ö ÙÐØ Ö Ò ØÖĐ Ø ¾Ôµ µ Ð ÓÖ ØÑ Ò ĐÓÖ Ò Đ ØØÒ Ò ÎĹØÖĐ Ö Ø ÐÐ ØØ ØÖĐ Ò ÐÐØ Đ Ö ĐÓ ¹ Ð Ò Ö ÒÓÑ ØØ ØÖÙ ØÙÖ Ö ÓÑ Ñ ÒĐ Ö Ø ĐÓÚ º Î Ð Ø Đ Ö Ø Ñ Ü Ñ Ð ÒØ Ð Ø ÓÑ ØÖÙ ØÙÖ Ö Ò Ö Ù Ò ĐÓÚ ĐÓÖ ÒĐ Ö Ù Đ ØØ Ö Ò Ø Ð Ò ½ ¾ Ò Ú Ð Ò ÓÖ Ò Ò Ð Ñ ÒØ Ò ÓÑÑ ĐÓÖ ØØ ØØ ÚĐ Ö Ø ÐÐ Ê Ø Ò Ð Ô Ú Ö ÓÑ ØÖÙ ØÙÖ Ö Ò Ù ĐÓÚ Ö ĐÓÖ Ôµ µ Î Đ Ö Ø ÚĐ Ö Ø ÓÑ Ò Đ Ò ÓÑ Ù Đ ØØ Ö Ò Ø Ð Ò ½ ¾ Ò ÔÐ Ø Å ÚĐ Ö Ø Ñ Ò Ö Ú Đ Ö ÚĐ Ö Ø ÐÐ Ø Ñ Ú Ò Ô ĐÓ Ò Ò Ø Ö ØØ Ú Ø Ð Ñ ÒØ ÔÐ Ø Òº Î Đ Ö Ò ÝÑÔØÓØ ÓÑÔÐ Ü Ø Ø Ò ÙØØÖÝ Ø Ç¹ÒÓØ Ø ÓÒµ ĐÓÖ ÚĐ Ö Ø ÐÐ Ø Ó ÒÒ ÓÔ Ö ¹ Ø ÓÒ ÓÑ ÙÒ Ø ÓÒ Ú ÒØ Ð Ø Ð Ñ ÒØ Ò Ò ÑĐ Ò ÓÑ Ð Ö Ø Ð Ø Ò ÅĐ Ò Ò ½ ¾ ÒÒ ÐÐ Ö ÐÐØ Ð Ñ ÒØ Đ Ú Ò ÓÑ ÔÐ ¹ Ø Ò Ð Ö Ö Ö ÓÔ ÓÖ Ú Ð Ñ ÒØ Òºµ ËÚ Ö Ò Ô ÓÚ Ò Ø Ò Ö ÓÖ Ò ÖÓ Ô Ü Ø ÙÖ Ñ Ò Ú ÐØ ØØ ÑÔÐ Ñ ÒØ Ö ÔÐ ØÓÖÒ º ÙØ Ö Ôµ
¾º µ È Ö ÓÒ ÖÒ Ó ÓÖ Ø ÐÐ ÑÑ Ò ØØ Ù º Ú ÐÐ ÓÔÔÐ ÑÑ Ò Ò ØÓÖ Ö Ñ Ò Ú ÐÐ ÒÚĐ Ò Ð Ø Ð ÓÑ ÑĐÓ Ð Øº ÆĐ ØÚ Ö Ø ÐÐØ Ð Ò ÑÑ Ò Đ Ò Ò Ö Đ Ö ÙÑÑ Ò Ú ÐÐ Ö Ú Ø Ö Đ Ö Ð Ø Ò ÓÑ ÑĐÓ Ð Øº Å Ò Ñ Ð Ð Ú Ø Ò Ø Ñ ÐÐ Ò ØÚ ØÓÖ Ö Ú ĐÓÐ Ò Ö ÒÒÑ ØÖ ¼ ½ ¼ ½¼ ½ ¼ ½¼ ¼ ¾ ¼ ¾ ¼ Ê Ø Ò Ð ÓÑ Ú Ö ÙÖ Ó ĐÓÖ ÓÔÔÐ ÑÑ Ò Ò ØÓÖ Ö ĐÓÖ Ð Ö Ó ÙÖ Ð ÓÖ ØÑ Ò Ù ÒÚĐ ÒØ ÙÒ Ö Ö ÒÓÑ ØØ Ö Ø Ð Ö ÓÑ Ú Ö ÙÖ Ð ÓÖ ØÑ Ò Ø ĐÓÖ Ø ÓÒ ØÖÙ Ö Ö ÐÒĐ Ø Øº Ôµ µ Å Ò Ò ÒÚĐ Ò ØÖ Ð ÓÖ ØÑ ĐÓÖ ØØ ÒÒ ÓÖØ Ø ÚĐ Ò Ñ ÐÐ Ò ØÚ ÒÓ Ö Ò Ú Ø Ö º ÒØ ØØ ÐÐ Ú Ø ÖÒ Ú Ø Ò Ò Ñ ÐÐ Ò ØÚ Ö ÒÒÓ Öµ Đ Ö ½º ÀÙÖ Ò Ú ĐÓÖ Ò Ð ØÖ Ð ÓÖ ØÑ Î Ð Ò ÝÑÔØÓØ ÓÑÔÐ Ü Ø Ø Ö Ò ĐÓÖ Ò Ð Ð ÓÖ ØÑ Ò Ù Ò Ç¹ ÓÑÔÐ Ü Ø Ø ÓÑ Ò ÙÒ Ø ÓÒ Ú ÒØ Ð Ø Ö Ó ÒØ Ð Ø ÒÓ Ö Ö Òº Ôµ µ ÒØ ØØ Ù ÒØ ĐÓÚ Ö Ö ØÙÖÒ Ö ÓÖØ Ø ÚĐ Ò ÙØ Ò Ö Ú ÐÐ Ú Ø ÐĐ Ò Ò Ó Ò ÓÖØ Ø ÚĐ Òº ÀÙÖ Ô Ú Ö Ò ÝÑÔØÓØ ÓÑÔÐ Ü Ø Ø Ò Ó ØÖ Ð ÓÖ ØÑ ¾Ôµ
º µ Ë Ö Ú Ò Â Ú ¹Ñ ØÓ ÔÙ Ð ÒØ ÒØ Òµ ß ººº Ð ØØ Òµ Ö ØÙÖÒ Ö Ö Ø ÒØ ÓÒ Ø Ð Ø Ú Ö ÙÐØ Ø Ò ÙÔÔ¹ ÝÐÐ ¼µ ¼ ½µ ½ Ò ¾µ Òµ Ò ½µ Ò Ñ ØÓ ÝÑÔØÓØ Ø ÓÑÔÐ Ü Ø Ø Ç Òµ ÙÒ Ö ÒØ Ò Ø ØØ Ø Ò Ø Ø Ö ØØ ÙØ ĐÓÖ Ò Ø ÓÒ Đ Ö Ç ½µº Ôµ µ Ä Ø Ì Òµ Ú Ö ÒØ Ð Ø ÔÖ Ñ Ø Ú ÓÔ Ö Ø ÓÒ Ö Ò Ñ ØÓ ÙØ ĐÓÖ ÒĐ Ö Ò ÖĐ Ò Ö Òµº Î Đ Ö Ì ¼µ Ì ½µ Ó Ì ¾µ Ù ÐÐØ ÖĐ Ò ÒØ Ð Ø Ø ÓÒ Ö ÒØ Ð Ø Ø ÐÐ ÐÒ Ò Ö ÒØ Ð Ø Đ Ñ ĐÓÖ Ð Ö Ó Ú Ë Ö Ú Ò Ö Ú Ð ÒØ Ò Ò Ù ĐÓÖ ÓÑ Ú ÓÑ ÙØ ĐÓÖ Ò ÔÖ Ñ Ø Ú ÓÔ Ö Ø ÓÒ Ó Ö Ú Ò Ö Ü Ø Ú Ð ÔÖ Ñ Ø Ú ÓÔ Ö Ø ÓÒ Ö Ò ¹Ñ ØÓ ÒÚĐ Ò Ö Ôµ µ ËØĐ ÐÐ Ò ÙÔÔ Ö ÙÖ ÓÒ Ú Ø ÓÒ Ö ĐÓÖ Ì Òµ Ú Ò Ö Ì Òµ ÒÓÑ ØØ Đ Ú Ì ¼µ Đ Ö Ó ÙÖ Ñ Ò Ò ÖĐ Ò ÙØ Ì Ò ½µ ÓÑ Ñ Ò Ú Ø Ì Òµº ÅÓØ Ú Ö Ú Ö ĐÓÖ Ì Òµ Đ Ö Ç Òµ Ôµ µ Å Ò Ò Ó ÑĐ Ø Ø ÓÑÔÐ Ü Ø Ø Ò ÓÑ ÙÒ Ø ÓÒ Ú ÐĐ Ò Ò Ñ Ú Ø Ð Ø Ò ÒĐ Ö Ö ÔÖ ÒØ Ø ÓÒº Ü ÑÔ ÐÚ Ö Ø Ð Ø ÒĐ ÖÖ ÔÖ ÒØ Ø ÓÒ Ò ½½ ÓÑ Ö ÐĐ Ò Ò ¾ Ó Ø Ð Ø ½¾ Ö ÒĐ ÖÖ ÔÖ ÒØ Ø ÓÒ Ò ½½¼¼ ÓÑ Ö ÐĐ Ò Ò º Ä Ø Ì ¼ ѵ Ú Ö Ñ Ü Ñ Ð ÒØ Ð Ø ÓÔ Ö Ø ÓÒ Ö Ò Ð ÓÖ ØÑ ÙØ ĐÓÖ ĐÓÖ ØØ ÖĐ Ò Òµ Đ Ö Ñ Đ Ö ÐĐ Ò Ò Ú Ò ÒĐ ÖÖ ÔÖ ÒØ Ø ÓÒº Ò ÐĐ ÑÔРǹ ÓÑÔÐ Ü Ø Ø Ð ĐÓÖ Ì ¼ ѵ ¾Ôµ µ ÒØ Ò Ø ØØ Ø Ò Ø Ø Ö ØØ ÖĐ Ò Ò Ø ÓÒ Đ Ö Ç ½µ ĐÓÖÙØ Đ ØØ Ö ØØ ÙÑÑ Ò Ú Ö Ð Ò Ò Ð Ö ÓÑ Ò ÒØ ÙØ Ò ØØ Ñ Ò Ö ÓÚ Ö ÓÛ º ÀÙÖ ĐÓÖ Ñ Ò ÓÑ Ñ Ò Ú ÐÐ Ö Ó ØÝ Ð Ø ØÓÖ ÐØ Ð Å Ò Ú Ø ÐÐØ ÒØ Ô ĐÓÖ Ò ÙÖ Ñ Ò ÒĐ Ö «ÖÓÖ Ñ Ò ĐÓÚ Öº Î Ð Ò Ç¹ ÓÑÔÐ Ü Ø Ø Ö Ø ÓÒ ÐÐ ÍÔÔ ØØ Ó Ç¹ ÓÑÔÐ Ü Ø Ø Ò ĐÓÖ Ò ¹Ñ ØÓ ÓÑ Ò ÒÚĐ Ò Ö ÒÒ Ñ ØÓ ĐÓÖ ØØ Ö ØÓÖ ÐØ Ð ¾Ôµ
º µ ÒØ ØØ Ù ĐÓÖ Ò Ø ÐÐ ĐÓÖ ØØ Ø Ø Ö Ø Ö ĐÓÖ ĐÓØ ÓÖ º ËĐÓ ÒÝ Ð ÖÒ Đ Ö Ø Ø Ø Ò Ò Ö ÓÑ Ø Ö Ú ØØ ÓÑÖ Ò ÑÒ ĐÓÐ Ø Ú ØØ ¾¹ Æ Ø Ó ØØ ¹ Æ Ø Ø Ð Ø Ü ÌÓÖÔ ½¼ º Ù Ú Ø Ó ÒØ Ú Ð ÓÑÖ Ò ÑÒ Ò Đ Ö Ö ØØ Đ Ö Ö ÔÖ ÒØ Ö ÓÑ ØÖĐ Ò Ö Ñ Ñ Ü Ñ ÐØ ½¾ Ó ØĐ Ú Öº Î ÒØ Ö Ú Ö ØØ Ø ÐÐ Ò ØÓÖÐ Đ Ö ØØ ¹ «Ö Ø ÔÖ ÑØ к À ØØ Ô Ò Ö ÙÒ Ø ÓÒ Ôµ µ Î Ð Ú ĐÓÐ Ò ØÖ Ø Ø ØÝÔ Ö Đ Ö ÐĐ ÑÔÐ Ó Ú Ð Đ Ö ÓÐĐ ÑÔÐ ØØ ÑÔÐ Ñ ÒØ Ö Ñ Ø ÐÐ Ö º ÔÖ ÓÖ Ø Ø ĐÓ Ö º ÑĐ Ò Ö º ÑÙÐØ ÑĐ Ò Ö ÅÓØ Ú Ö ÐÐ Ú Ö ÒѺ ÅÙÐØ ÑĐ Ò Ö ÑÙÐØ Ø µ ÐÐ Ó Ô Ö µ Ó Ð Ö Ö Ò ÑĐ Ò Ö ÒÓÑ ØØ Ò Ö ÓÔ ÓÖ Ú ÑÑ Ð Ñ ÒØº ÅÙÐØ ÑĐ Ò Ò ½ ½ ¾ Ð Ö ÐÐØ Ö Ò Ô Ò ½ ¾ º ÇÔ Ö Ø ÓÒ ÖÒ Ô ÑÙÐØ ÑĐ Ò Ö ÑÓØ Ú Ö Ö ÓÔ Ö Ø ÓÒ ÖÒ Ô ÑĐ Ò Ö Ø Ü ÙÒ ÓÒ Ò ØØ ÓÑ ØØ Ú Ø Ð Ñ ÒØ ÒÒ ÑĐ Ò Ò Ó Úº Ë ÐÐÒ Ò Đ Ö Ó ØØ ÑÙй Ø ÑĐ Ò ÓÔ Ö Ø ÓÒ ÖÒ Ñ Ø ÐÐ Ö Ô ÙÖ Ñ Ò ĐÓÖ ÓÑ Ø Ö Ø ÒÒ Ú ØØ Ú Ø Ð Ñ ÒØº Ôµ µ Ù Ö ØĐ ÑØ ĐÓÖ ØØ ÒÚĐ Ò Ò Ø ÐÐ Ñ Ò Ù Ú ÐÐ Ó Ú Ø ÚĐ Ö Ø ÐÐ ¹ ÓÑÔÐ Ü Ø Ø Ò ĐÓÖ ĐÓ Ò Ò Ò Đ ØØÒ Ò Ó ÓÖØØ Ò Ò Ú Ð¹ Ñ ÒØº ÀÙÖ ÖÓÖ ÚĐ Ö Ø ÐÐ ÓÑÔÐ Ü Ø Ø Ò Ô ÒØ Ð Ø Ð Ö Ð Ñ ÒØ Ò Ó Ô Ø ÐÐ Ò ØÓÖÐ Æ ĐÓÖ º ĐÓÔÔ Ò Ö Ö Ò ÀĐ Ö Đ Ö Ù ĐÓÖÙØ Đ ØØ ØØ Ð ØÒ Ò ØÓÖÒ Đ Ö Ñ Ò Ö Đ Ò ½ Ú ØØ Ø ÐÐ Ò ÒØ Đ Ö ÙÐеº º Ò Ò Ñ Ò Ö Ò Ò Ù Ø Ò Ò µ Đ Ö Ò ÖÒ ÑÔÐ Ñ ÒØ Ö Ø Ñ ÐĐ Ò Ð ØÓÖº Ôµ º Ú Ø ØÚ ÓÖØ Ö Ú ØÓÖ Ö Ú ÐĐ Ò Ò ÓÒ ØÖÙ Ö Ò Ð ÓÖ ØÑ Ô Ù¹ Ó Ó µ ÓÑ Ö ØÙÖÒ Ö Ö Ø ÐĐ Ö Ñ Ò Ð Ñ ÒØ Ø Ò ÑÑ Ò Ð Ò Ú ¹ ØÓÖÒ ÇÑ Ù Ø Ü Ö Ú ØÓÖ ÖÒ ½ ¾ Ó Đ Ö ÐÐØ Ø ÐĐ Ö Ñ Ò Ð Ñ ÒØ Ø Ó Ø ĐÓ Ö Ñ Ò Ð Ñ ÒØ Ø Ø Ö ÓÑ Ò Ñ¹ Ñ Ò Ð Ò ÓÖØ Ö µ Ú ØÓÖÒ Đ Ö Ð Ø Ò ½ ¾ º ĐÓÖ ØØ ÙÐÐ ÔÓĐ Ò Ò Ð ÓÖ ØÑ ÓÑÔÐ Ü Ø Ø Ò Ç ÐÓ Òµ Ó Ù ÑÓØ Ú Ö Ú Ö ĐÓÖ Ò Ö ÒÒ ÓÑÔÐ Ü Ø Øº Ù Ò Ó ÐÔÓĐ Ò ĐÓÖ Ò Ñ Ò Ö «Ø Ú Ð ÓÖ ØÑ ÓÑ Ù ĐÓÖ Ò ÓÖÖ Ø ÓÑÔÐ Ü Ø Ø Ò ÐÝ º ÒØ Ð Ø ÐÔÓĐ Ò ÖÓÖ Ô ÙÖ «Ø Ú Ò Ð ÓÖ ØÑ Đ Öº ½¼ Ôµ
Datastrukturer för D2 (TDA 131) tentamen med lösningar 21 december 2002 1. Antag att du ska lagra talen i mängden f1; 2; 3; 4; 5; 6; 7g i ett binärt sökträd. Först ska du använda algoritmen för insättning i binära sökträd (se t ex Goodrichoch Tamassia 9.1 eller Budd sid 357-365) ochsedan ska duanvända algoritmen för insättning i AVL-träd (se t ex Goodrichoch Tamassia 9.2 och Budd 14.2). Vilket binärt sökträd eller AVL-träd man fνar beror förstνas pνa i vilken ordning man sätter in elementen. Vi ska nu titta pνa de bästa och värsta fallen. (a) Allmänna binära sökträd kan bli mycket obalanserade. Varför vill man undvika dettaochse till att trädets höjd blir sνa liten som möjligt? (2p) Svar. Värstafallskomplexiteten för de viktigaste operationerna pνa binära sökträd (sökning, insättning, borttagning) är O(h) där h är trädets höjd. (b) Vilken är den minimala höjden hos ett binärt sökträd som innehνaller elementen f1; 2; 3; 4; 5; 6; 7g? Ange i vilken ordning man kan sättainelementen sνa att du fνar denna minimala höjd! (Flera ordningar är möjliga, det räcker om du anger en!) Rita ocksνa det resulterande trädet! (2p) Svar. Den minimala höjden är 2. Om man t ex sätter in elementen i ordningen 4,2,6,1,3,5,7 fνar man trädet 4 / 2 6 / / 1 3 5 7 1
(c) Vilken är den maximala höjden hos ett binärt sökträd som innehνaller elementen f1; 2; 3; 4; 5; 6; 7g? Ange i vilken ordning man kan sättainelementen sνa att du fνar denna maximala höjd! (Flera ordningar är möjliga, det räcker om du anger en!) Rita ocksνa det resulterande trädet! (2p) Svar. Den maximala höjden är 6. Om man t ex sätter in elementen i ordningen 1,2,3,4,5,6,7 fνar man trädet 1 2 3 4 5 6 7 (d) Algoritmen för insättning i AVL-träd ser till att träden alltid är höjdbalanserade genom att strukturera om dem när det behövs. Vilket är det maximala antalet omstruktureringar du kan behöva göra när du sätter in talen f1; 2; 3; 4; 5; 6; 7g? Ange vilken ordning elementen ska komma för att fνa detta värsta fall! Rita en bild pνa varje omstrukturering du behöver göra! (3p) Svar. Om elementen sätts in i ordningen 1,2,3,4,5,6,7 behöver man göra 4 omstruktureringar: 1 2 2 2 / / / 2 => 1 3 1 3 => 1 4 / 3 4 3 5 5 2 4 4 4 / / / / 1 4 => 2 5 2 5 => 2 6 / / / / / 3 5 1 3 6 1 3 6 1 3 5 7 6 7 Detta är det maximala antalet. Omstruktureringar behöver uppenbarligen aldrig göras efter insättning av det första ochdet andra elementet. Omstrukturering behöver inte heller göras efter insättning av det fjärde elementet eftersom ett treelements AVL-träd alltid är perfekt balanserat, dvs vänster och höger delträd har samma höjd.
(e) Vad är det värsta som kan hända om du sätter in talen f1; 2; 3; 4; 5; 6; 7g i en skiplista? Med värsta" menar vi här värsta fallet med avseende pνa sökning efter ett visst element i skiplistan. Vad är den asymptotiska komplexiteten (uttryckt i O-notation) för värsta fallet hos denna operation som funktion av antalet element n idenmängd som lagrats i listan? (Mängden f1; 2; 3; 4; 5; 6; 7g innehνaller alltsνa 7 element, även om skiplistan lagrar flera kopior av elementen.) Svaren pνa ovanstνaende frνagor kan bero pνa exakt hur man valt att implementera skiplistorna. Diskutera! (3p) Svar. Om höjden av skiplistan är h sνa är komplexiteten hos sökning O(h + n) i värsta fallet, eftersom vi behöver göra h drop down och n scan forward operationer (see G & T sid 365) i värsta fallet. Ett exempel pνa ett sνadant värsta fall är att vi söker efter 7 i skiplistan 1 1 : h nivνaer 1 1-2 - 3-4 - 5-6 - 7 Om vi inte begränsar antalet nivνaer i vνara skiplistor, kan h bli godtyckligt stort i förhνallande till n. Om vi däremot begränsar antalet nivνaer sνa att t ex h är O(log n) (som föreslνas i G &Tsid 368), sνa blir värsta fallet O(log n + n) =O(n).
2. (a) Personerna A, B, C, D, E och F bor tillsammans i ett hus. De vill koppla samman sina datorer, men vill använda sνa lite kabel som möjligt. Nätverket ska alltsνa bilda en sammanhängande graf, där summan av alla bνagars vikter är sνa liten som möjligt. Minimala kabelavstνandet mellan tvνa datorer ges av följande grannmatris: A B C D E F A 0 6 1 5 7 5 B 6 0 5 10 3 9 C 1 5 0 5 6 4 D 5 10 5 0 8 2 E 7 3 6 8 0 6 F 5 9 4 2 6 0 Rita en bild som visar hur A, B, C, D, E och Fbör koppla samman sina datorer! Förklara ocksνa hur algoritmen du använt fungerar genom att rita bilder som visar hur algoritmen steg för steg konstruerar kabelnätet. (5p) Svar. Grannmatrisen ovan representerar en viktad oriktad graf G (vi kan bortse frνan självlooparna med vikt 0). Vi använder oss av Prims algoritm pνa G med A som startnod (se 12.7.2 i G & T för en beskrivning av algoritmen). Den genererar följande minsta uppspännande träd: 1(1) 5(4) A ------- C -------- B 4(2) 3(5) D ------- F E 2(3) Vi har markerat bνagarna med v(n) dνar v är vikten och n är ordningen i vilken Prims algoritm lagt till bνagen till nätverket. T ex betyder markeringen 5(4) pνa bνagen mellan C ochb att vikten är5ochdetta var den fjärde bνage algoritmen lade till.
(b) Man kan använda Dijkstras algoritm för att finna kortaste vägen mellan tvνa noder i en viktad graf. Antag att alla vikterna (avstνanden mellan tvνa grannoder) är 1. Hur kan vi dνa förenkla Dijkstras algoritm? Vilken asymptotisk komplexitet har den förenklade algoritmen? Du ska angeo- komplexitet som en funktion av antalet bνagar ochantalet noder i grafen. (5p) Svar. Om alla vikterna är 1 kan vi använda en kö istället för en prioritetskö (t ex en heap) för att lagra kandidatnoderna. (I G & T sid 587 heter prioritetskön Q ochlagrar alla noder utanför molnet" av färdiga noder till vilka kortaste vägen redan är bestämd.) Dijkstras algoritm degenererar i detta fall till bredden först sökning. Enligt G & T sid 591 har Dijkstras algoritm komplexiteten O((n + m)logn) där n är antalet noder och m är antalet bνagar. Anledningen är att vi plockar ut minsta elementet ur prioritetskön n gνanger och uppdaterar prioritetskön m gνanger och varje utplockning ochuppdatering har komplexiteten O(log n) om prioritetskön implementeras med en heap. Om däremot prioritetskön ersätts med en kö harbνade utplockning ochuppdatering komplexiteten O(1). Alltsνa förbättrar vi komplexiteten till O(n + m). (c) Antag att du inte behöver returnera kortaste vägen, utan bara vill veta längden hos den kortaste vägen. Hur pνaverkas dνa den asymptotiska komplexiteten hos Dijkstras algoritm? (2p) Svar. Det pνaverkar inte den asymptotiska komplexiteten. Algoritmen pνa sid587ig& Treturnerar bara längden hos den kortaste vägen. Om vi dessutom vill returnera själva kortaste vägen (en sekvens av noder t ex), sνa lagrar vi för varje nod förutom preliminära avstνand (D-värden i G &T)även information om föregνangarnod längs den preliminärt kortaste vägen. Komplexitetsanalysen för den algoritm som även returnerar kortaste vägen blir identisk med den som bara returnerar kortaste avstνandet: varje uppdatering ochurplockning blir fortfarande O(log n), endast konstanten pνaverkas av att man mνaste hνalla reda pνa föregνangarnoderna.
3. (a) Skriv en Java-metod public int fib(int n)... } sνa att fib(n) returnerar det nte fibonaccitalet, dvs resultaten ska uppfylla fib(0) = 0 fib(1) = 1 fib(n+2) = fib(n) + fib(n+1) Din metod ska ha asymptotisk tidskomplexitet O(n) under antagandet att tiden det tar att utföra en addition är O(1). (4p) Svar. Vi skriver en iterativ algoritm: } public int fib(int n) int fst = 0; int snd = 1; int current = 0; if (n == 1) current = 1;}; for (int i = 2; i <= n; i++) current = fst + snd; fst = snd; snd = current; }; return current;
(b) Lνat T (n) vara antalet primitiva operationer din metod utför när den beräknar fib(n). Vad är T (0);T(1) och T (2)? Du ska alltsνa räkna antalet additioner, antalet tilldelningar, antalet jämförelser, osv! Skriv ner vilka antaganden du gör om vad som utgör en primitiv operation ochskriv ner exakt vilka primitiva operationer din fib-metod använder! (3p) Svar. Vi räknar följande primitiva operationer: ffl tilldelning (inkl initiering av lokal variabel); ffl operationerna ==; <=; +; ++; ffl returnera värdet av en variabel. (En mer exakt beräkning kräver kunskaper om hur Java kompileras, vi försöker här analysera primitiva operationer pνa ungefär samma nivνa som i3.5.1ig&t.) Med dessa antaganden fνar vi T (0) = 7; vi markerar i algoritmen: } public int fib(int n) int fst = 0; -- 1 int snd = 1; -- 1 int current = 0; -- 1 if (n == 1) current = 1;}; -- 1 for (int i = 2; i <= n; i++) -- 1 + 1 current = fst + snd; fst = snd; snd = current; }; return current; -- 1 T (1) = 8. Som ovan fast vi exekverar ocksνa current = 1;}. T (2) = 13 } public int fib(int n) int fst = 0; -- 1 int snd = 1; -- 1 int current = 0; -- 1 if (n == 1) current = 1;}; -- 1 for (int i = 2; i <= n; i++) -- 1 + 2 + 1 current = fst + snd; -- 1 + 1 fst = snd; -- 1 snd = current; -- 1 }; return current; -- 1 (c) Ställ sedan upp rekursionsekvationer för T (n)! Dvs definiera T (n) genom att säga vad T (0) är och hur man kan räkna ut T (n + 1) om man vet T (n). Motivera varför T (n) är O(n)! (3p) Svar. T (0);T(1); och T (2) angavs i (b). För n > 2 fνar vi T (n + 1) = T(n) +6. Alltsνa blir T (n) =6n + 1» 7n för n 2. Det följer att T (n) är O(n).
(d) Man kan ocksνa mäta tidskomplexiteten som funktion av längden m av talet n i binär representation. Exempelvis har talet 3 binärrepresentationen 11 som har längden 2, ochtalet 12 har binärrepresentationen 1100 som har längden 4. Lνat T 0 (m) vara maximala antalet operationer din algoritm utför för att beräkna fib(n) där m är längden av n i binärrepresentation. Ange lämplig O-komplexitetsklass för T 0 (m)! (2p) Svar. T 0 (m) är O(2 m ) eftersom n är O(2 m ). (e) Antagandet att tiden det tar att beräkna en addition är O(1) förutsätter att summan verkligen kan lagras som en int utan att man fνar overflow". Hur gör man om man vill addera godtyckligt stora heltal? Man vet alltsνa inte pνa förhand hur mνanga binära siffror man behöver. Vilken O-komplexitet har addition is sνa fall? Uppskatta ocksνa O-komplexiteten för din fib-metod om den använder denna metod för att addera stora heltal? (2p) Svar. Man kan addera godtyckligt stora heltal genom att använda den algoritm som man lärde sig i lνagstadiet. (Väsentligen samma algoritm för binära tal används ju i hνardvaruadderare, som dock bara klarar tal av begränsad storlek.) Tidskomplexiteten hos lνagstadiealgoritmen är O(m) eller O(log n) där n är maximum av detvνa talen och m är antalet siffor i n. Tidskomplexiteten för fibonaccifunktionen som klarar godtyckligt stora n blir alltsνa O(n log(fib n)). Eftersom fib n är O(2 n ) sνa är den alltsνa även O(n 2 ).
4. (a) Antag att du ska göra en hashtabell för ett fastighetsregister för Göteborg. Söknycklarna är fastighetsbeteckningar som bestνar av ett omrνadesnamn följt av ett 2-siffigt ochett 3-siffigt tal, t ex Torp 44:106. Du vet dock inte vilka omrνadesnamnen är, bara att de är representerade som strängar med maximalt 12 bokstäver. Vi antar vidare att hashtabellens storlek är ett 5-siffrigt primtal. Hitta pνa en bra hashfunktion! (4p) Svar. För att fνa ensνa bra hashfunktion som möjligt bör man utnyttja alla tre komponenterna (omrνadesnamnet ochde tvνa talen). Om man t ex bara använder de tvνa talen riskerar man att fνa onödigt mνanga kollisioner genom att det kan hända att samma talpar används i mνanga olika omrνaden. Sedan gäller det att kombinera dem pνa ettlämpligt sätt. Först konverterar vi omrνadesnamnet till ett heltal i t ex genom att först använda ASCII värdena för bokstäverna i namnet och sedan använda en polynomisk hashfunktion (se G & T sid 345). Sedan beräknar vi hashfunktionen h(i; j; k) =(i + 1000j + k)modn där j är det 2-siffriga talet, k är det 3-siffriga talet och N är hashtabellens storlek.
(b) Vilka av följande abstrakta datatyper är lämpliga ochvilka är olämpliga att implementera med hashtabeller: i. prioritetsköer, ii. mängder, iii. multimängder? Motivera alla svar! Anm. Multimängder (multisets) kallas ocksνa pνasar ( bags") ochskiljer sig frνan mängder genom att de kan ha flera kopior av samma element. Multimängden f1; 1; 2g skiljer sig alltsνa frνan pνasen f1; 2g. Operationerna pνa multimängder motsvarar operationerna pνa mängder, t ex union, snitt, om ett visst element finns i mängden, osv. Skillnaden är dock att multimängdsoperationerna mνaste hνalla reda pνa hur mνanga förekomster det finns av ett visst element. (4p) Svar. i. Det är olämpligt att implementera prioritetsköer med hashtabeller. För att finna minsta elementet mνaste man söka genom hela hashtabellen. ii. Det kan ofta vara lämpligt att implementera mängder med hashtabeller. Elementrelationen (2) är ju ingenting annat en sökning, och poängen med hashtabeller är ju bl a att denna operation i praktiken är O(1). Betrakta vidare tvνa mängder som implementerats med hinkhashning med samma hashfunktion. Vi kan nu implementera unionen helt enkelt genom att ta unionen av hinkar med samma index! Denna implementering har komplexiteten O(N), där N är hashtabellens storlek ochvi förutsätter att vi har en bra hashfunktion sνa att antalet kollisioner är litet. Detta är bra om inte N är alltför stort i förhνallande till n, antalet lagrade element. Pνa samma sätt kan snittet beräknas genom att ta snittet av hinkar med samma index. (Implementeringen avmängderig& Tavsnitt 10.2.1 använder ju sorterade sekvenser. Union ochsnitt kan dνa beräknas med generic merge" ochhar komplexiteten O(n + n 0 )där n och n 0 är antalet element idetvνa sekvenserna. Vidare är (binär) sökning efter ett element i en sorterad sekvens O(log n).) iii. Man kan implementera multimängder med hjälp av hashtabeller pνa liknande sätt som man kan implementera mängder. Skillnaden är att när man implementerar mängder lagrar man bara elementen (söknycklarna) medan när man implementerar multimängder lagrar man par av element och tal som representerar antalet förekomster av elementet i frνaga. Även här blir elementen söknycklar i hashtabellen. Anledningen till att det ofta är lämpligt att implementera multimängder med hashtabeller är därför väsentligen desamma som för mängder, eftersom operationerna kan implementeras pνa liknande sätt.
(c) Du har bestämt dig för att använda en hashtabell, men du vill ocksνa veta värstafalls-komplexiteten för sökning, insättning, ochborttagning av element. Hur beror värstafallskomplexiteten pνa antalet lagrade element n och pνa hashtabellens storlek N för i. öppen adressering; (Här fär du förutsätta att belastningsfaktorn är mindre än 1, dvs att hashtabellen inte är full). ii. hashning med hinkar ( hashing in buckets, chained hashing"), där hinkarna implementerats med länkade listor. (4p) Svar. i. Öppen adressering. Vi antar först att inga borttagningar har gjorts sνa att hashtabellen inte innehνaller nνagra gravstenar". I sνa fallär värsta fallet att hashfunktionen givit samma hashkod till alla element och därför placerat alla elementen efter varanda (antag för enkelhets skull linjär probing). Sökning ochborttagning är dνa O(n) (vi mνaste i värsta fall leta genom hela sekvensen). Insättning är O(n) (vi mνaste alltid stega oss genom hela sekvensen för att hitta en ledig plats). Om även gravstenar finns kan vi i värsta fall behöva leta genom hela hashtabellen. Alla tre operationerna blir därför O(N). ii. Hashning med hinkar, där hinkarna implementerats med länkade listor. Även här är värsta fallet att hashfunktionen givit samma hashkod till alla elementen och vi alltsνa bara har en hink (länkad lista). Komplexiteten är därför densamma som för motsvarande operationer pνa länkade listor, dvs insättning är O(1) ochsökning och borttagning är O(n).
5. Givet tvνa sorterade vektorer, bνada av längd n, konstruera en algoritm (i pseudokod) som returnerar det lägre medianelementet i den sammanslagna vektorn! Om du t ex har vektorerna [1; 2; 5] och [3; 4; 6] är alltsνa 3 "det lägre medianelementet" och 4 "det högre medianelementet", eftersom den sammanslagna (sorterade) vektorn är listan [1; 2; 3; 4; 5; 6]. För att fνa fullpoäng ska din algoritm ha komplexiteten O(log n) ochdu ska motivera varför den har denna komplexitet. Du kan dock fνa delpoäng för en mindre effektiv algoritm, om du gör en korrekt komplexitetsanalys. Antalet delpoäng beror dνa pνa hur effektiv din algoritm är. (10 p) Svar. Vi använder söndra ochhärska" ( divide and conquer") strategin för att fνa en enkel ocheffektiv algoritm pνa följande sätt. Kalla de tvνa vektorerna a = a[0];:::;a[n 1] och b = b[0];:::;b[n 1]. Bafallet n =1beräknas genom att välja det mindre av a[0] och b[0]. Om n>1är udda och m =(n 1)=2 kan vi beräkna medianelementen a[m] och b[m] i konstant tid. Vi observerar nu att det lägre medianelementet x för a och b mνaste ligga i intervallet a[m]» x < b[m] om a[m] < b[m] och i intervallet b[m]» x<a[m] omb[m] <a[m]. Om a[m] =b[m] sνa är x = a[m] =b[m]. Det lägre medianelementet för a och b kan alltsνa beräknas genom att jämföra a[m] och b[m] och ffl om a[m] < b[m] beräkna det lägre medianelementet för a[m];:::;a[n 1] och b[0];:::;b[m]. (För att kunna anropa algoritmen rekursivt behöver vi tvνa lika lνanga vektorer. Därför tar vi med det redan eliminerade värdet b[m].) ffl om b[m] < a[m] beräkna det lägre medianelementet för b[m];:::;b[n 1] och a[0];:::;a[m]. ffl om a[m] = b[m] returnera a[m]. Om n är jämt och l = n=2 1kan vi beräkna de lägre medianelementen a[l] och b[l] pνa konstant tid. Här observarar vi att a[l] <x» b[l] om a[l] <b[l] och iintervallet b[l]» x<a[l] omb[l] <a[l]. Om a[l] =b[l] sνa är x = a[l] =b[l]. Det lägre medianelementet för a och b kan alltsνa beräknas genom att jämföra a[l] och b[l] och ffl om a[l] < b[l] beräkna det lägre medianelementet för a[l + 1];:::;a[n 1] och b[0];:::;b[l]. ffl om b[l] < a[l] beräkna det lägre medianelementet för b[l + 1];:::;b[n 1] och a[0];:::;a[l]. ffl om a[l] = b[l] returnera a[l]. Vi visar även en implementering av algoritmen i Java. Den skiljer sig pνa nνagra punkter frνan den principiella skissen ovan. T ex sparar vi kod genom att utnyttja gemensamma delar hos det udda och detjämna fallet. Vidare är algoritmen in-place": vi använder särskilda variabler för att markera undre (a_lo, b_lo) ochövre (a_hi, b_hi) gräns för de delvektorer som algoritmen arbetar pνa vid ett visst tillfälle. Pνa sνa sätt behöver vi inte kopiera elementen ivektorerna.
int median(int[] a, int[] b) // Vet att 'a.length == b.length' int a_lo = 0, a_hi = a.length-1; int b_lo = 0, b_hi = b.length-1; } while (a_lo!= a_hi) int a_mid = (a_lo + a_hi) / 2; int b_mid = (b_lo + b_hi) / 2; if (a[a_mid] <= b[b_mid]) a_lo = a_mid; b_hi = b_mid; if (a_hi-a_lo > b_hi-b_lo) a_lo++; }else a_hi = a_mid; b_lo = b_mid; if (b_hi-b_lo > a_hi-a_lo) b_lo++; } } return min(a[a_lo], b[b_lo]); // (hνall intervallen lika stora) // (hνall intervallen lika stora) Algoritmen har komplexiteten O(log n) eftersom exekveringstiden i värsta fallet är proportionell mot antalet gνanger vi behöver halvera n för att komma till 1.