Time of Update: 2018-12-05
1. 簡述 給定一棵二叉樹,假定每個節點都用唯一的字元表示,具體結構如下:struct NODE { NODE* pLeft; NODE* pRight; char chValue;}; 假設已經有了前序走訪和中序遍曆結果,希望通過一個演算法重建這棵樹。
Time of Update: 2018-12-05
0. 簡述 本文主要參考"A Tutorial On Hidden Markov Models",這個文章可以在http://vision.ai.uiuc.edu/dugad/上面找到。主要是通過閱讀這篇技術報告來瞭解一些HMM的學習演算法,即分段K-Means和向前向後演算法(也稱為BaumWelch演算法)。 前面兩篇文章介紹過HMM的基礎了,這裡就更多的直接上公式了。那兩篇文章是:隱馬爾可夫模型-HMM-簡述-1-原理-樣本,隱馬爾可夫模型-HMM-簡述-2-評估-解碼-學習。
Time of Update: 2018-12-05
1. 簡述 給定平面上N個點的座標,找出距離最近的兩個點。2. 思路 暴力的方法是C(N,2),N^2的複雜度。 二分的方法,比如首先將所有的點根據橫座標排序,遞迴二分。終止條件:直到只有一個點或者兩個點的時候返回,一個點時返回空,兩個點時返回這兩個點構組對。遞迴過程:先計算左邊N/2個點之間的最近點對,計算右邊N/2個點之間的最近點對,然後計算左邊點與右邊點構成的最近點對。這樣複雜度公式:T(n) = 2T(n/2) +
Time of Update: 2018-12-05
1. 簡述 問題一:給定一棵二叉樹,要求按分層遍曆該二叉樹,即從上到下的層次訪問該二叉樹(每一層將單獨輸出一行),每一層要求訪問的順序為從左至右,並將節點依次編號。 問題二:寫一個函數,列印二叉樹中某層次的節點(從左至右),其中根節點為第0層,函數原型為int PrintNodeAtLevel(Node* root, int level),成功返回1,失敗返回0。2. 思路 使用隊列進行廣度優先搜尋,主要有一個特點,即如果第k層元素一個都沒出隊,那麼隊列中必然沒有k+1層元素,
Time of Update: 2018-12-05
1. 簡述 前序,根->左子樹->右子樹,中序,左子樹->根->右子樹,後序,左子樹->右子樹->根。 本文主要關注三種遍曆方式的非遞迴實現。其中,中序和後序的實現來自參考中的“二叉樹的遍曆:前序,中序,後序,層序--包括遞迴和非遞迴實現”一文及其評論,前序比較簡單,單獨寫了個實現與參考的文中實現不同。另外,對於中序和後序,實現是一樣的,也沒什麼意思,加了幾行注釋,就這樣了,實現主要是核心代碼,完整代碼在參考的文章中很詳細。2. 前序非遞迴
Time of Update: 2018-12-05
1. 題目 給定一整數序列A1, A2,... An (可能有負數),求A1~An的一個子序列Ai~Aj,使得Ai到Aj的和最大。例如: 整數序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和為20。 編程之美上的一道題,也是常考題目之一。2. 解答 屬於基礎動態規劃。遞推公式如下: 假設序列為:a[0],a[1],...,a[n-1], 定義兩個新的序列:p[0],p[1],...,p[n-1],和q[0],q[1],...,
Time of Update: 2018-12-05
1. LDA是什麼 線性判別式分析(Linear Discriminant Analysis),簡稱為LDA。也稱為Fisher線性判別(Fisher Linear Discriminant,FLD),是模式識別的經典演算法,在1996年由Belhumeur引入模式識別和人工智慧領域。 基本思想是將高維的模式樣本投影到最佳鑒別向量空間,以達到抽取分類資訊和壓縮特徵空間維數的效果,投影后保證模式樣本在新的子空間有最大的類間距離和最小的類內距離,即模式在該空間中有最佳的可分離性。
Time of Update: 2018-12-05
1. 簡述 能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個數組中肯定存在至少一組符合要求的解。2. 思路 方法一:遍曆數組中任意兩個數字,C(N,2)種組合,複雜度O(N^2)。 方法二:首先排序數組,然後遍曆其中每個數字,二分尋找找另一個合格數字(即給定值減去遍曆的當前數字),複雜度O(LogN +
Time of Update: 2018-12-05
1. 簡述 對一個位元組(8bit)的無符號整型變數,求其二進位表示中“1”的個數,要求演算法的執行效率儘可能的高。2. 思路 我對這道題沒有什麼新的發現,也就是再說一遍編程之美上面的解答思路。第一個思路就是一個位一個位的判斷,8位的數字,就是8次。第二個思路就是每次消減數字二進位中的最後一個1,直到數字變為0為止,這個方法僅與數位二進位中的1的個數有關,因此比第一個思路的複雜度更好一點,每次消減最後一個1的方法為num = num & (num-1)。3.
Time of Update: 2018-12-05
1. 簡述 給定兩個字串s1和s2,要求判斷s2是否能夠被s1做迴圈移位得到的字串包含。例如,給定s1=AABCD和s2=CDAA,返回true;給定s1=ABCD,s2=ACBD,返回false。2. 思路 將問題轉化為:判斷s1s1中是否包含s2子串。即對於s1=AABCD和s2=CDAA,判斷AABCDAABCD中是否存在AA。 使用KMP匹配就行,對於s1s1也不用特地去開闢空間,假設s1的字串指標為str,長度為len_str,只需len_str +=
Time of Update: 2018-12-05
1. 下面的代碼輸出是什嗎? int main() { int a[2] = {0, 0}; int *p = a; *(p++) = 1; cout << a[0] << a[1] << endl; system("PAUSE");} 結果是10,即a[0]=1,a[1]=0。雖然有括弧,但是仍舊是沒有先對p進行自增,實際上,自增的步驟是發生在該符號所在的運算式結束之後。即*(p++)=1;相當於*p=1; p++;2
Time of Update: 2018-12-05
1. 演算法流程 輸入:聚類個數k,以及包含 n個資料對象的資料庫。 輸出:滿足方差最小標準的k個聚類。 (1)從n個資料對象任意選擇k個對象作為初始聚類中心 (2)計算每個對象與聚類中心的距離;並根據最小距離重新對相應對象進行劃分 (3)重新計算每個聚類的均值作為新的聚類中心 (4)迴圈(2)到(3)直到每個聚類不再發生變化為止2. 演算法分析 K-Means的最佳化目標可以表示為:
Time of Update: 2018-12-05
5. 使用環視功能為數值添加逗號 四種類型的環視: · 肯定逆序環視 (?<= ......) 子運算式能夠匹配左側的文本 · 否定逆序環視 (?<! ......) 子運算式不能匹配左側的文本 · 肯定順序環視 (?= ......) 子運算式能夠匹配右側的文本 · 否定順序環視 (?! ......) 子運算式不能匹配右側的文本
Time of Update: 2018-12-05
1. 題目 給定一個隨機數產生器,這個產生器能均勻產生1到5(1,5)的隨機數,如何使用這個產生器產生均勻分布的1到7(1,7)的數?2. 思路 方法一:產生兩個(1,5)的隨機數,這樣一共是25種情況,注意這兩個數是有順序的,從這25種情況中,取前21種,每三種代表(1,7)中的一個數字,如果取到的是這21種以外的情況,丟掉重新取。
Time of Update: 2018-12-05
1. 簡述 在一篇部落格上看到的題目,說是網易有道的面試題,用上一篇文章的方法還是很好推匯出來的。2. 題目 列印如下形式的矩陣n=5:1 2 9 10 254 3 8 11 245 6 7 12 2316 15 14 13 2217 18 19 20 21n=6:1 2 9 10 25 264 3 8 11 24 275 6 7 12 23 2816 15 14 13 22 2917 18 19 20 21 3036 35 34 33
Time of Update: 2018-12-05
1. 簡述 給定一個長度為N的整數數組,只允許用乘法,不能夠用除法,計算任意(N-1)個數的組合中乘積最大的一組,並寫出演算法時間複雜度。2. 思路 題目中要求不能用除法,實際上就是否定了將所有數乘起來,然後分別去除每個數位方法,實際上這種方法也不好實現,因為如果數字中有0的話,都乘起來就是0,還要除0,麻煩啊,另外,數值溢出也是個麻煩。實際上只要找到N-1個數的組合即可,並不需要去計算這N-1個數位乘積。
Time of Update: 2018-12-05
0. 簡述 以下幾個章節,記錄閱讀A tutorial on PCA by Lindsay I. Smith (PDF) 這篇教程的一些重點,尤其是PCA計算的幾個步驟。1. 引入 PCA是Face Service和映像壓縮領域的有用的統計技術,是一個在高維資料中發現模式的通用技術。2. 數學背景2.1 統計2.1.1 標準差 Stand Deviation 集合X的均值的計算公式如下: 集合X的標準方差的計算公式如下:
Time of Update: 2018-12-05
1. 簡述 1) 給定一個整數N,那麼N的階乘N!末尾有多少個0呢?例如:N=10,N!=3 628 800,N!的末尾有兩個0。 2) 求N!的二進位表示中最低位1的位置。 2.
Time of Update: 2018-12-05
1. 簡述 電話的號碼盤一般可以用於輸入字母。如用2可以輸入A、B、C,用3可以輸入D、E、F等。 對於號碼5869872,可以依次輸出其代表的所有字母組合。如:JTMWTPA、JTMWTB······ 1) 設計程式,儘可能從這些字母組合中,找到一個有意義的單詞來表述一個電話號碼。如單詞"computer"來描述號碼26678837。 2) 對於一個號碼,是否可以用一個單詞代表?怎樣才是最快的方法?2. 思路
Time of Update: 2018-12-05
1. 簡述 楊氏矩陣中,每行元素是遞增的,每列元素也是遞增的。即a[i][j]<a[i+1][j]且a[i][j]<a[i][j+1]。要在這樣的矩陣中尋找某個數值元素的位置,複雜度可以達到O(M+N),其中M為矩陣行長度,N為矩陣列長度。2. 原理 從矩陣的左下角或者矩陣的右上方處開始遞迴運行,以左下角為例,value為要尋找的值,(i,j)為當前矩陣中的位置,初始為(M-1, 0)。 如果超過了矩陣範圍則說明不存在這樣的元素,返回-1,-1。