《C++开发工程师岗位必备知识点五》

①判断图是否有回路问题

 1.DFS,深度优先遍历:从一个顶点出发存在搜回到自己的路径。

 2.拓扑排序:是对有向无回路图进行排序,以期找到一个线性序列,这个线性序列可以表示某些事情完成的相应顺序。

    如果说所求的图有回路的话,则不可能找到这个序列。

 3.求最短路径:有环则最短路径为零。

②广度优先搜索、深度优先搜索理解

深度优先搜索:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问  的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。深度优先搜索是一个递归的过程。

广度优先搜索:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。也就是说广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2...的顶点。

③循环队列的理解

1、队列添加元素是在对尾,删除元素是在对头; 2、添加元素,尾指针rear+1 ; 删除元素,头指针front+1;

④基于比较的内部排序理解

基于关键字的比较操作排序方法,其排序过程均可以利用判定树来描述。判定树上所有叶子结点恰好表示所有排序结果,每个初始序列经过排序达到有序所需要进行的比较次数,正好等于从树根到和该序列相应的叶子结点的路径长度。由于含n个记录的序列可能出现的初始状态有n!个,则描述n个记录排序过程的判定树必须有n!个叶结点。因为,若少一个叶结点,则说明尚有两种状态没有分辨出来。由于若二叉树高度为h,则叶子结点的个数不超过2h-1个;反之,若有u个结点,则二叉树的高度至少为log2u(向上取整,以2为底u的对数)。因此,描述n个记录排序的判定树上必定存在一条长度为的路径。

⑤内联函数理解

程序中总是会定义很多函数,以供调用,但是调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行。C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。例如:

//求0-9的平方
inline int inlineFunc(int num)
{  
  if(num>9||num<0)
      return -1;  
  return num*num;  
}  

int main(int argc,char* argv[])
{
    int a=8;
    int res=inlineFunc(a);
    cout<<"res:"<<res<<endl;
}
inline之后的main函数代码可以理解为如下形式:

int main(int argc,char* argv[])
{
    int a=8;
    {  
        int _temp_b=8;  
        int _temp;  
        if (_temp_q >9||_temp_q<0) _temp = -1;  
        else _temp =_temp*_temp;  
        b = _temp;  
    }
}  
这就是所谓的内联展开。

⑥程序内存占用问题汇总

栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 
堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 
自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。 
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多) 

⑦中间件的理解

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。(简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)

中间件特点的描述:

1. 中间件应支持标准的协议和接口

2. 中间件可运行于多种硬件和操作系统平台上

3. 跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互

⑧前、中、后缀表达式理解

总体方法:前缀表达式,从右往左扫描,遇到操作数压栈,遇到操作符出栈两个数运算,其结果入栈; 后缀表达式,从左往右扫描,遇到操作数压栈,遇到操作符出栈两个数运算,其结果入栈。重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。例子如下:

前缀形式为:+-*^ABCD/E/F+GH

1) 首先扫描 H,是数字 入栈 ,栈中为: H

2) 扫描 G 为数字 入栈 ,栈中为:G,H

3)扫描+ 为运算符 ,依次弹出G ,H ,得到 G+H 的结果 入栈,栈中为: G+H(在这里方便讲解 标记为  G+H)

4)扫描 F 为数字 ,入栈 ,栈中为  F, G+H

5)扫描 / 为运算符, 依次弹出 F,G+H ,计算F/(G+H) 的结果入栈 ,栈中为 F/(G+H)

6)扫描 E 为数字,入栈,栈中为 E,  F/(G+H)

7) 扫描 / 为运算符, 依次弹出E, F/(G+H) ,计算 E/(F/(G+H))

8)扫描 D 为数字,入栈 栈中为:D, E/(F/(G+H))

9) 扫描 C 为数字,入栈 栈中为:C,D, E/(F/(G+H))

10) 扫描 B 为数字,入栈 栈中为:B,C,D, E/(F/(G+H))

11) 扫描 A 为数字,入栈 栈中为:A,B,C,D, E/(F/(G+H))

12) 扫描^ 为运算符,依次弹出 A,B 计算 A^B的结果入栈, 栈中为:A^B ,C,D, E/(F/(G+H))

13) 扫描*为运算符,,依次弹出 A^B,C 计算 A^B*C的结果入栈, 栈中为:A^B* C,D, E/(F/(G+H))

14) 扫描-为运算符,,依次弹出 A^B*C,D 计算 A^B*C-D的结果入栈, 栈中为:A^B* C-D, E/(F/(G+H))

15) 扫描+为运算符,,依次弹出 A^B*C-D, E/(F/(G+H))   计算 A^B*C-D+  E/(F/(G+H)) 的到结果

最后得到的中缀表达式为:  A^B* C-D+ E/(F/(G+H))

⑨广义表理解

规定用小写字母表示原子,用大写字母表示广义表的表名。例如:

    A=()
    B=(e)
    C=(a,(b,c,d))
    D=(A,B,C)=((),(e),(a,(b,c,d)))
    E=((a,(a,b),((a,b),c)))

其中A是一个空表,其长度为0;

B是只含有单个原子e的表,其长度为1;

C有两个元素,一个是原子a,另一个是子表,其长度为2;

D有三个元素,每个元素都是一个表,其长度为3;

E中只含有一个元素,是一个表,它的长度为1;

任何一个非空广义表GL均可分解为表头head(GL) = a1和表尾tail(GL) = ( a2,…,an) 两部分。

⑩构造函数与成员函数,析构函数

构造函数是一种特殊的成员函数,可以根据参数的不同实现函数重载。析构函数没有参数,对于一个类来说也是唯一的,所以是不能重载的。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值