阿里实习 电面,面试
今天面试,在某酒店会议室,先是自我介绍,后来根据我简历上做的工作内容问了些问题,
比如正则表达式,
我有提到c++的stl 中的map,他问我哈希的底层是怎么实现的。
后来让当场写一个c++的程序,,输入一个如右图的0,1二维数组(以左上角为初始位置(0,0))以及位置点((i,j)),计算邻居是同值的点的格式。
0 | |||||||
0 | |||||||
0 | |||||||
1 | 1 | 0 | |||||
1 | 0 | 0 | |||||
1 | 1 | 1 | |||||
0 | 0 | 0 | 1 | ||||
功能和思路是对了,如果在电脑上经过多次调试我可以正确的实现程序。
但我当场写的程序,没有回收new的对象(函数结束堆不会自动释放的,),没有返回值(很低级的错,但是我一般写程序就先考虑函数内容,大概功能怎么实现,写完了再补上返回值什么的,这是很不好的习惯,没有一个很全局整体的思路),由于我是递归函数,不断调用的话,没有返回值得函数就不是再最后加上返回值那么简单了,我应该在函数参数里再加上一个数,用于把最后需要返回的值传入每一个调用函数。
总结:面试官很重视你的编程习惯,比如会不会内存泄漏,全局思考。
下面谈谈数周前的电话面试的一些问题。
数据库方面:笛卡尔积
我答错了,我当成join了。
解析:
关系数据库的集合运算 有:合并,查,交(集合运算要求两个关系结构一致)。
例
关系表A: 关系表B:
a | b | c |
1 | 2 | 3 |
2 | 1 | 3 |
a | b | c |
1 | 2 | 3 |
3 | 1 | 2 |
合并运算AυB:
a | b | c |
1 | 2 | 3 |
2 | 1 | 3 |
3 | 1 | 2 |
交运算A∩B
a | b | c |
1 | 2 | 3 |
差运算A-B(A中属于A的元组,但不属于B)
a | b | c |
2 | 1 | 3 |
笛卡尔积A×B(A中每个元组与B中每个元组连接组成的新关系,又叫叉积,交叉连接 )
若A中有属性m,元组k,B中属性n,元组j,则两者叉积的属性有m+n,元组有k*j.
A.a | A.b | A.c | B.a | B.b | B.c |
1 | 2 | 3 | 1 | 2 | 3 |
1 | 2 | 3 | 3 | 1 | 2 |
2 | 1 | 3 | 1 | 2 | 3 |
2 | 1 | 3 | 3 | 1 | 3 |
特殊关系运算:
投影,选择关系A中的若干属性组成新的关系,去掉重复元组。
例:关系A
a | b | c |
1 | 2 | 3 |
2 | 2 | 3 |
∏a,b(A)=
b | c |
2 | 3 |
选择运算:
根据给定条件选择A中若干元组组成新关系 δa='1'(A)=
a | b | c |
1 | 2 | 3 |
连接运算:根据给定条件,从已知的2个关系A和B的笛卡尔积中选择满足连接条件的若干元组组成新的关系。
条件连接,相等连接(条件连接的特例,算子为=),自然连接(A⋈B不包含重复属性),外连接(左连接,右连接)
θ-连接/选择连接 和相等连接[编辑]
考虑分别列出车模和船模的价格的表“车”和“船”。假设一个顾客要购买一个车模和一个船模,但不想为船花费比车更多的钱。在关系上的θ-连接CarPrice ≥ BoatPrice生成所有可能选项的一个表。
|
|
|
如果我们要组合来自两个关系的元组,而组合条件不是简单的共享属性上的相等,则有一种更一般形式的连接算子才方便,这就是θ-连接(或theta-连接)。θ-连接是写为或的二元算子,这里的a和b是属性名字,θ是在集合{<, ≤, =, >, ≥}中的二元关系,v是值常量,而R和S是关系。这个运算的结果由在R和S中满足关系θ的元素的所有组合构成。只有S和R的表头是不相交的,即不包含公共属性的情况下,θ-连接的结果才是有定义的。
这个运算可以用基本运算模拟如下:
- R φ S = σφ(R × S)
在算子θ是等号算子 (=)的时候这个连接也相等连接。
但是要注意,支持自然连接和重命名的计算机语言可以不需要θ-连接,因为它可以通过对自然连接(在没有公共属性的时候的它退化为笛卡尔积)的选择来完成。
自然连接 (⋈)[编辑]
自然连接是写为 (R ⋈ S)的二元运算,这里的R和S是关系。[1]自然连接的结果是在R和S中的在它们的公共属性名字上相等的所有元组的组合。例如下面是表格“雇员”和“部门”和它们的自然连接:
|
|
|
自然连接被确证为最重要的算法之一,因为它的逻辑AND的关系对应者。仔细注意如果同一个变量在用AND连结的两个谓词中出现,则这个变量表示相同的事物而两个出现必须总是由同一个值来代换。特别是,自然连接允许组合有外键关联的关系。例如,在上述例子中,外键成立于从雇员.DeptName到部门.DeptName,雇员和部门的自然连接组合了所有雇员和它们的部门。注意这能工作因为外键在相同名字的属性之间保持。如果不是这样,外键成立于从部门.manager到Emp.emp-number,则我们必须在采用自然连接之前必须重命名这些列。这种自然连接有时叫做相等连接(参见θ-连接)。
更形式的说,自然连接的语义定义为:
- R S = { t s : t R, s S, fun (t s) }
这里的fun(r)是对于二元关系r为真的谓词,当且仅当r是函数二元关系。通常要求R和S必须至少有一个公共属性,但是如果省略了这个约束则在那种特殊情况下自然连接就完全变成上面定义的笛卡尔积。
自然连接可以用Codd的原始运算模拟如下。假定b1,...,bm是公共于R和S的公共属性名字,a1,...,an是唯一于R的属性名字而c1,...,ck是唯一于S的属性名字。进一步假定属性名字 d1,...,dm不在R 和S二者中。第一步我们可以重命名S中的公共属性名字:: S' := ρd1/b1(...ρdm/bm( S)...),接着我们采用笛卡尔积并选择要连接的元组:: T := σb1=d1(...σbm=dm(R × S')...) ,最后我们采用一个投影来去掉重命名的属性:: U := πa1,...,an,b1,...,bm,c1,...,ck(T) 。
分布式问题。有10000台机器,如何获得每台机器的工作状态。
通信,快
TCP/IP,的TCP,uDP,上述分布式用什么协议通信?UDP?
自己做的内容,python爬虫程序,百度知道 特征提取,分类,c++网络图。
TCP协议,针对TCP协议的攻击,对UNIX系统,有什么办法阻止这种攻击。
攻击:3次握手,在第二次和第三次之间,服务器端口上运行的服务在等待第三次握手,而客户端转而建立其他端口的TCP连接,这样建了很多tcp连接,每个端口上运行的服务程序都处于等待状态。消耗系统cpu和内存资源。
unix系统下,可以通过/etc/services 发现哪些服务驻留于哪个端口。
c++,多重继承,析构子类对象的析构顺序。
python 多线程,实际每过。。(默认100条指令)都会中断,提高不了多少效率。
python多线程是基于 Gil(全局解释器锁) 实现的,一个线程拥有了解释器的访问权后,其他所有线程都必须等待它释放解释器的访问权,解释这些线程的下一条指令不会相互影响。这个保护机制粒度很大,是多处理器也变成了单处理器。但若改变成细粒度,会增加很多加锁解锁操作,而加解锁对于OS来说是一个比较重量级的动作,另外没有GIL的保护,编写python扩展模块的难度大大增加。
Python 字节码解释器就是按照指令顺序一条一条地顺序执行,Python内部维护着一个数值,就是Python的内部时钟,若值为N,则意味着每次执行N个指令后应该立即启动线程调度机制,获得内部默认设定的值:
1 >>>import sys 2 >>>sys.getcheckinterval()
100
说明在2.5版本中,Python默认在执行100条指令后启动线程调度,也用于检测是否有异步事件发生。
一个cdn节点的设置要约20w。
class A:public c,public B
{}
先A,后c,最后B。