1. 二叉樹遍歷
前序:根-左-右; 中序:左-根-右; 後序:左-右-根
一般題目會給出後序,記住最後乙個為根節點,然後慢慢推導左右子樹
2. 霍夫曼編碼
霍夫曼(huffman)編碼屬於碼詞長度可變的編碼類,是霍夫曼在2023年提出的一種編碼方法,即從下到上的編碼方法。同其他碼詞長度可變的編碼一樣,可區別的不同碼詞的生成是基於不同符號出現的不同概率。生成霍夫曼編碼演算法基於一種稱為「編碼樹」(coding tree)的技術。演算法步驟如下:(1)初始化,根據符號概率的大小按由大到小順序對符號進行排序。
(2)把概率最小的兩個符號組成乙個新符號(節點),即新符號的概率等於這兩個符號概率之和。
(3)重複第2步,直到形成乙個符號為止(樹),其概率最後等於1。
(4)從編碼樹的根開始回溯到原始的符號,並將每一下分枝賦值為1,上分枝賦值為0。
題目內容:題目描述:查詢陣列a中最小的k個元素
題目:輸入n個整數,輸出其中最小的k個(n>k)。
例如:輸入1, 2, 3, 4, 5, 6, 7, 8這8個數字(n=8),則最小的4個數字(k=4)為1,2,3和4。
各種思路:
1. 對n個數排序,取前k個。這裡假設不考慮計數排序、基數排序和桶排序等非比較為基礎的演算法,最先想到的快速排序(quicksort)時間複雜度o(nlogn),空間複雜度o(1)。
2. 用陣列b儲存前k個數,然後從第k+1個數開始,假設為第i個數,每次都找出陣列b中的最大數,當第i個數小於陣列b中的最大數則替換。這樣的時間複雜度是o((n-k)*k)=o(nk),空間複雜度o(k)。
3. 根據想法2我們可能很自然的發現其中找陣列b最大數的時間複雜度可以簡化,就是維護乙個大小為k的最大堆(注意,確實是最大堆而不是最小堆,因為最大堆的元素在堆頂)。建堆時間複雜度o(k),然後從第k+1個數開始,假設為第i個數,當第i個數小於堆頂元素則替換並調整堆(logn),因此總時間複雜度是o(k + (n-k)*logk) = o(n*logk),空間複雜度o(k)。
4. 我們當然也可以將a中所有元素建立乙個最小堆( 時間o(n) ),再取k次對頂元素並調整堆(k*logk)。這樣時間複雜度o(n + k*logk),空間複雜度o(n)。
5. 我們將a陣列放入乙個優先順序佇列,再進行k次pop()動作。其實這個想法本質和4是一樣的,因為優先順序佇列就是利用堆實現的。o(n + k*logk),空間複雜度o(n)。
6. 我們當然也可以不用大小為n的優先順序佇列,只需要用到k+1大小的(考慮空間複雜度),先將前k個數push進這個優先順序佇列,而後從第k+1個數開始的每乙個數,先push進佇列再馬上pop乙個。時間複雜度待分析(不知道內部實現原理),但是使用優先順序佇列的優勢是**可靠性高並且簡單。
7. 根據快速排序的思想,隨機從陣列a中選取乙個元素作為劃分元素(樞紐元素)x,劃分陣列a為小於等於x和大於等於x的兩部分:la <= x <= ua,此時有以下三種情況: (1)如果la的大小正好是k,那麼la就是我們要找的k個最小的元素;(2)如果la的大小大於k,那麼我們要找的k個元素肯定全部在la內,因此繼續對la進行類似的劃分;(3)如果la的大小小於k,則la內全部的元素都是我們要找的,並且還有部分元素(k-size(la)-1個)在ua內,則我們繼續對ua進行劃分尋找剩下的k-size(la)-1個元素。最壞情況時間複雜度o(n) (關於這個時間複雜度可以查詢《演算法導論》)。
你是山西的乙個煤老闆,你在礦區開採了有3000噸煤需要運送到市場上去賣,從你的礦區到市場有1000公里,你手裡有一列燒煤的火車,這個火車最多只能裝1000噸煤,且其能耗比較大——每一公里需要耗一噸煤。請問,作為乙個懂程式設計的煤老闆的你,你會怎麼運送才能運最多的煤到集市?
為面試做準備之計數排序
計數排序的優點是 1 時間複雜度是o n 2 穩定。缺點是空間複雜度是o n 計數排序無需需要乙個輔助陣列,和乙個輸出陣列。輔助陣列先存放輸入陣列中每個數字的個數,然後修改為相同陣列的最後乙個的位置。實現時需要注意兩點 1 在輸入最大數字k時,分配輔助陣列需分配k 1個空間。2 由於最後在輔助陣列中...
雙向迴圈鍊錶(為STL LIST 做準備)
struct list struct list 鍊錶構建容易錯誤的地方在於插入和刪除。插入 我們把n節點插入p節點之後。需要1.用n的next指標指向p的下乙個節點l。2用l的prev指標指向n。3.用n的prev指標指向p。刪除 刪除時我們一般 1.建立乙個指標tmp指向所要刪除的p節點的下乙個節...
詳解URL(為後續寫Ajax做準備)
統一資源識別符號 uniform resource identifier,uri 統一資源定位符 uniform resource locator,url 是網際網路上用來標識某一處資源的位址。以下面這個url為例,介紹下普通url的各部分組成 從上面的url可以看出,乙個完整的url包括以下幾部分...