原创 基本套接字編程

《UNP》第4到第5章講解了基本的TCP套接字編程。先介紹了各類套接字的地址結構,然後詳述了各個API。 先介紹了一個迭代服務器,但是迭代服務器性能有限,所以提供了一個併發服務器。但是併發服務器需要用信號機制處理結束的子進程,並且會帶來

原创 觀察者(Observer)模式

觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關係,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知並被自動更新。觀察者模式又叫做發佈-訂閱(Publish/Subscribe)模式、模型-視圖(Mod

原创 C++數據結構: 二叉搜索樹 (非遞歸)

理想情況下BST的插入刪除查找花費的時間都是對數級別的,但我們肯定不能依賴“理想情況”。基於下面3個理由: 1. 很多時候輸入得序列都是有序或基本有序的 2. 訪問一個節點過後很可能再次訪問這個節點,或者這個節點附近的節點。 3.

原创 C++: 拷貝管理

《C++ Primer》看到這一章我都驚呆了,C++竟然還能有這種功能:類可以控制該類型對象拷貝、賦值、移動和銷燬時做什麼。 以上操作通過:拷貝構造函數、移動構造函數、拷貝賦值運算符、移動賦值運算符、以及析構函數構成。 拷貝構造函數:

原创 C++數據結構: 鏈表

我用Java寫的鏈表是帶頭尾節點的雙向鏈表,這次用C++透徹一點,不帶頭尾節點的單向鏈表。 實現了一些常用方法,沒順序表詳細。 鏈表的查找、插入、刪除的時間複雜度都是O(N)。因爲它要遍歷到指定位置,如果在原地進行上述操作的話,時間複雜

原创 C++數據結構: 順序表 詳細實現

相比於我用Java實現的順序表,用C++實現更加繁複,因爲要自己管理內存,但思想還是一樣的。代碼複雜度的提升也意味着性能上的提升。 C++的迭代器跟Java不同,它的底層是個指針。開始喜歡Java迭代器的直白,然後慢慢喜歡上C++迭代器的

原创 Java內存區域

Java的內存區域大致可以分爲上圖的5個部分 Java虛擬機規範把方法區描述爲堆的一個邏輯部分,方法區和堆是所有線程共享的。 本地方法棧通常和虛擬機棧也是同一個東西,它們和程序計數器是每個線程私有的。 方法區存放類信息,常量,靜態變量

原创 算法: Prim算法的延時和即時實現

定義: 生成樹:圖的生成樹是它的一棵含有其所有頂點的無環連同子圖。 最小生成樹:一幅加權圖的最小生成樹(MST)是它的一棵權值最小的生成樹。 切分定理:在一幅加權圖中,給定任意的切分,它的橫切邊中的權值最小者必然屬於圖的最小生成樹。

原创 數據結構:加權圖的API

加權圖是一種爲每條邊關聯一個權值或者成本的圖模型 在之前的例子中,鄰接表取得了很好的效果。要表示加權圖,我們只需要擴展一下之前的代碼即可。之前我們直接在鄰接表中存放頂點信息,現在我們改爲存放Edge對象。 package MST; p

原创 減治算法: 插入排序和希爾排序(詳解)

減治法: 減治(decrease-and-conquer)法利用了一個問題給定實例的解和同樣問題較小實例的解之間的某種關係解決問題。我們既可以自頂向下(導致遞歸),也可以自底向上(導致迭代)地運用該關係解決問題。 插入排序: 想象一下整理

原创 分治算法: 歸併排序(詳解)

分治算法: 分治算法和冒泡排序一樣有着好聽的名字。工作方案如下: 1. 將一個問題劃分爲同一類型的若干子問題,子問題最好規模相同。 2. 對這些子問題求解(一般用遞歸) 3. 有必要的話,合併這些子問題,得到原始問題的答案。 歸併