2013年9月26日 星期四

git fetch 不到 local repository 的物件

開發專案 Project1 建立了目錄 D:/project1
為了方便測試 Clone 了一個目錄 D:/project2

project1 有兩個 branch
master
(246899...)

其中 (246899) 是未命名的 branch

接下來想在 project2 測試 
1. git remote add p1 D:/project1
2. git fetch p1
3. git checkout 246899

這時候 git 會跟你說抓不到 246899 這個 tree object
原因是因為 246899 這個 temp branch 因為沒有命名
project2 fetch 的時候就不會抓過來

解決方法幫 246899 命名一個 branch 即可

cd D:/project1
git checkout -b develop 

2011年4月28日 星期四

[Introduction To Algorithms] 第九堂: Medians and Order Statistics



這一講的是一群元素中,不用排序找出第幾大的問題。


















一開始講的是同時找最大最小,需要花得比較次數,直覺想是 2n-3 次,但其實只要 floor(3n/2)-2 次即可。9.1 利用狀態機 model了 Min-max problem 的lower bound。 p4~p10.




這個問題是選i小的問題,不用用到 nlog(n)的時間。基本上是學 quicksort 的 pivot 比較大小,不過 pivot 要小心的挑 。
















9.3 就是講如何小心的挑,
先五個五個做 insertion sort,再找中位數,這是一個經典的演算法。























2011年4月11日 星期一

[Introduction To Algorithms] 第八堂: Sorting in Linear Time



一般 sort 都是以比較為基礎來討論的,首先討論的是 comparison-based 的演算法 worst case 的下限。


基本的觀念是建立一個 decision-tree model 來對應各種排序演算法。接下來再證明在 worst case 下至少要花Ω(nlgn) 的時間。 p3.~p.4






有了 lower bounds,接下來討論一些演算法是否符合需求, merge sort、Heap sort 符合需求 (quicksort worst case 是ο( n2))。 heap sort 因為 heapify 要跟左右子節點比較,所以會比 merge sort 比較的次數多。


那麼 merge sort 的比較次數是不是最佳的呢?  NO
接下來老師就補充,merge sort 和最佳次數的關西。  p.6 ~ p. 9


注意 p.8 用圖示簡單的示範了 5 個元素時的 "merge insertion sort" 演算法,個元素的插入順序很重要。




接下來討論到不是用比較為基礎的排序,老師一開始討論說 Radix 其實太輕忽了,其實實數、字串等也可以用 Radix 比較, Radix sort 的缺點是占空間,但效率很好。目前 C++ Library 的排序演算法是 IntroSort (quicksort 的改良版)。 




Counting Sort 有個重要概念、Stable,要達到 Stable 那麼輔助陣列要累加。


Radix 有分成 LSD & MSD 、LSD 比較實用,但兩個複雜度相同,用 LSD 時也就需要 stable counting sort。 p.15 利用數學歸納法證明了 LSD Radix 的正確性,基本上就 1...i 位數都排序,那麼 在討論 i+1 位數是否有排序。


分析了一下 LSD Radix Sort 有個很重要的觀念是如何切割....




p.17 有說明如何切割最好: r = lgn 時
     當 r 比 lgn 大或小時效能都不會好。


p.18 說明為什麼Radix會比較快,排序所花的時間主要是"看"的次數。 舉個例子: 考慮 16-bit 的整數有 216 個。Radix 只要看4次,而MergeSort要看16次。


這裡也做了一些假設,只排 unsigned integer,若是要比較 signed integer、string、real 也是可以,但要多做一些步驟。


p. 19 ~20 比較 signed integer (最後一部分相加在排)
p. 21 ~22 比較 string (用了 weighted index)






最後談到的是 Bucket Sort 有點 Hash Table 的概念。 這裡做了些機率分布的假設,假設平均分布。那 expected running time 為 θ(n)


p.26 做了簡單的 Correctness 證明




p.27 做了大略的分析




p.28 ~ p.33 做了詳細的證明





2011年3月29日 星期二

[Distributed Algorithms] 第三堂: Distributed consensus with link failures

這堂課講的是 Coordinated Attack Problem,
下面是 wiki 的網頁
http://en.wikipedia.org/wiki/Two_Generals'_Problem
說明兩個將軍要攻打第三方,只有兩方合作才能打勝仗,所以需要傳令兵來互通訊息,而傳令兵傳送訊息的過程中有可能被殺 = =
所以這問題基本上是無解。



  • Deterministic Version

這問題比較學術的說法叫做 reaching consensus,
這問題要符合 Agreement、Validity、Termination,接下來會用 indistinguish 的方式證明矛盾



  • Randomized Version
randomized version 的 agreement 是將犯錯的機率控制在一個範圍內。
兩 event 不知道互相發生甚麼事情,這也是分散式系統的本質。 (consistent global snapshot)
information flow 的概念也很重要!!

2011年3月28日 星期一

[Introduction To Algorithms] 第七堂: QuickSort

 QuickSort 雖然很熟了,但重點是在它的分析。


開始講之前,老師講了 merge sort 的變化 (分成三堆),第二種是分成三堆後用 priority queue 分析的方式排序,第二種感覺比較聰明的做法,但是複雜度反而變差,而這種情況當分成√n 堆時,priority queue 會複雜度會比較低。


Divide and Conquer 若是 master thm 派不上用場,最後都有大絕招,猜,然後建構式歸納。








經過分析,每一次 partition 的複雜度取決於基準邊的選取,如果每次基準邊都選到最大,那複雜度會到θ(n2) 。若是基準邊都挑很平均,那麼複雜度就是 θ(nlgn)














這是以結果論來看,我們不能夠很武斷的說,就是這樣啊~ 需要證明,用的方法就是把所有的 case 挑出來 (這種分析方式要好好學)。


值得提的是,若是基準邊是以固定比例來分,那複雜度還是θ(nlgn),跟一開始講的 merge sort 分三段一樣。






分析時先試著用直覺的觀念,考慮好壞交錯的情況,發現好壞交錯和最好的情況複雜度相同。






















接下來分析 randomized 的版本,在實務應用中,為了避免 worst case 發生,會用 randomize 的方式打散。














分析 best case 只要分析Ω就好,因為上界已經是θ(nlgn)了。
而此分析講義沒有列出,在習題 ex.7.4-2 當作練習。 (跟 worst case 分析ο類似)






worst case 的分析就很重要,先猜,再證明。
















這個證明利用到微積分的拋物線球極值的觀念。






















再來就是分析 running time 了
有兩種分析方式,這個作者用觀察的方式來證明,這樣證明比較簡單,而習題有傳統分析的方式。




















首先觀察 Quicksort 的特性
發現時間在於 Partition 中的比對次數。


所以可以假設 running time 等於,所有比對的次數。random variable 就派上用場了。










p.14 ~ p.17 用 indicator variable 估算出比對次數,這種解法要記!!




老師補充了第二種方式的證明。


p.18 ~ p.23


其中 p.20 頁課本直接用歸納證明,但 full-history recurrence 其實有經典的解法(前次項減後次項)








p.24 列出了一般教科書的解法。


















Quicksort 是個很重要的問題,因此有很多種分析方式,熟悉這些事很重要的!!




















接下來就用,







2011年3月27日 星期日

[Introduction To Algorithms] 第六堂: Heapsort

開始上演算法的應用了,講的是 HeapSort,Heapsort有兩個用途

  • 排序
  • Priority Queues 的實作
前面屬於資料結構的部分,Heap 的定義、性質、如何 maintain heap (heapify)





接下來討論到 Heapify 的 Running time 
書上直覺地導出上下界。 老師也補充了用 recurrence 的算法。  p.7 注意不能用θ表示。








再來才是分析 worst case(演算法分析要精確)


接下來談到 heap 的建立,也分析了 running time  p.11 ~ p.15
再來就是分析 Heapsort algo....







這裡用到一個 lemma 推導出 n 的 nodes 時,heap 的高度,原理很簡單,自己可以推出來。











這裡老師花了蠻多時間講,列出幾個點

  1.  O(0) 的意義
  2. 用到之前 rule of sum 等 theorem
我下課問了一下老師,為何可以 remove floor and ceiling = =" 這之前才學過 smooth fun 可以去 floor and ceiling !!



這段老師也強調了一下,畫線的那一段書上沒有說明,老師主要補充, lgn+1到 ∞ 那一段不是"master"。










heap build 分析完後,Heapsort 分析就很簡單了。 p.15~p.17


Priority Queue 不管是 max 還是 min 本質上都一樣。
接下來要分析 Priority Queue 運算的時間。
p.18~p.19
















注意 Heap-Increase-Key 這個運算,他其實只要θ(i) 就可以了但是對於整體而言,我們只關心 input size 是 n 時,複雜度是多少,因此θ(n)比較符合需求。












掰!!