1. 程式人生 > >阿裏電話面試

阿裏電話面試

矩陣 進程與線程 結構 利用 b樹 應用 where 循環 n-1

1.排序的分類,冒泡排序和快排的實現

2.快排的最差情況:

  經典快排總拿第一個數進行劃分,這樣在數組有序的情況下,每次劃分都得到最壞的結果,都是左邊 n-1個數,右邊0個數,每次劃分都只能減少一個數,T(n) = T(n-1) + 1;快排將退化成冒泡排序。

解決辦法是:隨機化算法,隨機選取一個元素作為劃分點,這樣,雖然在最壞情況下仍然是O(n^2),但是最壞的情況就不再依賴初始數據狀況了,而是取決於隨機元的選取。

int num = (int)(Math.Random()*(high - low + 1) + low);

3.怎麽判斷一個數組是有序的:

4.圖相關的問題:判斷有向圖中是否形成環

  對於圖的問題,一般選擇DFS或BFS進行遍歷

  1.拓撲排序的方法:找到入度為0的點,刪除,並且刪除以它為出發點的邊,一直重復上面的步驟,然後當沒有頂點時或者沒有入度為0的點時,停止循環。沒有定點的情況是沒有環,另外一種是有環。

  2.另一種方法是利用BFS深度優先遍歷,然後用一個數組進行記錄是否遍歷過,如果有遍歷了兩次的頂點,則含有環,否則不含環。(使用鄰接矩陣)

5.hashmap

底層的數據結構:桶數組+鏈表+紅黑樹

操作的平均時間復雜度O(1)

  1.計算hash值,得到index位置

  2.在桶數組中找到index的位置,得到鏈表或紅黑樹

  3.遍歷鏈表或紅黑樹,取出相應的鍵值對

  4.從鍵值對中取出value

設計優秀的hash算法,以減少hash沖突,這樣使得鏈表的長度盡可能的短,當理想狀態下,鏈表長度為1時,時間復雜度就是O(1)

為什麽鏈表切換成紅黑樹:當鏈表長度超過8時,轉化為紅黑樹,利用紅黑樹快速增刪改查的特點提高HashMap的性能

有沒有可以替代紅黑樹的數據結構:回答的是AVL樹,B樹。

6.B樹和紅黑樹的區別,與應用場景

平衡二叉樹:

  AVL樹:最早的平衡二叉樹,windows對進程地址空間的管理用到了AVL樹,平衡性最好,查詢的復雜度是O(logn)

  紅黑樹:HashMap中用到了

這些樹都是用在內存中的數據結構,因為要保持平衡,數據要不停的搬來搬去,如果換做磁盤中,開銷就會很大。

  B/B+樹(多路查找樹):用在磁盤文件組織,數據索引和數據庫索引中

每個結點有更多的孩子,新值可以插入在已有的結點裏,而不需要改變樹高度,從而大量減少重新平衡和數據遷移的次數,這樣非常適合做數據庫索引,這種需要持久化在磁盤,同時需要大量查詢和插入操作的應用。

  磁盤的查找存取的次數一般是由樹的高度決定的,選用多路查找樹,可以使樹保持較低的高度,從而有效的避免頻繁的查找存取的操作,從而提高查找效率。(每增加一層深度,要多一次IO,每次IO時,應該盡量多拿一些數據出來,避免多次IO,耗時)

  Trie樹(字典樹):用在統計和排序大量字符串。

7.java虛擬機

  判斷一個對象可不可以回收

  1.引用計數法

  2.可達性分析:通過GC roots對象作為起始點,從結點向下開始搜索,搜索過得路徑組成引用鏈,當一個對象沒有與引用鏈相連時,(不可達),那證明這個對象是不可用的。

  可作為GC roots的對象:

    1.棧中的對象

    2.方法區中的靜態屬性和常量引用的對象

    3.本地方法區中native引用的對象

8.觸發回收條件:

  Minor GC(年輕代):

    當Eden區滿時,觸發Minor GC,非常頻繁。

  Full GC(老年代):

    1.調用System.gc時,只是系統建議Full GC,但不一定執行

    2.老年代內存不足

    3.方法區空間不足

    4.MinorGC之後,放入老年代的平均大小大於老年代的可用內存

    5.有Eden區,fron space區向 to space復制時,對象大小大於to space 的可用內存,把它轉入老年代,此時老年代的可用內存小於該對象的大小。

9.什麽時間進入老年代

  1.優先分配到Eden區

  2.大對象直接放到老年代

  3.長期存活的對象進入老年代(15此)

  4.空間分配擔保

10.數據庫的聚簇索引和非聚簇索引區別

11.在表中存在聯合索引時,id name age 三個字段建立聯合索引,查詢時 select * from user where id=1 會用到索引嗎?

  1.如果查詢條件只出現了聯合索引的第一列,或者全部,則能利用聯合索引

  2.條件列中只要條件相連在一起,無論前後,都會用上聯合索引

  3.查詢條件中沒有出現聯合索引的第一列,而出現了聯合索引的第二列,或第三列,則不會用聯合索引查詢。

單一列索引:只要條件列中出現索引列,無論在什麽位置,都能利用索引查詢。

參考https://blog.csdn.net/lingzhm/article/details/78020812

12.操作系統中進程與線程的區別

  1.進程是執行著的應用程序,是操作系統進行資源分配和調度的基本單位,它是有自己獨立的內存空間,通信比較困難,但是它有比較固定的入口和執行順序和出口。

  2.線程是進行的一個序列,是CPU調度和分配的最小單元,而且線程之間是共享內存的,通信方便,不過線程的調用是通過進程控制的。

13.數據庫中的樂觀鎖和悲觀鎖分別是什麽,應用的場景

  樂觀鎖:讀操作

   悲觀鎖:寫操作

14.從10w個大小不同,無序的整數,從其中找到最大的三個數。(提示:對比比賽中的淘汰制度。類似於二分法)

阿裏電話面試