原创 每日一題17:八皇后問題

八皇后問題是由國際西洋棋棋手馬克斯·貝瑟爾於1848年提出的:在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認爲有76種方案。1854年在柏林的象棋

原创 《Effective C++》重點摘要(二)

《Effective C++》第二章:構造/析構/賦值運算 C++默認編寫的函數。C++編譯器如果沒有發現以下函數,就會爲類生成一份默認版本的: 1) default構造函數 2) default析構函數 3) co

原创 每日一題12:用數組加速遞歸

許多程序設計教學書上都用斐波那契數列(數列中第一二項都是1,其它任意一項都是其前兩項之和)作爲講解遞歸的例子,作爲教學例子,它確實十分合適,但是如果用在實際計算中,那麼遞歸實現的斐波那契數列求值實在是太慢了,其中主要的原因是重複計

原创 《Effective C++》重點摘要(三)

《Effective C++》第三章:資源管理 以對象管理資源。一份資源,可能是一片內存,可能是一個鎖,當客戶申請後需要手動釋放纔是合理的,那麼最好在獲得這份資源的時候,就立刻把它放到一個對象裏(RAII技術),然後在對象的析構

原创 每日一題19:循環隊列

基於數組實現的循環隊列,這個比基於鏈表實現的稍微麻煩一點,需要浪費一個存儲空間。如果全部利用,則編程將會變得更加繁瑣,並且更容易出錯。 // LoopQueue.cpp : 定義控制檯應用程序的入口點。 // #include

原创 每日一題32:排序

排序概述 排序用途廣泛,比如爲數據庫查詢結果按時間排序,最小生成樹算法中對邊按權重排序,揹包問題中對物品按大小排序等等。排序算法有很多,本文主要記錄了冒泡排序、插入排序、快速排序、選擇排序、堆排序、歸併排序等幾種比較流行的算法。 冒泡排序

原创 每日一題31:圖的遍歷

算法概述 圖的遍歷是指訪問圖中每個節點一次。圖的遍歷方式主要有兩種,一種是深度優先,即能走多遠就先走多遠的遍歷方式,這就意味着,對於每個節點的遍歷完後,下一個訪問的節點應該是他的鄰接點,而不是兄弟節點。另一種方式是深度優先的方式,這是一種

原创 每日一題26:求逆序對數目與求和

求逆序對問題與解決方案原理 在一個數列中,如果規定從小到大爲正序,那麼如果排在後面的某個元素比前面的某一個元素小,那麼就稱這兩個數構成一個逆序對,例如,數列5,4,3,2,1中,任一個數都與它前面的數構成逆序對,這個序列中一共就有1+2+

原创 每日一題29:最小生成樹

最小生成樹是指包含圖中所有的頂點而又沒有環並且所有邊的權值最小的子圖,由於這張圖沒有環,所以就是一棵樹。比較流行的兩種找到最小生成樹的算法有Kruscal算法和Prim算法。本文在代碼註釋裏寫明算法的原理和實際計算步驟,然後貼出兩種算法運

原创 每日一題25:Hoffman樹

Hoffman樹是由David A. Hoffman於1952年在MIT攻讀博士學位期間發表的論文《A Method for the Construction of Minimum-Redundancy Codes》中提出的,它的目的尋找

原创 每日一題30:拓補排序

問題描述 所謂拓補排序就是確定圖中節點的一種順序,使得某些在別的節點訪問之前不能訪問到的節點排在後面。所以該算法的核心是每一步選擇一個沒有入度的節點,因爲沒有入度意味着該節點沒有前驅,得到一個節點後,就把以新得到的節點爲起點的邊去除,從剩

原创 每日一題28:圖的基本操作

本文記錄了基於鄰接表表示的有向有權圖的基本操作。鄰接表表示的圖的結構就是用一個散列表存儲圖的節點,而每個節點後面跟着從節點出發的所有邊的集合,這些邊用鏈表連接起來,所以在這樣的圖中尋找一個節點發出的邊是容易的,但是尋找進入一個節點的邊是困

原创 《Effective C++》重點摘要(六)

《Effective C++》第六章:繼承與面向對象設計 確定你的public繼承塑模出is-a關係。student is a person,所以student可以public繼承自person。概念上,正方形是長方形,但是如果讓squ

原创 每日一題27:並查集

如何快速地判斷一個元素是否在一個集合中?如何將一個元素或一個集合合併到另一個集合中?並查集就是一種支持集合快速合併與查找的結構。簡單的實現可以做到在O(1)時間複雜度內找到一個元素所屬的集合,但是卻要在O(N)時間內完成合並。假設有N個元

原创 《Effective C++》重點摘要(五)

《Effective C++》第五章:實現 儘可能延後變量定義式的出現時間。只有變量在恰好要使用之前定義,程序的可讀性往往會得到提高,因爲這樣不容易忘記變量說代表的意思。另一方面,這樣做可以提高程序性能,如果不需要一個變量時卻要爲它分配