Fork me on GitHub

笔试面试知识点

C/C++/STL/Python(熟练)

  1. 静态成员
  2. 多态,虚函数理解(虚表指针):c++虚函数实现机制及内存模型

C:内存对齐,字符串,指针,文件操作

1. 字节对齐

解析:对于单层结构体要遵循下面2个原则:

(1)结构体变量中每个成员的偏移量都要是其自身大小的整数倍(第一个成员直接不用看可以,因为其偏移量为0,而任何数的0倍都是0),不是整数倍要在上一个成员后面补字节.

(2)结构体大小(包含补上的字节大小)必须是所有成员大小(成员自身大小,不包含在其后面补上的字节)的整数倍,也即所有成员大小的公倍数。不是整数倍要在最后一个成员后面补字节

对于嵌套的结构体需要将其展开。对结构体求sizeof时,上述两种原则变为:

(1)展开的子结构体中的第一个成员的偏移量应当是父结构体中除子结构体外最大成员大小的整数倍。

(2)结构体大小必须是所有成员大小的整数倍,这里所有成员计算的是展开后的成员,而不是将子结构体当做一个整体。

Sizeof()类,虚函数的内存结构

#pragma pack(2)

class BU

{

    int number; //4

    union UBffer

    {

        char buffer[13];

        int number;

    }ubuf; //16

    void foo(){} //0

    typedef char*  (*f)(void*); //0

    enum{ hdd, ssd, blueray }disk; //4

}bu;

2.指针++:

main()

{

    char*a[]={"work","at","alibaba"};

    char**pa=a;

    pa++;

    printf("%s",*pa); //at

}

 

C++:string,封装,继承,多态,输入输出流,STL,模板

C++知识清单:http://www.forz.site/categories/C/

3.C/C++四种类型转换

4.静态成员

解析:类的静态成员属于整个类 而不是某个对象,可以被类的所有方法访问,子类当然可以使用父类静态成员;静态成员无多态性!静态方法属于整个类,在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存,所有静态方法只能访问静态成员,不能直接访问非静态成员;静态成员可以被任一对象修改,修改后的值可以被所有对象共享。

静态成员可以实现多个对象之间的数据共享。静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员(这点非常重要)。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);

5.public, protected, private继承成员之间的访问关系

6.多态,虚函数理解(虚表指针)

7.STL迭代器失效

数据结构+图像处理+机器学习和深度学习在计算机视觉中的应用(熟练)

数据结构:

  1. 链表:(链表反转,插入排序,归并排序)
  2. 栈:(辅助实现DFS,Get Max Stack, 两个栈实现队列,Sort Stack, Validate parenthesis,二叉树中序遍历,Evaluate Expression,链表环判断,中序,后缀表达式求值及其相互转化):
  3. 队列:(生产者-消费者,Queue with Max)
  4. 模式匹配KMP算法
  5. 树的先,中,后非递归遍历
  6. 二叉排序树的查找,插入,删除操作
  7. 二叉排序树节点的下一个节点
  8. 平衡二叉树,查找,插入,删除操作
  9. B-/+树基本概念,查找,插入,删除操作

(B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;1/3的数据到新结点,最后在父结点增加新结点的指针;所以,B*树分配新结点的概率比B+树要低,空间使用率更高。)

  1. Trie树(字典树)基本概念
  2. Hash表,哈希函数和冲突处理方法
  3. Dijkstra算法
  4. 最小生成树prim,krustral算法
  5. 拓扑排序,AOV,AOE,关键路径算法
  6. 所有排序算法

经典问题:

1. 最长公共子序列(longest common sequence)和最长公共子串(longest common substring)及其变形

2. DFS

3. BFS

4. 递归

5. 动态规划

图像处理:

1. 对比度拉伸,直方图均衡,直方图匹配

2. 仿射变换,透视变换

3. 连通域求解

5. Bow

机器学习: https://www.zhihu.com/question/59683332/answer/281642849

1.SVM理解

2.LR推导

3.最小二乘法

4. 熵的相关知识:https://blog.csdn.net/rtygbwwwerr/article/details/50778098

什么是信息量: 一个事件发生的概率越大,则它所携带的信息量就越小; H(x)=- log(p(x));

什么是熵:熵其实是信息量的期望值,它是一个随机变量的确定性的度量。熵越大,变量的取值越不确定,反之就越确定。

什么是相对熵:相对熵(relative entropy)又称为KL散度(Kullback-Leibler divergence),KL距离,是两个随机分布间距离的度量。记为DKL(p||q);它度量当真实分布为p时,假设分布q的无效性。Dkl(p||q)=H(p,q)-H(p)

交叉熵: 与上一节定义的相对熵仅相差了H(p),当p已知时,可以把H(p)看做一个常数,此时交叉熵与KL距离在行为上是等价的,都反映了分布p,q的相似程度。最小化交叉熵等于最小化KL距离。它们都将在p=q时取得最小值H(p)(p=q时KL距离为0)

深度学习:

  1. BP算法
  2. 各类优化算法

操作系统+linux(知道重要的)

  1. 页面置换算法
  2. TCP/IP协议

解析:TCP建立连接时,首先客户端和服务器处于close状态。然后客户端发送SYN同步位,此时客户端处于SYN-SEND状态,服务器处于lISTEN状态,当服务器收到SYN以后,向客户端发送同步位SYN和确认码ACK,然后服务器变为SYN-RCVD,客户端收到服务器发来的SYN和ACK后,客户端的状态变成ESTABLISHED(已建立连接),客户端再向服务器发送ACK确认码,服务器接收到以后也变成ESTABLISHED。然后服务器客户端开始数据传输

在计算机操作系统中,PV操作是进程管理中的难点。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
    P(S):①将信号量S的值减1,即S=S-1;
           ②如果S>0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
    V(S):①将信号量S的值加1,即S=S+1;
           ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。

什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
     一般来说,信号量S³0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S£0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

    利用信号量和PV操作实现进程互斥的一般模型是:
进程P1              进程P2           ……          进程Pn
……                  ……                           ……
P(S);              P(S);                         P(S);
临界区;             临界区;                        临界区;
V(S);              V(S);                        V(S);
……                  ……            ……           ……

    其中信号量S用于互斥,初值为1。
    使用PV操作实现进程互斥时应该注意的是:
    (1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
    (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
   (3)互斥信号量的初值一般为1。

    利用信号量和PV操作实现进程同步
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
    使用PV操作实现进程同步时应该注意的是:

    (1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
    (2)信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
    (3)同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。

 

计算机网络

  1. TCP/IP协议
  2. http中get,post区别:

操作方式

数据位置

明文密文

数据安全

长度限制

应用场景

GET

HTTP包头

明文

不安全

长度较小

查询数据

POST

HTTP正文

可明可密

安全

支持较大数据传输

修改数据

数据库

 

posted @ 2017-12-23 20:23  ranjiewen  阅读(590)  评论(0编辑  收藏  举报