来自牛客网,答案是我总结的
1、请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什么样的场景
(1)Hadoop
特点:Hadoop是离线计算,基于磁盘,每次运算之后的结果需要存储在HDFS里面,下次再用的话,还需要读出来进行一次计算,磁盘IO开销比较大。底层基于HDFS存储文件系统。
适用场景:适用于离线数据处理和不需要多次迭代计算的场景,并且Hadoop只有Map和Reduce两种接口,相对于Spark来说太少了。(2)Spark
特点:是一种可以基于内存,迭代的计算框架
适用场景:适用于多次迭代的计算模型,诸如各种机器学习算法 ,数据过于繁杂,并且需要让计算通过迭代,并在内存中,极大地提高效率的场景(3)MPI
特点:是一种基于消息传递的并行计算框架。可以理解为是更原生的一种分布式模型
适用场景:适用各种复杂应用的并行计算。支持MPMD( 多程序多数据) ,开发复杂度高
2、请解释tcp连接建立过程,如果可能,请结合相应系统调用函数解释交互过程
tcp通过三次握手协议来建立连接,客户端A向服务器B主动发送请求连接,服务器B收到请求后,发送一个确认给A,A收到B点确认后,还要向B发送一次确认。这时完成三次握手,A进入连接准备状态,B接收到A的确认后,也进入连接准备状态,客户端与服务器开始传送数据。
3、给定一个整数的数组,相邻的数不能同时选,求从该数组选取若干整数,使得他们的和最大,要求只能使用o(1)的空间复杂度。要求给出伪码。
def maxNum(nums: List[int]) -> int:
res = 0
for i in range(len(nums)):
if i>0:
res+=i
else:
i+=1
return res
4、二分查找是常用的编程方法,请用完整代码实现该函数(不许调用库函数)
void *bsearch(const void *key, const void *base, size_t nel, size_t width, int (*compar) (const void *, const void *));
#include<iostream>
using namespace std;
void * bsearch(const void *key, const void *base, size_t nel, size_t width, int (*cmp)(const void *, const void *)){
void *mid = NULL;
int sign;
while (nel > 0) {
mid = (char *)base + width*(nel/2);
sign = cmp(key, mid);
if (sign == 0) return mid;//找到
if (nel == 1) break;
else if (sign < 0)
nel /= 2;//下取整
else {
base = mid;
nel -= nel/2;//上取整
}
}
return NULL;
}
int compare(const void *val1, const void *val2) {
int iVal1 = *(int*)val1;
int iVal2 = *(int*)val2;
if (iVal1 > iVal2) {
return 1;
}
else if (iVal1 == iVal2) {
return 0;
}
return -1;
}
5、有编号1~100个灯泡,起初所有的灯都是灭的。有100个同学来按灯泡开关,如果灯是亮的,那么按过开关之后,灯会灭掉。如果灯是灭的,按过开关之后灯会亮。
现在开始按开关。
第1个同学,把所有的灯泡开关都按一次(按开关灯的编号: 1,2,3,…100)。
第2个同学,隔一个灯按一次(按开关灯的编号: 2,4,6,…,100)。
第3个同学,隔两个灯按一次(按开关灯的编号: 3,6,9,…,99)。
…
问题是,在第100个同学按过之后,有多少盏灯是亮着的?这些灯的编号是多少?要求给出解题思路或给出伪码。
解析:用0 代表 灯灭 1 代表灯亮
用一个[100]×[100]的array数组储存每个人按的状态 index 由1—100 初始值为0
$array[i][j]代表第i个人按了第j盏灯。最后矩阵的列求和,得到是偶数的则是熄灯状态,奇数的是开灯状态。
结果为,10盏,1,4,9,16,25,36,49,64,81,100
import numpy as np
arr = np.zeros([101,101])
for i in range(1,101):
for j in range(1,101):
if j%i==0:
arr[i][j] =1
res = np.sum(arr,axis =0)
for i in range(1,101):
if res[i]%2!=0:
print(i)