[理工] 105台大电机 非选4 参考答案

楼主: jimmylin1024 (wiseman)   2020-12-12 11:38:21
板上没找到解答 就自己写了一个 希望可以抛砖引玉 想问板上大神们有没有想到时间复杂度更低的解法呢?
题目如下:
https://i.imgur.com/ncMbVkF.jpg
参考解答:
https://i.imgur.com/sHvMN1T.jpg
作者: CSGD (BinYu)   2020-12-12 12:48:00
如果用min heap, find-min可以降到O(1), build可以降到O(n)不过我是用nxn matrix, min另存, 这样每次更新需检查2n-1个entry
作者: mathtsai (mathtsai)   2020-12-12 12:52:00
1.建好n^2个f(x,y) -> O(n^2)2.用这n^2个元素建立heap -> O(n^2)3.m次操作 会更动m*(2n-1)个decrease-key -> O(mnlgn)
作者: CSGD (BinYu)   2020-12-12 13:06:00
我nxn没有建heap, 只有存matrix, 每次改值只在更动到的(2n-1)个entry找最小和目前的min比, 我自己推是O(mn), 还是哪里想错了呢QQ
作者: mathtsai (mathtsai)   2020-12-12 13:12:00
matrix一开始用完就丢进heap里了 要改都在heap改
作者: CSGD (BinYu)   2020-12-12 13:16:00
所以我没有要建heap...只是2d array
作者: mathtsai (mathtsai)   2020-12-12 13:35:00
C大 m次更动中有可能改到最小的元素 这样要怎么找min?
作者: CSGD (BinYu)   2020-12-12 13:51:00
对...那应该还是要用n个heap才对,感谢!
作者: joywilliamjo (joywilliamjoy)   2020-12-12 14:23:00
我是写建立min-heap欸,这样找min都是O(1),n个就O(n),insert/delete也是O(nlgn)
作者: asd3136396 (新化王阳明)   2020-12-12 14:41:00
我的想法是先建出nxn的元素然后放进Fibonacci heap O(n^2)更改一次decrease-key O(2n-1)共m次O(mn)total(n^2+mn)这样想不知道有没有错
楼主: jimmylin1024 (wiseman)   2020-12-12 15:02:00
感谢各位大大!a大用Fibonacci Heap时间复杂度没错。 原本我卡的点是在做decrease key之前要先search这个element ,会是O(n),所以才转而可虑用AVL。不过后来想到可以用hashmap 来记录各个点的在heap中index 位置,这样Fibonacci 的decrease key就可以amortize O(1)整体time complexity 就会是O(n^2)m更新的话就会是O(mn)
作者: mathtsai (mathtsai)   2020-12-12 23:12:00
喔喔 Fibonacci heap时间当然快(?

Links booklink

Contact Us: admin [ a t ] ucptt.com