2014年3月17日 星期一

102-2 PDSA HW4

HW4要讓大家畫畫圖,應該會很有趣!

1. 利用二維座標畫點


[goal]:利用StdRandom產生N個2D points (用Point2D的array來儲存),再搭配StdDraw把這個N個點畫出來(radius= 0.01)
  • 請大家練習使用Point2D這個物件,可以先宣告一個array來用
Point2D[] a = new Point2D[N];
  • 利用for loop產生N個點的x,y座標:呼叫StdRandom.uniform();
  • 練習用StdDraw畫圖 (把作者提供的StdDraw.java好好看看,有很多methods可以用來畫圖),如:
StdDraw.filledCircle(a[i].x(), a[i].y(), 0.01);
  • N=10的結果範例:

作者有幫大家寫一個存讀檔的功能:


按下File->Save,取檔名的時候加上合適的副檔名即可,如:e1.png

2. 將y座標最小的點用紅色標示


[goal]:練習使用compareTo,以及更換畫筆的顏色
  • HW4的第二小題是要練習呼叫sort,請在Point2D物件中尋找合適的compareTo()或Comparator使用,目的是要找到y座標最小的點
  • 改用紅色標示,可用StdDraw的setPenColor改顏色:
StdDraw.setPenColor(StdDraw.RED);
  • 結果範例:



3. 將所有的點,用其與紅點的角度排序


[goal]:練習comparator的使用
  • 參考作者投影片 p45-p47
  • 輸出範例 (請注意此時的點編號,後續輸出繳交批改系統的時候,請用此時的點編號)
  • 利用StdDraw.text()標數字的時候,可將y軸向上提高約0.03,避開黑點

4. 找出convex hull

  • 參考作者投影片 p58, p59, p60, p61
  • 畫圖範例

  • 請將能產生上圖的程式(MyConvexHull.java),繳交至ceiba
  • MyConvexHull這個class的main function會從args[0]得到N,然後產生亂數 + 畫圖
  • 上傳批改系統的MyConvexHull.java必須額外有以下function,這個function會吃進一個Point2D的陣列,回傳字串:0 1 2 4 7 9

  • public static String ConvexHullVertex(Point2D[] a) {}

Bonus


[goal]:Find the convex hull for each of the connected components (CC) in a set of N points



  • 綠線:兩點之間的距離<0.1 (表示兩個點之間距離太窄,無法通過)
  • 紅點:尋找convec hull時所用的p點 (y座標最小)
  • 黑線:convex hull (只有CC內的點個數>=3的時候才需要找convex hull)

2014年3月10日 星期一

102-2 PDSA HW3

HW3-1. (30 points)

[題目] Write a stack client Parentheses that reads in a text file (file name is specified through standard input, args[0] ) and uses a stack to determine whether its parentheses are properly balanced.

先開一個新專案(HW3),將作者提供的library加進來 (more)。

接著新增一個新的java source file (Parentheses.java),題目已經明說要用stack來處理這個問題,可以直接使用作者提供的stacks (e.g. LinkedStack, ResizingArrayStack),也就是說,這個作業直接寫main就好(把自己想成clients)。稍微比較一下LinkedStack.java與ResizingArrayStack.java的程式碼,兩個物件在宣告的時候都不用事先給stack size,也都接受generics (Generics: An essential characteristic of collection ADTs is that we should be able to use them for any type of data. more)。乍看之下,兩種implementation都不錯,優劣之處可參考作者的投影片p24)

就弄個String stack來用用吧! (也可以用Character stack試試)

接下來,從args[0]吃進檔名,開檔。檔案中應該只有一行,讀進來之後要切成一個個char。我是使用String物件中的toCharArray(),應該還有很多其他好方法。

實作過程中發現有幾個需要注意的地方:
  1. 程式離開前要檢查一下stack是否清空? 會影響true/false
  2. pop之前要檢查stack中是否有東西,避免產生exception

HW3-2. (55 points)

來到有名的Josephus problem。(可閱讀中文版比較有趣)

在這個作業中,要同時練習implementation (實作 circular queue),也要練習當clients (寫main)。

2014年3月4日 星期二

BLAST revisit

上星期(2014/2/26)又到醫學院講述序列比對的重要觀念與操作細節
回想起去年上完課後寫下的文章,把它翻出來與大家分享。

今年,想藉機會進一步討論BLAST的e-values。

讓我們先用以下序列(query)做個試驗:

>FASTA format
MAHTTSLLSGASSAAASPLSSRQYSVASSPRLSGDIGRGLFAIVVLLLRMSSVYGVIDRL VVQTSSGPVRGRSVTVQGREVHVYTGIPYAKPPLDDLRFRKPVPAEPWHGVLDATRLPAT CVQERYEYFPGFSGEEIWNPNTNVSEDCLYINVWAPAKARLRHGRGANGGEHSNKADTDH LIHNGNPQNTTNGLPVLIWIYGGGFMTGTATLDIYNADIMSAVGNVIVASFQYRVGAFGF LHLSPAMPGYEEEAPGNVGLWDQALAIRWLKTNAHAFGGNPEWMTLFGESAGSSSVNAQL VSPVTAGLVKRGMMQSGTMNAPWSHMTSEKAVEIGKALINDCNCNASLLSENPQAVMACM RAVDAKTISVQQWNSYSGILSFPSAPTIDGAFLPDHPMKMMETADLRGYDILMGNVRDEG TYFLLYDFIDYFDKDEATSLPRDKYLEIMNNIFGKVTQAEREAIIFRHTSWVGNPGLENQ QQIGRAVGDHFFTCPTNEYAQALAERGASVHYYYFTHRTSTSLWGEWMGVLHGDEIEYFF GQPLNTSLQYRQVERELGKRMLNAVIEFAKTGNPATDGEEWPNFTKKDPVYYVFSTDDKE EKLQRGPLEGRCAFWNEYLREVRKWGSQCELKPSSASSLQQKQQHLLLQQRSIVTFMLTL
SLVLGIPSVNAFF 
  1. 首先選擇 blastp + nr (13,279,552,322 bps)
  2. 再選擇 blastp + swiss-prot (170,826,989 bps)
  3. 再選擇 blastp + pdb (16,752,417 bps)
以搜尋結果中的human Acylcholine acylhydrolase (Swiss-prot ID: P06276, PDB ID: 2WIF:A)為例:

ScoreE-valueIdentAccessionDatabase
3978e-12739%2WIF_A (length: 529)nr
3972e-12738%P06276.1 (length: 602)swiss-prot
3971e-12939%2WIF_A (length: 529)pdb

可以看出,雖然alignment score都一樣(397),但e-value卻有數十倍到數百倍的差異。其差異主要來自於database的大小(nr > swiss-prot > pdb),一般而言,較小的database (e.g. pdb)會得到較小的e-value!

當然,如果看到上述這麼小的e-values,自然沒什麼好擔心的。但如果得到像0.01這樣的e-value,就要稍微注意一下。

接下再做另一個測試,假設我們只有局部的序列:

>FASTA format
CVQERYEYFPGFSGEEIWNPNTNVSEDCLYINVWAPAKARLRHGRGANGGEHSNKADTDH LIHNGNPQNTTNGLPVLIWIYGGGFMTGTATLDIYNADIMSAVGNVIVASFQYRVGAFGF

同樣用blastp對swiss-prot進行序列比對,這次對P06276的結果變成:

ScoreE-valueIdentAccessionDatabase
1035e-2545%P06276.1swiss-prot

這次,e-value變大的主因來自於score變小!

2014年3月2日 星期日

102-2 PDSA HW2

這裡是我做102-2 PDSA HW2的筆記,一共有三個部分:

HW2-1 Perform doubling test on 3-sum algorithms

  1. 先開啟一個NetBeans Project (需要幫助者,請參考 HW1的筆記)
  2. 先加入作者的library files (建議使用這個方式)
  3. 開一個新的source檔(MyDoublingRatio.java)
  4. copy作者提供的程式碼來進行修改
  5. 修改重點:class name需與檔名一致,constructor的function name也要一致)
  6. 照理說,這樣就可以直接執行了,可在MyDoublingRatio.java的視窗中,點選右鍵,執行'Run File',就會看到如下的畫面:

[註:'Run File'的意思就是執行這個java檔的main function,請注意,'Run File'無法吃進command arguments,如果有參數要用args傳進來,只能改用'Run Project')

如果你已經成功跑出類似的畫面,這時請注意看一下程式碼,main function中的for loop,理論上不會停止.....所以,等你覺得執行夠了,就按終止按鈕停下程式。

從上面的執行結果看來,所呼叫的ThreeSum的確是個N^3的演算法。這時或許你會覺得奇怪,你又沒有實做ThreeSum的演算法,這個東西打哪來的?

請打開作者提供的library瞧瞧:



往下一直看,應該能順利看到ThreeSum.java,不僅如此,作者還實做了進階版的ThreeSum,也就是ThreeSumFast.java,把它打開來好好讀懂程式碼。對HW2-2與HW2-3的程式撰寫會有很大的幫助。

找到ThreeSumFast.java之後,請修改MyDoublingRatio.java來看看ThreeSumFast的時間複雜度吧!

Note 1: 過程中可沒想像中的順利,你應該和我一樣,碰到 "array contains duplicate integers"的exception的吧!? 仔細看一下作者寫的ThreeSumFast,的確有做duplicates的檢查,請思考一下為何需要做檢查? 在HW2-1的繳交報告中討論

Note 2: 為了能順利進行ThreeSumFast的時間分析,請利用作者準備的測試資料:

  • http://algs4.cs.princeton.edu/14analysis/1Kints.txt
  • http://algs4.cs.princeton.edu/14analysis/2Kints.txt
  • http://algs4.cs.princeton.edu/14analysis/4Kints.txt
  • http://algs4.cs.princeton.edu/14analysis/8Kints.txt
請修改你的MyDoublingRatio.java,不要讓程式自動產生資料(a[i] = StdRandom.uniform(-MAX, MAX);),改成用讀檔的方式吧! 你在HW1中學過了!

Note 3: 過程中,你將會非常訝異地發現,1Kints.txt還是有duplicates (至少我真的非常驚訝,承認這個事實之後,只好將其中重覆的數字找出來,修改一下)。請用編輯器打開它,將其中一個320032改成320033,應該就可以順利執行了。

Note 4: 撰寫HW2-1的過程中,可以特別練習一下static的用法,思考一個function加了static之後的意義為何? 使用上有何差異?

HW2-1需以報告的方式繳交到ceiba。報告請以word撰寫,內容以不超過一頁為限,請將執行結果數據做成圖表(log-log plot)後呈現並討論

HW2-2 Develop a liner algorithm for 2-sum problem 

  • 新增一個新的source檔 (MyTwoSumFast.java)
  • Your class should have the following API:
public class MyTwoSumFast {
    private static boolean haveNotSorted(int[] a) { }
    private static boolean containsDuplicates(int[] a) { }
    public static int count(int[] a) { }
    public static void main(String[] args) { }
}

Note 1: 如果count函式發現讀進來的數字並未從小到大排列,請丟出exception (優先於下一個exception):
throw new IllegalArgumentException("array has not sorted in ascending order");

Note 2: 如果count函式發現讀進來的數字有重覆,請丟出exception:
throw new IllegalArgumentException("array contains duplicate integers");