C语言面试宝典题目分析(三)

今天又看了几个题,也做了简单的补充。

同前,黑色文字为原文,红色为补充。


3、.h头文件中的ifndef/define/endif 的作用?

答:防止该头文件被重复引用。

 

4、#include<file.h> 与 #include"file.h"的区别?

答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

 

5、描述实时系统的基本特性

答 :在特定时间内完成特定的任务,实时性与可靠性。

评注:实时系统强调在某一个确定的时间完成任务,比这个时间早或者晚都是不符合要求的。

 

6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

答 :全局变量储存在静态数据区,局部变量在堆栈中。

评注:static也存储与静态数据区。

7、什么是平衡二叉树?

答 :左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。

评注:比如最常见的红黑树。这几天阅读侯捷大人的《stl源码剖析》,sgi stl 的set和map的底层机制就是rb-tree。前一段时间听寝室哥们说Java的集合框架也是这么实现的,过两天看一下再说。

二叉树最常用的就是下面的二叉搜索树,又称二叉查找树,二叉排序树(这货绰号挺多啊)。百度百科:

二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树

因为树高为logn+1,所以在查找时可以降低运算的时间复杂度,不过在插入的时候也略微提高了复杂度(如果跟直接插入的常数时间操作相比)。

 

8、堆栈溢出一般是由什么原因导致的?

答 :1.没有回收垃圾资源

2.层次太深的递归调用

评注:堆和栈分开说是不是更好一些。不过我对底层的东西知道的太少了,下面的说法只是触及皮毛。

没有垃圾回收(?哦不,它想说的一定是没有delete,或者是不正确的delete导致的内存泄漏)会引起堆溢出,毕竟堆内存更多的被用来分配给动态创建的变量。

层次太深的递归调用往往导致栈溢出,因为调用函数当中的局部变量(除了new出来的都算)都在栈当中开辟空间。

 

9、冒泡排序算法的时间复杂度是什么?

答:O(n^2)

评注:经典的排序算法有:

1)插入排序:以升序为例,取一待排序元素插入已排序序列,从末端插入依次与前一元素比较,若待插入元素小于此元素,交换位置。重复上面的行为直到待插入元素大于其前一元素。其中,n个元素需要插入n次,最坏的情况下肯能会在第k次插入时比较k-1次,算法时间复杂度为

2)选择排序:以升序为例,排序中总是选择未排序元素中最小的元素放入排序结果,因而称为选择排序。实现过程中有两层循环嵌套,算法复杂度为

3)归并排序:递归地对待排序序列分为两段进行排序,然后合并。在stl源码当中,listsort函数采用的便是非递归的归并排序,按照其思路,对于序列{1,24,4,5,6,3,2,3,4}进行升序排序,则依次有:

1

1,24----merge(1,24)

1,24,4

1,24,4,5--------merge(4,5)

1,4,5,24--------merge({1,24},{4,5})

….

实际上,排序的全过程会经历lognmerge,而每次merge的复杂度为n,那么归并算法的复杂度为O(nlogn)

4)希尔(shell)排序:希尔排序是插入排序的一种优化。插入排序其实就是希尔排序的1-sort,由于在比较糟糕的情况下,插入排序的比较次数会非常多,最坏的时候达到k-1次,希尔排序通过一系列粗略排序(比如7-sort)来避免最终1-sort的时候出现最坏情况。

5)快速排序:快排和下面的堆排序都是比较有趣的排序方式,快排的实现当中一个重要的方法就是partition,大家似乎也已经非常接受这个名字了。这个方法用来在确定了划分序列的key以后将序列调整为小于key和大于key的两个部分,key为两个部分的分界线。快排可以通过递归调用上述方法来对划分好的序列继续划分,直到子序列已排序(在元素较少的情况下,果断改用简单的算法排就好了,所以就没必要继续递归,因此这里不说递归到只剩一个元素= =、)。整体感觉还跟归并排序有那么一点儿像。

6)堆排序:首先要把序列调整为二叉堆(Binary heap,中文名咋那么难听),然后将根节点和末节点交换,并把交换后的末节点移除二叉堆(因为这就是排序完成以后的最后一个元素了),然后将新的根节点调整到合适的位置,使其符合二叉堆的条件,然后重复上面的交换工作。即:

1. unsorted array  2. binary heap  3. exchange rootwith the last node

4. remove new last from heap  5. sink the newroot  6. if last isn’t theroot,then to 3

堆排序是最让我觉得厉害的一种排序算法,特别是脑子里面浮现出二叉树节点交换的画面跟变戏法似的(请宽恕我没见过世面吧)。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值