近期面試題總結【一】

深信服

最大公約數算法

‌最小公倍數

‌堆排序

  • ‌nginx調度算法
  1. 輪詢(默認)   

    每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。

  2. ‌weight 
    指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。  
    例如:  
    upstream bakend {  
    server 192.168.0.14 weight=10;  
    server 192.168.0.15 weight=10;  
    }  

  3. ip_hash (取餘%的運用)
    每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。  
    例如:  
    upstream bakend {  
    ip_hash;  
    server 192.168.0.14:88;  
    server 192.168.0.15:80;  

  4. fair(第三方)   
    按後端服務器的響應時間來分配請求,響應時間短的優先分配。  
    upstream backend {  
    server server1;  
    server server2;  
    fair;  
    }  

  5. url_hash(第三方)   

    按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。  

    例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法  

    upstream backend {  
    server squid1:3128;  
    server squid2:3128;  
    hash $request_uri;  
    hash_method crc32;  
    }  

加權輪詢

‌函數指針

‌哈希表 

‌哈希分配

‌sort函數

‌nginx爲什麼用反向代理不用正向代理

‌字節對齊

‌動態規劃

  • strcpy和memcpy都是標準C庫函數,它們有下面的特點。
    strcpy提供了字符串的複製。即strcpy只用於字符串複製,並且它不僅複製字符串內容之外,還會複製字符串的結束符。

    已知strcpy函數的原型是:char* strcpy(char* dest, const char* src);
    memcpy提供了一般內存的複製。即memcpy對於需要複製的內容沒有限制,因此用途更廣。
    void *memcpy( void *dest, const void *src, size_t count );

    char * strcpy(char * dest, const char * src) // 實現src到dest的複製

    {

      if ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性

      {

     

          return NULL;

      }

      char *strdest = dest;        //保存目標字符串的首地址

      while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內容複製到dest下

      return strdest;

    }

    void *memcpy(void *memTo, const void *memFrom, size_t size)

    {

      if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效

             return NULL;

      char *tempFrom = (char *)memFrom;             //保存memFrom首地址

      char *tempTo = (char *)memTo;                  //保存memTo首地址     

      while(size -- > 0)                //循環size次,複製memFrom的值到memTo中

             *tempTo++ = *tempFrom++ ; 

      return memTo;

    }

    strcpy和memcpy主要有以下3方面的區別。
    1、複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符數組、整型、結構體、類等。
    2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
    3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy

  • 紅黑樹
    二叉排序樹:左邊比根節點小,右邊比根節點大,並且左右子樹都是二叉排序樹

    在插入序列有序時,會出現退化成鏈表的情況,所以纔要用平衡樹,在插入的時候同時調整這棵樹,讓它的節點儘可能均勻分佈(紅黑樹也是平衡樹的一種,它的複雜的定義和規則,最後都是爲了保證樹的平衡性)

    爲什麼要保證樹的平衡?因爲樹的查找性能取決於樹的高度,讓樹儘可能平衡,就是爲了降低樹的高度,java中有一個數據結構底層就是紅黑樹,TreeSet

  • B樹
    B樹是一種多路搜索樹,它的每個節點可以擁有多於兩個孩子的節點,M路的B樹最多能擁有M個孩子節點

    設計成多路,是爲了進一步降低樹的高度,路數越多,樹的高度越低。若設計成無限多路,B樹就退化成一個有序數組了

    B樹做文件系統索引比較多,因爲文件系統和數據庫的索引都是存在硬盤上的,並且如果數據量大的話,不一定能一次性加載到內存中(要考慮運行時的內存)

    如果一棵樹都無法一次性加載進內存,B樹多路存儲威力就顯現了,可以每次加載B樹的一個結點,然後一步步往下找,

    假設內存一次性只能加載2個數,這麼長的有序數組是無法一次性進內存的,我們把它組織爲一棵三路的B樹,這樣每個節點最多有2個數,查找的時候,每次載入一個節點進內存就行。

    如果在內存中,紅黑樹比B樹效率更高,但是涉及到磁盤操作,B樹就更優了,B+樹是在B樹的基礎上進行改造,它的數據都在葉子結點,同時葉子結點之間還加了指針形成鏈表。

    B+樹之所以這樣設計,是因爲數據庫中select數據,不一定只選一條,很多時候會選多條,比如按照id排序後選10條,對B樹來說需要做局部的中序遍歷,可能要跨層訪問,而B+樹由於所有數據都在葉子結點,不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。

    在Mysql中如果只選一個數據,hash更快,但在數據庫中經常會選擇很多條,這時候由於B+樹索引有序,並且又有鏈表相連,它的查詢效率比hash就快很多了,而且數據庫中的索引一般是在磁盤上,數據量大的情況可能無法一次裝入內存,B+樹的設計可以允許數據分批加載,同時樹的高度較低,提高查找效率

     

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章