2015年5月17日

[隨筆] 失落

因為事情的不順遂,所以失落
因為有所期待卻一再落空,所以失落
因為不如預期卻又不知原因,於是不停的鑽牛角尖還爆發了各種小劇場
也許一切都只是過度的妄想的猜測,但無法排除的可能令人憂心
也許時間過去會恢復原樣,但看不到終點的不確定感令人焦躁

只能等了,等著期望中的未來來到,期待一切的一切終究是過度的猜想

2015年5月16日

[品茶] 大吉嶺 - 凱瑟頓 夜光白玉 春摘

大吉嶺,印度靠近喜馬拉雅山那一塊,海拔相當高,因此植物的生長也較為緩慢,也較多水氣,故大吉嶺的茶葉相較於其他種類的紅茶通常具有較多芳香物質,因此大吉嶺的一大特色就在於他那相當迷人多變且細膩的香氣。這次嘗試的目標是凱瑟頓莊園的春摘,等級是夜光白玉。

2015年5月13日

[演算法] A Progressive Network-Flow-Based Heuristic for Finding Minimum Cost Clique Partition

 minimum clique partition (MCP) 探討的是如何將一個無向圖 (undirected graph) 分成最少數量的 clique。若是無向圖上的邊具有權重的話,並且最少數量的 clique partition 有好幾組的話,則此問題要找的是所有 clique 上的所有邊的權重總和要是最小的那一組。因為這是個 NP-hard 的問題,因此若非一定要找出最佳解 (optimum solution),一般將採用 heuristic 的方式找出一組次佳解 (optimal solution)。這邊要介紹的是基於 progressive network-flow 的方法找出一組解

2015年5月11日

[C++] The Previous Element of vector::begin() Is Not vector::end()

在使用 STL 的 container 時,相信類似以下這段 code 的片段不是什麼很希奇的事情
std::vector<int> vec;
// blah blah blah
if (--iter != vec.end()) { /* blah blah blah */ }
很顯而易見的邊緣判斷,當 iterator 已經是指向最一開頭的元素時,想要再往前存取前一個元素時就該停止了

不過這段 code 在一個特定的情況下會失效,就是當 iter == vec.begin() 時!沒記錯的話這問題發生在把 container 從 list 換成 vector

原因其實也不難懂,vector 底層的實作是 array,換言之 vector iterator 一般來說在其底層就會是個 array pointer。所以只要用 array pointer 的觀點來想就會知道為什麼那段 code 會有問題囉。

而 vector 因為底層是 array,但又需要能夠動態增減其大小,因此還會有 iterator validity 的問題 (確切一點的說法是所有的 STL container,但是 vector 最容易遇到),類似這類的問題第一次遇到大概得要花上個數小時找問題吧...