近期面试题总结【一】

深信服

最大公约数算法

‌最小公倍数

‌堆排序

  • ‌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+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率

     

     

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