星期六, 1月 19, 2008

hashtable的簡單實作

讓我們談談如何實作一個簡單的hashtable

嗯,剛好我最近在複習怎麼玩C++的STL,也有學弟問,我想可以討論一下hashtable怎麼使用C++實作。由於學弟妹皆沒有template的概念(這是很可惜的一點),所以我們就不用template啦。

首先,我們大概說明一下hashtable,大概需要怎麼樣的資料結構

  • hashtable(廢話XD)
  • linked-list
  • dynamic array
以這一次學弟妹問到的bookmark為例,如果我們要做一個hashTable,那麼我們會希望有一個array,來儲存整個hashTable,所以我們會寫如下的程式碼
class bookmark_hashtable{
public:
bookmark_hashtable(int s);
/* ... */
private:
int _size;
bookmark_linklist* u;
};

bookmark_hashtable::bookmark_hashtable(int s=57){
/*
* 當決定整個array的size之後,隨之動態分配一個新的linkedlist array
* 每一個array element 皆為 linkedlist,而array index即是自己需
* 產生的hash value。
*/
_size = make_next_prime(s); // int make_next_prime(int num)並未定義,自行撰寫XD
u = new bookmark_linklist[_size];
}

bookmark_hashtable::~bookmark_hashTable(){
/*
* 當object life time end,記得delete dynamic array
*/
delete [] u;
}


這時候就興起一個疑問了,bookmark_linklist從那裡來,呃,基本上第一份作業有關url的實作,稍做改變即可,不過基本架構如下。
struct bookmark{
/* ... */
};

struct bookmark_node{
bookmark data;
bookmark_node* prev, next;
};

class bookmark_linklist{
public:
/* ... */
private:
/* ... */
bookmark_node* start;
};


那麼我們還需要做什麼? hashTable的架構已經完成了,接下來就只有增加功能,如果bookmark_linklist的功能寫的足夠,bookmark_hashtable應該都能直接支援。例如說

void bookmark_linklist::add_data(bookmark data){
/* ... */
}

/* 如果bookmark_linklist::add_data已實作之則我們可以寫 */
void bookmakr_hashtable::add_data(bookmark data){
int index = hash_value(data);
u[index].add_data(data);
}


匆促之下臨時寫成,有問題歡迎多多討論XD

---
還是有template比較好玩XD
08/01/19 05:58PM 聽說很多學弟妹對linked-list不熟,我想起來我以前寫過XD

星期五, 1月 18, 2008

計畫

寒假計畫好像很簡單,就三本書吧XD

  • Introduction to Algorithm 2/e
  • Computer Orgranization and Design: the hardware and software interface 3/e
  • C++ Primer 4/e 中文版(基本上是當故事書看,如果寒假拿的到的話XD)


就這樣,希望能開一連串的連載嘍XD

---
希望不要跳票 XD

星期四, 1月 17, 2008

寒假

開始啦,不過很多事情尚未確定,預計的計畫都是讀書,所以暫緩po出XD

星期二, 1月 15, 2008

以後再說

看到學弟妹的版上說一個學期五次作業很多...? 我自己試程式的次都遠遠超過

---
算了,考完再說...Orz

星期一, 1月 14, 2008

早晨

其實現在也不算早了,只是剛好這是期末考前的空檔XD 天氣轉冷的當下,其實很怕自己睡過頭XD

有時候仔細想想,每個人總是會有想把自己的事做好的時候,有人做好了,有人做不好,心有餘力而不足的事其實常發生,對我而言,其實這算不了什麼,我有些科目可以high pass,有些科目可以被當掉,我可以玩VHDL玩到整夜沒睡,我也有翻到書就掛點的記錄。

學生的最大好處就是,學校允許學生犯錯,但是不代表可以一直犯錯XD,應該是說,當我們在做多種嘗試時,可以由於很多因素犯了錯誤,進而學習,到了社會,可能就沒這個好處了。所以在我們當學生時,記得多嘗試,多學習,多接觸不同的人群,我覺得這樣子還蠻有趣的。

事實上PageRank升到1我還蠻高興的(看清楚,我沒有廣告XD),因為總覺得很平凡的自己,可以因為這個blog認識更多的朋友,從以前到現在,我還蠻喜歡抽學伴的(交了女朋友之後也是XD),因為我從他人身上,看到不同的人生(我只是愛聊天XD),不然我怎麼可能知道,政大無熱水XDDD。

有時候常常在想,我做的跟資工無關耶,我要不要改行當張老師算了XD DJ也不錯,還是,無業遊民每天嘴炮 XD

就算閒聊一下嘍XD

---
早起會讓心情好一點~

星期六, 1月 12, 2008

YUI


這是一個日本歌手,從Music Static 2007.2006 SuperLive 看起來很安靜的樣子,但是一看她演唱起來,整個人有亮起來的感覺,這次因綠際會,聽到她的第一張專輯 FROM ME TO YOU ,聽她的歌不能只聽太陽之歌喔,她可是有很多歌可以聽的,推薦 Merry Go Round(FORM ME TO YOU), CHE.R.RY(Can't Buy My Love)

---
我不懂日文,別問我歌唱什麼XD

Page Rank


這個是Josh的pagerank,我覺得有這個分數是很正常的事,恭喜恭喜,然後接下來是....
這是怎麼一回事...Orz 我又做了啥壞事了XD

---
開始懷疑pagerank了XD

星期五, 1月 11, 2008

小聊一下

雖然我不是頂認真的做知識管理的CMS,但是如果使用XAMPP + Drupal ,的確可以很輕鬆的把CMS架好,讓架好一個CMS的付出成本降至極低。

anyway,架站那麼容易了,架CMS的重點是什麼呢? 是你想讓這個CMS所扮演的角色,我蠻認同老師在課堂講的一段話

Web 2.0是以使用者為主的應用,但說穿了,這是將Client-Server架構發展到極致下的結果。

結果是一個很簡單的,當我看到PC World上的年度最讓人覺得失望的科技,Social Network名列第八,倒也不是一個讓人覺得太訝異的結果。只是發展到一種極致,我的興趣不是網路,不然以我不怎麼靈光的腦子來思考,網路的下一個未來在那裡? p2p似乎還是存在一點問題,並不是每個人都有固定的實體ip,只要這個問題存在,Server還是有必要存在的,但是如果每個人都有實體ip,具有不可變更性的話,你在網路上的所做所為是受到監控的,每個人該不該有自己的ip也是一個兩難的問題,誰喜歡被監控呢?

回到正題,當我們架設CMS時,定位是什麼呢,我跟老師說的是,我不想做大眾市場,市場機制很早就證明,把市場做大不一定會賺,但是如果做出市場區隔,或許可以保有一定的活力,所以我跟老師說了,該做的CMS是小眾的固定的,知道對方是誰的,和現有的存在CMS大異其趣。有一個原因是,被人做爛了,還有一個很大的原因是,當把一個知識市場做大時,貢獻的相對比例就降低了,如果不考慮從中獲利的因素,我比較喜歡小眾市場。因為一旦把市場做大時,就有人想要從中建立屬於自己的影響力,在小眾市場中,比較不需要這樣子的角色。

台灣的獨立音樂,就是一個很好的例子,看起來很小,但是加以分析,可以從中得知,如果可以做到一定的市場分隔與規模,獲利百分比不見得會比流行音樂來的低,如果今天獨立音樂有著一群有著mp3仍然會買正版CD的人,跟流行音樂,大家抓就好的人而言,我相信獨立音樂買CD的人較多,與其阻擋盜版,不妨試著建立屬於自己的市場,消費者是可以被教育的(這就讓我想到,張懸把聽歌的人稱之為聽眾,而李玟稱之為歌迷,兩個皆為我親耳聽見:) ),又扯遠了

只是閒聊,就當作廢話一則吧


---

只是有人說聽不懂我說的,我就隨興說說...XD

做壞事

昨日與Josh討論到很多事,有時候,能當上教授,除了本身的實力,還有一些額外的因素,當然,這會顯示這些事情很複雜,我們就跳過吧。

至於志向問題,我想不論是一個理論家,實作家,理論與實作並重的人,都有其發展的空間,決定好就去做吧。

另外也順便討論一下到底要怎麼樣的程式才能灌爆別人信箱,他之前試著做過,用Ruby做的,因為有內建套件,所以很方便,我想想,就用Java的Socket Programming部分做出來,也很簡單(不到三十行),不過事實上會卡在一些問題,現在大部分的Mail Server並不支援直接登入使用SMTP寄信,不過倒也還好,如果用一個浮動ip,然後再隨機尋找可以的就好了,比較大的mail server不行,我想還是有很多中小企業或中小學校沒有關掉? 這也是有可能的,不過當然,這是就技術層面來討論,實際上不會去做的,當然,也不會放程式碼XD

----
測試時,我的信箱多了好多信XD

星期四, 1月 10, 2008

看到鬼

這是真的嗎?

---
從Josh那邊看到的XD


印刷廠的排程趕不上,到一月底才會上架,譯序很讓人期待,雖然沒有某些東西我會很想炸人,那麼現在是預購時間嗎,書商應該要,預購有特價啊,送海報之類的(敲碗~)XD

星期一, 1月 07, 2008

最近

最近,沒啥大事發生,就是一直寫程式吧!? 聽說還有兩隻程式要寫 XD 不過都算是小事了,只是最近朋友寫程式落入一個我難以理解的狀況,我只能說,做事乃循序漸近之行為,絕對不是瞻之在前,忽之在後,君不見萬丈高樓平地起,豈有蓋空中樓閣的道理。

雖然擔心,但是也無法說什麼,只能說繼續努力了。期末考近啦,也希望自己翹課能翹少一點了XD

---
我為什麼要寫的文言不文言,白話不白話呢...Orz

星期日, 1月 06, 2008

Google Code

今天小摸一下,可以把程式碼集結成一個地方,也可以讓人搜尋,不太清楚怎麼用,但是一個project有100mb的檔案空間,我想我可以用很久很久,然後也可以直接下載,我想以後檔案會放這裡,比較好整理。

也因應Google Code和Picasa,訪客留言區,所以小小的調整的一下sidebar的版面配置

---
當然,還是全部都是free

星期六, 1月 05, 2008

怪

用GooglePage存的檔案,最近又可以下載了,似乎是在我把音樂移掉之後的事,看來Linkin Park魅力不小,大概以後不敢放音樂在上面啦,保持可以正常下載就好。

所以我之前猜的是錯,原來google還是開放自由連結的,所以我還是會繼續放在那裡吧XD

---
剛好可以偷懶了XD


12:06 PM 發現好像蠻多人在找我放的新版個人代表圖(這絕對不是我畫的,不過我很喜歡),會不會再爆掉啊...Orz
01/06 06:39 PM把圖移回學校了,應該不會有事了XD

以UDP實作RDT

花了很多時間之後,實作出以UDP實作reliable data transfer的半成品(因為我覺得並不是那麼完美),檔案僅供參考嘍,以Java實作之。

code(Google Code)

還是一樣,歡迎自由轉載,無需告知,不過最近班上在寫這個作業,應該不會有人找到這裡來XD?

好像變成某些關鍵字第一名了XD

---
但是還是因為這個東西搞了一個禮拜...Orz

星期三, 1月 02, 2008

RDT二三事

建立在一個假設上,ack packet完全不會loss掉的話,那麼事實上單個packet transfer的RDT,已經做的差不多了,所以接下來該考慮實作如果連ack packet都不見時該如何處理。課本事實上用了一個偷懶的方法,反正在一定的時間內沒有收到ack就重傳,也是一個不錯的選擇XD

---
事實上有點語無倫次的感覺


02:29 AM 事實上sendPacket設定一下就可以達成這個要求了,我剛剛在想什麼,竟然認為很難,看來腦袋有錯亂的傾向XD

星期二, 1月 01, 2008

寫程式

寫程式就是一個可以把阿匹婆變成林志玲的魔術

---
但是寫程式不是魔術靈XD

星期一, 12月 31, 2007

寫程式之餘

RDTACKPacket ackSizePacket = null;
do{
sendPacket(sendPackets.get(0), clientSocket, IPAddress);
ackSizePacket = receiveACKPacket(clientSocket);
}while(!(ackSizePacket.getPakcetNumber() == 0 && ackSizePacket.getACK()));

寫RDT之餘,看到這一段程式碼,發現每一個function 都是自己撰寫的,也就是說這一段程式碼是我寫的程式碼的組合技XD 看起來也蠻有趣的

---
寫完會更有趣XD

星期五, 12月 28, 2007

RDT

經過一晚之後,總於做出一個基本來,要進行下一步,checksum and ack and retransfer XD 如果用UDP實做的話,事實上第一件事要做的是把每一個超長字串(這邊預設的支援大小約80mb (8192-9)*10000/1024 ),會把這80mb分割成約10000個封包加以傳送之,再接受端根據pakcet number再加以重排。

會搞那麼久的原因是,我對Java的String index不熟..Orz

---
對,沒錯,就是 String.substring(beginInex, endInedx) ...Orz

星期三, 12月 26, 2007

GooglePage

原來以為這是一個不讓Google注意的服務,所以我就放心的使用他來放一些有關blog的檔案(程式碼、文件、我的個人圖片),結果這幾天發現,好像不能直接連結啦XDXD,只好先暫時移回學校的個人空間,為什麼要放Google呢?想說都一起,也蠻方便的,也不用怕學校的空間什麼時候會倒掉,看來現在只好再另尋他處了。

---
這年頭放資料有點麻煩XD


有找到Google Code - Project Hosting,好像不錯玩,改天來試試看

星期二, 12月 25, 2007

沒有頭緒

過了好幾天,我依舊對RDT implement沒有頭緒,或許會邊做邊寫? 也是一件很有可能的事。

昨夜學弟在讀Degital Design時,發生的問題是就是不懂課本在說什麼,老實說,我覺得有Flip-flop的狀況下,若為synchronous ,也就是所有的電路皆聽同一個clock的狀況下,先用 finite state machine 規畫之,再把 state diagram 轉成 truth table,再把truth table 的每一個output使用k-map簡化出電路,即可實作之,一氣呵成,一次解決,所以我還蠻喜歡Flip-flop這個部分,可謂之把sequencl circuit 與 combinational circuit結合的美麗之處的開始。

說多了,回到正題,目前對Java熟練度有大大的提升,不過自己也很清楚,有些概念也只是自己硬用C++轉換,還是得再努力才行,目前已經回復至正常的生活。

---
keep going