[理工] 演算法 林立宇講義練習題

作者: 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