本人的第一次面試。
本來投的CSIG,一直沒被撈就被釋放了,然后今天被TEG約面試。
主要問題如下:
1. 自我介紹
名字,學校,平常就看書、運動、寫寫博客。喜歡算法和數據結構(挖坑開始)。
2. 先問個簡單算法吧,講下KMP的原理
我講了下next數組,然后他問復雜度,一個主串多個模式串呢?
3. 我自己挖坑提到AC自動機,問了具體實現和復雜度
由於我基本忘了,趕緊說我是隊里的數學選手,字符串題都是隊友做
4. 講一下各種最短路算法以及它們的差異
我把處理負權圖說成了Dikstra,暈(實際是Bellman-Ford)
5. 數據結構方面:RMQ問題
我講了ST表和線段樹
6. 然后又開始問線段樹,原理及構建
我說每個區間都是一個節點,每個節點存自己對應的區間的統計信息
void build(int o, int L, int R) { int M = L + (R-L) / 2; if(L == R) minv[o] = a[L]; else { build(2*o, L, M); build(2*o+1, M+1, R); minv[o] = min(minv[2*o], minv[2*o+1]); } }
7. 數據庫:
- InnoDB的索引結構:B+樹
- B樹與B+樹的區別:節點不存儲信息、范圍查詢、時間穩定
- 幻影讀:不清楚
- 事務級隔離:不清楚
- 主從一致性:不清楚
- NoSQL:不清楚
- CASS??:反正是一個沒聽過的名詞縮寫
、8. 操作系統:
- 進程、線程和協程的區別:協程不太了解,只知道是一種比線程更輕量的方式
- 進程間的通信方式:管道、信號量、信號、共享內存和套接字
9. 又問了一個算法題:有n整數,其中有一個數出現次數超過n/2,如何找到他。
- 先講了用map統計一下,
- 后來想到可以將互異的元素兩兩划掉去,口糊了一個遞歸算法,O(n)
10. 最后,你有什么想問的問題嗎?
- 你是什么部門的?TEG的一個部門,主要是分布式數據庫開發
- 你們希望實習生擁有哪些技能和素質?實習生的話主要看數據結構、操作系統等計算機基礎,校招的話會看項目
總結一下:
1. 這次根本沒提項目,之前面CSIG的騰訊電腦管家,就一直懟項目,各部門差異有點大。
2. 估計對方也是個ACMer,問了很多算法競賽的知識,字符串算法對一個數學選手極不友好(就不應該把一個沒獲獎的競賽經歷寫上去)
3. 對方是分布式數據庫開發的,問了好多數據庫方面的知識,分布式這一塊我都沒准備,之前數據庫課程也沒學好,結果一問三不知,尷尬
4. 我投的C++后端,怎么會被這種部門撈啊,好涼啊。。。
補題:
1. KMP和AC自動機
KMP復雜度為O(n+m),

void getFail(char* P, int* f) { int m = strlen(P); f[0] = 0; f[1] = 0; //遞推邊界的初值 for (int i = 1; i < m; i++) { int j = f[i]; while (j && P[i] != P[j]) j = f[j]; //往回走 f[i + 1] = (P[i] == P[j] ? j + 1 : 0); } } void find(char* T, char* P, int * f) { int n = strlen(T), m = strlen(P); getFail(P, f); int j = 0; //當前結點編號 for (int i = 0; i < n; i++) { while (j && P[j] != T[i]) j = f[j]; //順着失配邊走,知道可以匹配 if (P[j] == T[i]) j++; if (j == m) { printf("%d\n", i - m + 1); //找到了一個 j = f[j]; } } }
2. 多個模式串匹配使用AC自動機,組成一個大的狀態轉移圖,而不是每個模式串構造一個轉移圖。
AC自動機是在Trie樹的每個節點加一條fail邊,指向當前位置匹配失敗時需要跳轉到的位置
- Trie的插入、刪除復雜度都是O(字符串的長度),因此構建狀態轉移圖是O(模式串長度之和)
- AC自動機在查找所有匹配的位置時,時間復雜度為 O(|S| + m), |S| 是文本串的長度,m是模板串總的匹配數目
3.
- Dijkstra不能用於負權圖,S集合和T集合,T集合dis[v]最小的就是點v最終的最短距離,如果存在負邊就不一定,所以Dijkstra不能用於負權圖,復雜度O(vlogv)
- Bellman-Ford可以處理負權圖,當n-1次之后還能進行松弛操作,說明存在負權,復雜度O(VE)
- SPFA只將發生松弛操作的節點入隊,因為松弛操作必定發生在前導節點成功松弛的節點上。SPFA在隨機的稀疏圖上表現出色,並且極其適合帶有負邊權的圖。然而SPFA在最壞情況的時間復雜度與Bellman-Ford算法相同
- Disjkstra適合稠密圖
4. 協程
5. 數據庫. 這個大坑慢慢補