1. 给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)。
解:先选中前k个, 从第k+1个元素到最后一个元素为止, 以k/i (i=k+1, k+2,...,N) 的概率选中第i个元素,并且随机替换掉一个原先选中的元素, 这样遍历一次得到k个元素, 可以保证完全随机选取。这个算法叫做蓄水池抽样,在某门课上听到的,证明起来也不是很复杂。
证:最后一个元素选中概率=K/N,倒数第2个元素选中概率=(K/N-1)*(1-(K/N)*(1/K))=K/N,以此类推……
2. 如何从n个排序的对象中选择一个,但实现不知道n的大小
解:总是选择第一个对象,并使用1/2的概率选择第二个对象替换,使用1/3的概率选择第三个对象去替换,以此类推。在过程结束时,每个对像被选中的概率都是1/n。
3. 给你一个数组A[1..n],请你在O(n)的时间里构造一个新的数组B[1..n],使得B[i]=A[1]*A[2]*...*A[n]/A[i]。你不能使用除法运算。
解:从前往后扫一遍,然后从后往前再扫一遍。也就是说,线性时间构造两个新数组,P[i]=A[1]*A[2]*...*A[i],Q[i]=A[n]*A[n-1]*...*A[i]。于是,B[i]=P[i-1]*Q[i+1]。
4.Linux的基本命令:
在终端,输入ps命令来查看进程及对应的PID。
ps命令极为常用,用于显示进程信息,参数可省略:
-aux 以BSD风格显示进程 常用
-efH 以System V风格显示进程
-e , -A 显示所有进程
a 显示终端上所有用户的进程
x 显示无终端进程
u 显示详细信息
f 树状显示
w 完整显示信息
l 显示长列表
kill <pid>
通过前面的内容,先查看要关闭的进程及对应的pid。然后在终端输入sudo kill pid即可。kill命令有很多参数选项,其中:
kill -9 pid #用来强制终止指定pid进程(推荐使用此方法)
kill -9 -1 #终止你拥有的全部进程