linux C/C++服务器后台开发面试题总结(算法和数据结构篇)

五、算法和数据结构

Linux后台开发技术视频篇

1.给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的最后一个元素将被返回。

解决问题方法思路如下:

方法一、如果我们知道链表的长度n,查找倒数第m个元素,也就是查找正序的第(n - m)个元素(这里的序号只是为了分析,可能跟题目不一定正确的符合)。那么这样来说就简单很多。首先遍历链表得到链表长度,然后重新遍历一次,查找正数第(n-m)个元素。时间复杂度大约是O(2n)。

方法二、我们是不是可以提供一个辅助存储空间,是的我们在遍历到链表结束的时候可以回溯到倒数第m个元素。比如用一个支持随机访问的容器记录链表每一个节点的地址。那么这样的就可以只遍历一次链表就能得到结果。时间复杂度大约是O(n),但是我们是用空间换取时间的,辅助存储空间的大小由m决定,如果m过大也是不可取的。

方法三、头结点指针为当前指针,尾节点指针为拖后指针。开始的时候当前指针和拖后指针初始化为链表的头结点,首先我们让当前指针遍历到第m个元素,拖后指针不变;然后同步更新当前指针和拖后指针;直到当前指针为链表结尾。这样我们就能保证当前指针和拖尾指针之间的距离是m。

代码如下:

Node* FindMToLastNode(Node* pHead, int m)  { 

    // 查找到第m个元素 

    Node* pCurrent = pHead; 

    for (int i = 0; i < m; ++i) 

    { 

        if (pCurrent) 

        { 

            pCurrent = pCurrent->next; 

        } 

        else 

        { 

            return NULL; 

        } 

    } 


    Node* pFind = pHead; 

    while (pCurrent)  { 

        pFind        = pFind->next; 

        pCurrent    = pCurrent->next; 

    } 

    return pFind; 

}

2. 给定一个单向链表(长度未知),请遍历一次就找到中间的指针,假设该链表存储在只读存储器,不能被修改

设置两个指针,一个每次移动两个位置,一个每次移动一个位置,当第一个指针到达尾节点时,第二个指针就达到了中间节点的位置

处理链表问题时,”快行指针“是一种很常见的技巧,快行指针指的是同时用两个指针来迭代访问链表,只不过其中一个比另一个超前一些。快指针往往先行几步,或与慢指针相差固定的步数。

node *create()  { 

    node *p1, *p2, *head; 

    int cycle = 1, x; 

    head = (node*)malloc(sizeof(node)); 

    p1 = head; 

    while (cycle) 

    {       

        cout << "please input an integer: "; 

        cin >> x; 

        if (x != 0) 

        { 

            p2 = (node*)malloc(sizeof(node)); 

            p2->data = x; 

            p1->next = p2; 

            p1 = p2; 

        } 


        else 

        { 

            cycle = 0; 

        } 

    } 

    head = head->next; 

    p1->next = NULL; 

    return head; 

void findmid(node* head)  { 

    node *p1, *p2, *mid; 

    p1 = head; 

    p2 = head; 


    while (p1->next->next != NULL) 

    {   

        p1 = p1->next->next; 

        p2 = p2->next; 

        mid = p2; 

    }   

}

3. 将一个数组生成二叉排序树

排序,选数组中间的一个元素作为根节点,左边的元素构造左子树,右边的节点构造有子树。

4. 查找数组中第k大的数字?

因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子数组中找,如果比枢纽元素下标小从左边的子数组中找,如果一样则就是枢纽元素,找到,如果需要从左边或者右边的子数组中再查找的话,只需要递归一边查找即可,无需像快排一样两边都需要递归,所以复杂度必然降低。

最差情况如下:假设快排每次都平均划分,但是都不在枢纽元素上找到第k大第一趟快排没找到,时间复杂度为O(n),第二趟也没找到,时间复杂度为O(n/2),第k趟找到,时间复杂度为O(n/2k),所以总的时间复杂度为O(n(1+1/2+…+1/2k))=O(n),明显比冒泡快,虽然递归深度是一样的,但是每一趟时间复杂度降低。

5. 红黑树的定义和解释?B树的基本性质?

红黑树:

性质1. 节点是红色或黑色。

性质2. 根节点是黑色。

性质3. 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点n的只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

B树:

1.所有非叶子结点至多拥有两个儿子(Left和Right);

  2.所有结点存储一个关键字;

  3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

6. 常见的加密算法?

对称式加密就是加密和解密使用同一个密钥。

非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用。

DES:对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;

MD5的典型应用是对一段Message产生fingerprint(指纹),以防止被“篡改”。

RSA是第一个既能用于数据加密也能用于数字签名的算法。

7. https?

HTTP下加入SSL层,HTTPS的安全基础是SSL。

8.有一个IP库,给你一个IP,如何能够快速的从中查找到对应的IP段?不用数据库如何实现?要求省空间

9.简述一致性hash算法。

1)首先求memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)。

2)然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。

3)然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

11.描述一种hash table的实现方法

1) 除法散列法: p ,令 h(k ) = k mod p ,这里, p 如果选取的是比较大的素数,效果比较好。而且此法非常容易实现,因此是最常用的方法。最直观的一种,上图使用的就是这种散列法,公式: index = value % 16,求模数其实是通过一个除法运算得到的。

2) 平方散列法 :求index频繁的操作,而乘法的运算要比除法来得省时。公式: index = (value * value) >> 28 (右移,除以2^28。记法:左移变大,是乘。右移变小,是除)

3) 数字选择法:如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值。

4) 斐波那契(Fibonacci)散列法:平方散列法的缺点是显而易见的,通过找到一个理想的乘数index = (value * 2654435769) >> 28

冲突处理:令数组元素个数为 S ,则当 h(k) 已经存储了元素的时候,依次探查 (h(k)+i) mod S , i=1,2,3…… ,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误。当然这是可以通过扩大数组范围避免的)。

12、各类树结构的实现和应用

13、hash,任何一个技术面试官必问(例如为什么一般hashtable的桶数会取一个素数?如何有效避免hash结果值的碰撞)

不选素数的话可能会造成hash出值的范围和原定义的不一致

14.什么是平衡二叉树?

左右子树都是平衡二叉树,而且左右子树的深度差值的约对值不大于1。

15.数组和链表的优缺点

数组,在内存上给出了连续的空间。链表,内存地址上可以是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向的一个,双向链表的话,会有两个)。

数组优于链表的:

A. 内存空间占用的少。

B. 数组内的数据可随机访问,但链表不具备随机访问性。

C. 查找速度快

链表优于数组的:

A. 插入与删除的操作方便。

B. 内存地址的利用率方面链表好。

C. 方便内存地址扩展。

17.最小堆插入,删除编程实现

18. 4G的long型整数中找到一个最大的,如何做?

每次从磁盘上尽量多读一些数到内存区,然后处理完之后再读入一批。减少IO次数,自然能够提高效率。分批读入选取最大数,再对缓存的最大数进行快排。

19. 有千万个string在内存怎么高速查找,插入和删除?

对千万个string做hash,可以实现高速查找,找到了,插入和删除就很方便了。关键是如何做hash,对string做hash,要减少碰撞频率。

20.100亿个数,求最大的1万个数,并说出算法的时间复杂度

在内存中维护一个大小为10000的最小堆,每次从文件读一个数,与最小堆的堆顶元素比较,若比堆顶元素大,则替换掉堆顶元素,然后调整堆。最后剩下的堆内元素即为最大的1万个数,算法复杂度为O(NlogN)

21.设计一个洗牌的算法,并说出算法的时间复杂度。

(1)全局洗牌法

a)首先生成一个数组,大小为54,初始化为1~54

b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 value = rand %54,那么我们的索引牌就和这个余数牌进行交换处理

c)等多索引到54结束后,一副牌就洗好了

(2)局部洗牌法:索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 - index)

算法复杂度是O(n)

22.哈希表冲突解决方法?

常见的hash算法如下:

1.数字分析法

2.平方取中法

3.分段叠加法

4.除留余数法

5.伪随机法

解决冲突的方法:

也叫散列法,主要思想是当出现冲突的时候,以关键字的结果值作为key值输入,再进行处理,依次直到冲突解决

线性地址再散列法

当冲突发生时,找到一个空的单元或者全表

二次探测再散列

冲突发生时,在表的左右两侧做跳跃式的探测

伪随机探测再散列

同时构造不同的哈希函数

将同样的哈希地址构造成一个同义词的链表

建立一个基本表和溢出区,凡是和基本元素发生冲突都填入溢出区

关于面试,关于技术,需要沟通交流点这里

面试,技术,岗位信息全网覆盖中~

一切只为渴望更优秀的自己!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容