[理工] 算法 林立宇讲义练习题

楼主: mistel (Mistel)   2019-09-02 00:57:30
第13题,divide&conquer
题目
https://i.imgur.com/Q1Vn4K5.jpg
我的写法
https://i.imgur.com/Wkwzcd4.jpg
主要是想问
1.我这样的答题格式可以吗?
2.我发现上面105年交大他有可能找不到最大值,所以试着修改了一下,但发现我的写法wor
st case会变O(n),这样扣分会很严重吗@@
还是我完全写错了...?
感谢问题板
作者: mathtsai (mathtsai)   2019-09-02 01:11:00
1.设计算法不是要你写程式没有人喜欢看程式 应该用文字&图 说明你的方法2.你的写法是错的 举例 7 8 1 2 3 4 5 61<2 但是你却会去找右半边 这样是不对的观察一下每次二分搜的时候会有什么性质这题是十分简单的题目然后啊 如果你的code真的这样写 会喷error理由是mid-1,mid+1不一定能在Arr的宣告里面应该要加一些边界判断之类的 (mid=1,mid=n => 回传mid)
楼主: mistel (Mistel)   2019-09-02 07:50:00
我又忘记加上bound check QQ
作者: JKLee (J.K.Lee)   2019-09-02 08:06:00
先把array的头尾接在一起形成一个环要把环分开成两个部分要切断两个点你的算法23451会出错先暂时不要去想array的index。如果有一个环,环上的数字已经sort好了,你会怎么找最大的数字?
作者: Ricestone (麦饭石)   2019-09-02 12:58:00
你新的想法没错吧,就是每次都看这一半正不正常差在该怎么停下来,所以确认mid是不是断点,断在左边还是右边
作者: mathtsai (mathtsai)   2019-09-02 13:38:00
新的一样是错的 4 5 1 2 就错了然后你新的写法一样是在写程式
作者: Ricestone (麦饭石)   2019-09-02 13:39:00
就是要先确认断点啊
作者: mathtsai (mathtsai)   2019-09-02 13:42:00
分成一些case写下来 (1)...(2)...(3)...条列式就能说明你的方法了 教授也一目了然这题如果我没猜错 元素应该都不能重复不然 1 1 1 1 1 1 1 1 1 5 1 这样子根本不能二分搜
楼主: mistel (Mistel)   2019-09-02 14:46:00
我懂了,我应该再检查mid这个点的左右邻居,确认最大的点我会记住用这种答题方式答题,感谢m大J大跟R大!!!!
作者: mathtsai (mathtsai)   2019-09-02 15:04:00
不对 你的回答表示你没有懂还是不对啊 7 8 1 2 3 4 5 6 这个例子一样不会过你可以动手举几个例子看看最大的在左半和右半的时候 会有什么样的性质
作者: Ricestone (麦饭石)   2019-09-02 21:19:00
为什么又跑回去了?判断该往哪一半就是你前一个想法啊停止条件就是mid左右有没有断点,断点就是后面比前面小如果到最后都找不到就是没断点(也可以一开始就判断)反正不管是哪个部份,左端比右端小,数列就是正常判断mid左右有没有断点,其实就是在确认子数列的端点有没有发生断点
楼主: mistel (Mistel)   2019-09-03 08:44:00
好的,了解,要判断的是mid左右是不是有断点
作者: mathtsai (mathtsai)   2019-09-03 14:13:00
我觉得"判断左右"这句 你又要跑去检查+1,-1了...把数列切半,观察哪一半有发生左端比右端大的状况如果左右都没有这种状况,代表左右都sort好了那么左右两半的右端比较大的就是最大元素哪一半的左端>右端,就继续递回找那一半短短几句话不就解决了吗...
楼主: mistel (Mistel)   2019-09-03 14:53:00
真的太菜了QQ我理解这个问题会发生的状况跟性质了 感谢你
作者: Ricestone (麦饭石)   2019-09-03 16:24:00
检查断点跟一次两子列都检查是两种不同的做法而已只是只检查左子列+判断左断点跟一次检查两子列的差异

Links booklink

Contact Us: admin [ a t ] ucptt.com