机器学习面试八股9




151 在程序里面智能指针的名字是啥?
一个是 shared_ptr 允许多个指针指向同一个对象;
一个是 unique_ptr 独占所指向的对象;
还有一种伴随类 weak_ptr 他是一种弱引用, 指向 shared_ptr 所指向的对象。
152new,malloc 区别
1).malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于
申请动态内存和释放内存。
2).对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象在
创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free
是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的
任务强加于 malloc/free。
3).因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以一个能完成
清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。
4).C++程序经常要调用 C 函数,而 C 程序只能用 malloc/free 管理动态内存
153 虚函数和纯虚函数的区别
含有纯虚函数的类称为抽象类,只含有虚函数的类不能称为抽象类。
虚函数可以直接被使用,也可以被子类重载以后以多态形式调用,
而纯虚函数必须在子类中实现该函数才可使用,因为纯虚函数在基类中只有声明而没有定义。
虚函数必须实现,对虚函数来说父类和子类都有各自的版本。
154 纯虚函数怎么定义,写一个出来
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现
而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
纯虚函数是一种特殊的虚函数,它的一般格式如下:
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
…
};
155 函数后面接 const 是什么意思?
这是把整个函数修饰为 const,意思是“函数体内不能对成员数据做任何改动”。如果你声
明这个类的一个 const 实例,那么它就只能调用有 const 修饰的函数
156 函数指针
指向函数的指针 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分
配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这
个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针
变量,简称函数指针。
157c++的一些库吗?
标准库
C++标准库,包括了 STL 容器,算法和函数等。
C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是 C++ISO 自身标
准的一部分。
Standard Template Library:标准模板库
C POSIX library:POSIX 系统的 C 标准库规范
ISO C++ Standards Committee:C++标准委员会
框架
C++通用框架和库
Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的集合
ASL:Adobe 源代码库提供了同行的评审和可移植的 C++源代码库。
Boost:大量通用 C++库的集合。
BDE:来自于彭博资讯实验室的开发环境。
Cinder:提供专业品质创造性编码的开源开发社区。
Cxxomfort:轻量级的,只包含头文件的库,将 C++ 11 的一些新特性移植到 C++03 中。
Dlib:使用契约式编程和现代 C++科技设计的通用的跨平台的 C++库。
EASTL:EA-STL 公共部分
ffead-cpp:企业应用程序开发框架
Folly:由 Facebook 开发和使用的开源 C++库
JUCE:包罗万象的 C++类库,用于开发跨平台软件
libPhenom:用于构建高性能和高度可扩展性系统的事件框架。
LibSourcey :用于实时的视频流和高性能网络应用程序的 C++11 evented IO
LibU:C 语言写的多平台工具库
Loki:C++库的设计,包括常见的设计模式和习语的实现。
MiLi:只含头文件的小型 C++库
openFrameworks :开发 C++工具包,用于创意性编码。
Qt:跨平台的应用程序和用户界面框架
Reason:跨平台的框架,使开发者能够更容易地使用 Java,.Net 和 Python,同时也满足了
他们对 C++性能和优势的需求。
ROOT:具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,
为欧洲原子能研究机构所用。
STLport:是 STL 具有代表性的版本
STXXL:用于额外的大型数据集的标准模板库。
Ultimate++:C++跨平台快速应用程序开发框架
Windows Template Library:用于开发 Windows 应用程序和 UI 组件的 C++库
Yomm11:C++11 的开放 multi-methods.
158Python 中的各种锁:
一、全局解释器锁(GIL)
1、什么是全局解释器锁
每个 CPU 在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器 ,
使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只
有一个线程使用 cpu,这样的机制称为全局解释器锁(GIL)。GIL 的设计简化了 CPython 的
实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,
锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计
算能力。
2、全局解释器锁的好处
1)、避免了大量的加锁解锁的好处
2)、使数据更加安全,解决多线程间的数据完整性和状态同步
3、全局解释器的缺点
多核处理器退化成单核处理器,只能并发不能并行。
4、GIL 的作用:
多线程情况下必须存在资源的竞争,GIL 是为了保证在解释器级别的线程唯一使用共享资源
(cpu)。
二、同步锁
1、什么是同步锁?
同一时刻的一个进程下的一个线程只能使用一个 cpu,要确保这个线程下的程序在一段时
间内被 cpu 执,那么就要用到同步锁。
2、为什么用同步锁?
因为有可能当一个线程在使用 cpu 时,该线程下的程序可能会遇到 io 操作,那么 cpu 就会
切到别的线程上去,这样就有可能会影响到该程 序结果的完整性。
3、怎么使用同步锁?
只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。
4、同步锁的所用:
为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。
三、死锁
1、什么是死锁?
指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当
而相互等待的一个现象。
2、死锁产生的必要条件?
互斥条件、请求和保持条件、不剥夺条件、环路等待条件
3、处理死锁的基本方法?
预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤
销进程
四、什么是递归锁?
在 Python 中为了支持同一个线程中多次请求同一资源,Python 提供了可重入锁。这个
RLock 内部维护着一个 Lock 和一个 counter 变量,counter 记录了 acquire 的次数,从而使得
资源可以被多次 require。直到一个线程所有的 acquire 都被 release,其他的线程才能获得
资源。递归锁分为可递归锁与非递归锁。
五、什么是乐观锁?
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
六、什么是悲观锁?
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
七、python 常用的加锁方式?
互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁。
159Linux:ELF 的 bss 段
ELF 是 Linux 系统下的一种可执行可链接文件的格式,而 bss 段则是用于存放程序中未初始化
的全局变量和静态局部变量。
160ip 报文经过一个路由器改变哪些字段?
源目的 MAC 改变,TTL 减 1
161 大小端存储:
• 大端(存储)模式:是指一个数据的低位字节序的内容放在高地址处,高位字节序存的
内容放在低地址处。
• 小端(存储)模式:是指一个数据的低位字节序内容存放在低地址处,高位字节序的内
容存放在高地址处。(可以总结为“小小小”即低位、低地址、小端)
162count(*),count(1)和 count(列名)的区别
count(*),count(1)在统计的时候不会忽略 Null,count(列名)在统计的时候会忽略 Null
列名为主键,count(列名) 会比 count(1) 和 count(*) 快;
多列且没有主键,count(1) 执行会比 count(*) 快。
若表中只有一个字段则 count(*)最快。
163 排序
链接
在这里插入图片描述
164Python 以一定的概率生成某个数
链接
165Python 中列表( List )中的 del,remove,和 pop 等的用法和区别
链接
pop
value = List.pop(index)
pop 按照索引位置删除元素;
无参数时默认删除最后一个元素
返回删除的元素值
remove
remove 按照值删除,删除单个元素,
删除首个符合条件的元素,
返回值为空 None
del
del 根据索引位置来删除单个值或指定范围内的值
del 是删除引用(变量)而不是删除对象(数据),对象由自动垃圾回收机制(GC)删除
del List_del_1[1]
del List_del_2[2:4] # 删除[2,4)索引范围内的值
del List_del_3
166@property 与 @staticmethod 与 @classmethod 装饰器的介绍与使用@property 是 python
的一种装饰器,是用来修饰方法的。通俗的理解就是:用访问类属性的方式,直接调用类
方法
作用:
可以使用@property 装饰器来创建只读属性,@property 装饰器会将方法转换为相同名称的
只读属性
可以与所定义的属性配合使用,这样可以防止属性被修改。
对类的私有属性进行操作
@staticmethod
普通的类内函数是需要实例化之后才可以调用的,但是 @staticmethod 静态方法无需实例
化也可直接调用
@classmethod
@classmethod 类方法无需实例化也可直接调用。@classmethod 装饰器定义的类方法需要传
入类参数 cls
167 五大常见 Python 中错误和异常
捕获异常 try 。。。except。。。else。。。finally
断言(assert)
抛出异常(raise)
sys.exc_info()
168python 中[0 ]* n 与[0 for _ in range(n)]的区别与联系
[0 ]* n 与[0 for _ in range(n)]区别:前者是浅拷贝,也就是把一个列表重复了 n 次,而后者
才是创建,深拷贝
浅复制:每一行的改变都会改变其他行。
169 极大似然估计
利用实验结论反推模型参数,这就是“似然”(Likelihood)。
最大似然估计就是:通过真实的实验结果来推测未知的模型的参数,也就是找到一个合理
的模型参数,使得实验发生的这个事实存在的概率最该。
170 等概率输出 0 和 1
链接
一个随机数发生器,以概率 P 产生 0,概率 (1-P) 产生 1,请问能否利用这个随机数发生器,
构造出新的发生器,以 1/2 的概率产生 0 和 1 。请写明结论及推理过程。( 注意:这里的
p 相当于是未知的,后文会提到已知 p 的类型,解题思路是不同的 )
知随机数生成函数 f(),返回 0 的概率是 60%,返回 1 的概率是 40%。根据 f()求随机数函数
g(),使返回 0 和 1 的概率是 50%,不能用已有的随机生成库函数
Python 写法有答案