2012年2月16日 星期四

資料結構作答技巧

這次...有人寫信給我啦!真的很開心!因為有人寫信問我我才有梗可以寫~再次澄清,沒更新絕對不是我偷懶,是因為沒梗可以寫
(謎之音:是嗎?)

這次的問題是來問資料結構作答技巧的

大概上的問題是這樣:(為保護原po稍有修改)
他說他看到假設一個題目是叫你寫放入(push)一個堆疊(stack)元素的做法,老師(補習班老師?)說如果是演算法就可以用中文寫,因為他怕寫程式會寫錯,所以他問我說可以像這樣寫中文嗎?
放入(push)元素進入堆疊(stack)
(1).將堆疊的頂端指標移到最上方的元素
(2).將此元素放入堆疊的最上方

這個問題問的非常好!是個大哉問阿!

首先呢~我必須要告訴你,假使題目真的這麼問,你真的這樣回答,很殘念的,你拿不到高分,即使答案都是對的~為什麼呢?


你弄清楚題目要問什麼了嗎?題目上寫演算法、虛擬碼、程式碼,要回答的答案,是不一樣的

首先,你要先知道一件很重要的事情,就是上面那三種問法,會得到三種不同的答案。
在我們這一行(?),演算法、虛擬碼、程式碼,是三種不同的事情。

1.演算法就是做一件事情的方法,最為粗糙。
打個比方就是,如果你要追一個美女,首先你要知道美女喜歡的男生類型是什麼,如溫柔體貼帥氣之類的。
以push stack這件事情就是:
放入(push)元素進入堆疊(stack)
(1).將堆疊的頂端指標移到最上方的元素
(2).將此元素放入堆疊的最上方
(3).結束
這團東西就是演算法,因為他很粗糙,所以可以用中文或英文寫,但是很不爭氣的,用英文會比較高級,不過不必勉強,因為寫中文不會扣分,得分重點也不是在這裡,我們後面會講到重點要放在哪邊。

2.虛擬碼做一件事情的步驟,比演算法還精細。
用上面那個追美女當例子的話,就是你要知道溫柔體貼帥氣,展開來會變成:我在美女傷心的時候很溫柔、跟她說話很溫柔、出去逛街很體貼之類的事情。

以push stack這件事情就是:
我們以array來實做一個stack
結構是
         top  
         ↓
┌─┬─┬─┬─┬─┬─┐
│3 │5 │- │- │- │- │ array a
└─┴─┴─┴─┴─┴─┘


 push(element x)
(1) top++;
(2) a[top]=x;
這樣長的四不像的程式碼就是虛擬碼,他長得很像程式碼,可是不能跑,最好寫英文
你不用擔心能不能跑的事情,因為老師知道它就是不能跑,但接近程式碼的樣子。

3.程式碼做一件事情的詳細步驟,最為精細,必須轉換成如同我們知道的C,Java,可以確實執行,而且跑得動的。
以追美女當例子的話,就是比如體貼的表現就是,在她生理期買紅豆湯:
(1).你要知道他住哪
(2).紅豆湯哪裡比較好吃
(3).載紅豆湯的時候要有技巧不能打翻
等等諸如此類。

以push stack的例子:
             top


              ↓
┌─┬─┬─┬─┬─┬─┐
│3 │5 │- │- │- │- │ array a
└─┴─┴─┴─┴─┴─┘


//java code
void push(int x)
{
    top=top+1;
    a[top]=x;
}

上面這團東西叫做程式碼,絕對要可以跑得動的,所以你要順道告訴老師,你是用哪種語言寫的,像我的例子就是用java。

所以,咱們整理一下:
精細程度:程式碼(code) 大於 虛擬碼(pseudo code) 大於 演算法(algorithm)
不能跑得動:演算法、虛擬碼   可以跑的:程式碼


要怎麼回答,跟題目有很大的關係

現在你對這三種有一定程度的瞭解了,可以回到題目來看了。
如果題目問你程式碼,你回答演算法或虛擬碼,絕對會被扣分的,因為不夠精細。
相反的,如果題目叫你寫演算法,你只寫程式碼或虛擬碼,這樣也不夠正確,因為老師不想看的那麼細。仔細想也知道,考卷有很多,他沒時間幫你看你的程式碼有沒有寫對。

那要怎麼回答呢?
那當然是問什麼你就回答什麼。(好像廢話?)
問你演算法,你就回答演算法;問你虛擬碼,你就回答虛擬碼,很像程式碼但可以不用考慮會不會動;問你程式碼,你就要想辦法讓寫出來的程式碼能動。
雖然很像廢話,不過大部分的人都會寫太少,少部分的人會寫過多,過於精細。重點,其實都不在這邊。

重點:寫完後要舉例

這句話是拿分的重要關鍵,如果你寫的很完美,就算你照補習班教你的背出來,如果沒舉例,分數絕對很低,因為老師根本不知道,你到底知不知道。
我記得以前我的朋友,他的資料結構某題很低分,明明就寫對演算法,可是教授不給他對,他跑去跟教授要分數,教授跟他說:因為你沒舉例,你不舉例,我怎麼知道你會不會?

以push stack來說,好的解答多半會在後面附上舉例說明:

1.問你演算法:
答題:
放入(push)元素進入堆疊(stack)


(1).將堆疊的頂端指標移到最上方的元素
(2).將此元素放入堆疊的最上方
(3).結束
例如:
        top


         ↓
┌─┬─┬─┬─┬─┬─┐
│3 │5 │- │- │- │- │ array a
└─┴─┴─┴─┴─┴─┘
(1)
             top


              ↓
┌─┬─┬─┬─┬─┬─┐
│3 │5 │- │- │- │- │ array a
└─┴─┴─┴─┴─┴─┘


(2)


             top
              ↓
┌─┬─┬─┬─┬─┬─┐
│3 │5 │x │- │- │- │ array a
└─┴─┴─┴─┴─┴─┘

紫色的部分就是增加舉例的部分。

如果問你虛擬碼跟程式碼也是這樣舉例。
你把我的舉例遮掉,如果沒有後面舉例,你看得懂我的中文在做啥嗎?好像很難。可是你舉個例子,老師就知道你會不會了,而且我還做得跟四個漫畫一樣,老師只要幾秒鐘,就可以了解了。
聰明人看到這裡就知道下次要怎麼舉例啦!這種有步驟的就是弄個跟漫畫一樣就對了!

你有沒有發現,補習班的講義,在演算法後面,一定會附上例子,為什麼要附上?因為他要講解給你聽,如果沒附上,你怎麼會懂呢?
看到這邊你應該知道要怎麼回答問題了,結論就是人家問什麼,你就答什麼,但是要記得舉例。


QA時間

Q1.我英文很爛,不想寫英文可以嗎?
A:當然可以阿!不過你要像我一開始一樣,第一次出現專有名詞的中文時,要在後面括號寫英文。
例如:堆疊(stack),放入(push)
很抱歉最好英文要背起來,不然從國外留學回來的教授們真的很難理解,為什麼stack要翻成堆疊,他很難聯想。

Q2.叫我寫程式碼我實在很怕寫出來不能跑。
A:只要長得像程式碼就好了,不用管他實際上跑的細節,如import,include這些其實你不用去管,因為說實話,教授不會寫程式的居多
記得:程式碼是多寫多錯,少寫少錯。(跟公務員心態很像?)
但是我這邊是說程式碼喔!不是註解,非程式碼的部分可是寫越多越好呢!

2012年2月2日 星期四

考試迷思系列──對於錄取率和報名人數的看法

對於錄取率和報名人數的看法
之前那幾篇還真不是普通的長阿~
自己都沒料到會寫那麼多
有夠囉嗦的XD
這篇回歸大家最喜歡(?)的迷思系列
換來講一下對於錄取率、報名人數應有的態度吧!

首先,照慣例,問大家一個問題:
每次考試前,總會公布總報名人數和錄取率,你們是怎麼看的呢?
假設有一個考試:
報名人數是3000人,
錄取人數是30人,
所以,錄取率是1%
(以上假設的數字蠻接近真實數字的吧?XD)

你是不是會有以下的想法:
1.錄取率好低喔!不知道這次我會不會運氣比較好,剛好題目都出到我會的,別人不會,就矇到了
2.錄取率好低喔!100個人中才有1個中,我怎麼可能是那個幸運兒?這次應該考不上了吧!
3.報名人數好多喔!別的考試才幾個而已!跟以前的國考比,真的變好難,為什麼我不提前幾年考?
4.報名人數好少喔!運氣好一點應該就可以上了吧?
如果你有以上的想法,可能你真的需要重新認識一下有關錄取率和報名人數這兩個數字的意義。


不需在意錄取率和報名人數

我從小到大考試,從來不會在意錄取率和報名人數,
就算有人跟我說,我也一定會馬上忘記。
我一直認為,那是給沒有參加卻關心(or好奇?)這個考試的人看的
為什麼這麼說呢?
所謂的錄取率,是錄取人數,除以報名人數,
比如說像上例的1%,便是這樣計算的。
這個數字的解讀,
不管是媒體,還是從小到大的老師,
會教你這樣看:100個人中,會有1個人錄取。
這麼看起來,似乎這個考試很難,
就跟中樂透彩券一樣不容易。(當然樂透的機率更低)
事實上,這個解釋根本就是不對的,
考試根本不是從100個人裡面,挑1個人出來。
以上面這個例子來說,
是3000個人下去排名,
只取前30名,
換句話說,
對於排名後面2700名考生,錄取率是0%,
對於排名前面30名考生,錄取率是100%。
換句話說,
只要你實力排名在錄取名次內,
你就會考上,錄取率是100%。


考試又不是機率隨機抽獎,沒有照輪上這種事情

我常常聽到有人說「考上照輪論」
意思就是說,考久了總有一天會輪到你,
就像「戲棚下站久就是你的」是一樣意思。
但是,這句話的本意是指說,
你只要夠努力,累積一定的實力後,就會輪到你了。
而不是說:僥倖碰碰運氣隨便念念看,說不定這次就輪到我上了!
考試又不是抽獎,如果說真有這種事情,
那神明應該會去獎勵認真念對書的人,
讓認真念書的人上,
也不是讓僥倖碰碰運氣的人上。


錄取率和報名人數,是給外人跟媒體看的

那還要錄取率和報名人數做啥?
當然這兩個數字有他存在的意義,
根據我觀察這麼久,
這兩個數字最大也最常用的用途,
是讓大家在茶餘飯後,聊這個考試有多難用的。
比如說,如果你說你在考國考,
可能你的親朋好友會跟你說:
「現在國考很難耶!錄取率很低喔!只有1%耶!
100個人中才1個中,我看你考不上啦!」
又或者是落榜後別人安慰你的藉口:
「反正錄取率那麼低,沒上也是應該的啦!」
更差一點,甚至還有人拿來當作自己沒上的藉口,跟家人朋友說:
「我這次沒上是因為錄取率真的很低,你們有看新聞也都知道的阿!」

希望你不要被以上這些話還有想法影響,
因為這兩個數字的用途就只在這邊,
想要考上,只需要在意一個數字,
那就是:這次錄取幾個人
你只要想辦法排名在這個範圍裡面,錄取率就是100%
如果你沒辦法接近這個排名,
那就純粹是你實力還不夠
這樣而已。


考試落榜,不需氣餒,如果還想考,看自己的排名與成績,檢討自己的念法即可

這麼說來,考試落榜,根本不需要難過,
因為這就是你實力未到而已。

我之前曾經提過:考試不是考試,而是反映你念書的方式正不正確。
換句話說,如果你念書的態度、方式是合乎這個考試的,你就會拿到高分。
相反的,如果你方式錯誤,就會拿到低分,
也就是表示你必須要調整念書方式,
不然你怎麼努力念也不會高分。
這個觀念很重要,適用於各種考試,
我以前跟我的家教學生也這樣教。

從小到大,我觀察過太多很認真,卻念不好書的人。
相反的,也有像我這種看起來沒在念書,
好像都不怎麼努力,成績卻都很好的人。
有人可能會覺得這是天賦上的差異,
事實上不是這一回事。

我發現我跟我的同學最大的差異是:
面臨一個新的科目,
我會去「研發」各種可能的念書方式,
藉由一次一次不同的小考、段考,
來檢討自己這樣念的方式有沒有效、是不是最省時又可以達到最高分。
如果成績很差,我也不會責備自己,
我只會覺得:「那是我念書的方式錯了」這樣的想法而已。
然後我會去調整,換另一種方式念書。

至於念書的方式,
真的不像你想的,就是呆呆坐在那裏「看書」,
念書的方式,非常多元化:
可以自己當老師,上台教自己;
可以錄成mp3,無意識的聽;
可以轉換成圖表,幫助記憶;
你可能看過有些人念書很「吵」,
需要所謂的聽說讀寫五感一起念,
就是指這件事情。

什麼方式不重要,
重點是成績出的來,
你自己又能接受就可以了。

記得,如果要很「吵」的念書,
千萬不要去圖書館吵人,
麻煩請自己在家裡關起房門玩,
免得被人當成瘋子XD。


不要太在意考試,還有成績

既然你已經知道:
「考試的成績是反映你念書的方式正不正確」這樣一個觀念後
希望你下次去考試就不會再那麼緊張了,
因為你只要準備方式不對,就不會取得高分,
你來考試,就是為了測試自己的念法對不對

成績,雖然重要,不過就算很低,
排名很後面,也只告訴你一件事情:
你念書的方式錯了

你只需要去找這次考試考上的人,
他們自願po出來的各科成績,
比較你跟他們差在哪裡,
哪一科特別爛,
表示那一科你念的方式錯了,需要調整。

如果你實在不知道要怎麼念那一科,
你可以去問已經考上的人,
相信樂意幫你診斷的好心人非常多,
不需要再自怨自艾、懷疑自己、怨天尤人了!


多安排幾場考試,當做模擬考,藉此檢查自己的念書方式

所以你可以在我的文章裡面,看到我都會建議大家多考試,
就算那不是你的主力想考的也沒關係!

每年考試的風向都略為不同,
如果你有志要考某一個考試,
那當年之前的相關考試建議你都要參加。
比如來說你想要以高考為主力,
建議你可以參加的都參加,
如:前一年的地特、當年的關務特考、警察特考、鐵路特考等等
只要考科大部分重複,你都可以參加,
至於高考沒考的科目,就不需要特別準備了,那是浪費時間。
拿到成績,不用在意自己有沒有上榜,
只要看你的成績,跟上榜者的差異,
就知道你有沒有念對了。

沒安排模擬考,只賭一次的機會,
真的很危險,你只能猜猜看,
這次的考試大概要用什麼方法念,
要是猜錯了,那就只能明年重來了!
我是覺得這樣賭太大了!你覺得呢?

我每次說這種說法,
總有些人會跟我反駁:
覺得我老是占人家的缺,
考上了又不去,幹嘛去占人家的缺。
我都會回他:
考試又不是比賽誰比較仁慈,誰就會上榜,
更何況我實力又不一定保證我會上榜。

聽說有句老話是:你對敵人仁慈,就是對自己殘忍?!XD


給只差0.x幾分,還有差幾名就上榜的考生:真的沒什麼好難過的!

相反的,你應該要很開心才是!
有很多人會覺得這樣很衰,
可是我「每次」這樣都會很興奮。

你沒有看錯,我不是沒遇過這樣的狀況,
反而是我遇過太多次了。

某次我只差0.x分,就上高考二等。
後來,我隔年就以第二名錄取。

某次我只差一名,就上關務特考。
如果是你,看到錄取4個,成績單上面寫你第5名,不知道你會有什麼感想?
很多人應該會大哭一場吧!
我的反應卻是:很開心耶!
因為那代表我有那個實力考上了!
而事實上,隔年我就以第一名錄取。

所以,下次你再遇到這種狀況,沒什麼好難過的,
代表你要考上了耶!
你應該要超有信心,超興奮的才是!!

如果你只差一點點,
表示你已經具有實力,
繼續保持即可。
神明讓你這次沒考上,
自有祂的用意,
比如說這次的缺不適合你,
或者下次考試的缺更好之類的,
祂是在保護你。
有一天,你會發現祂的用意。