1、BN过程,为什么测试和训练不一样?
对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。
而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。
对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,gamma和bata。
2、Leeetcode:160相交链表
方法一:暴力解法
对于A中的每一个结点,我们都遍历一次链表B查找是否存在重复结点,第一个查找到的即第一个公共结点。
class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:p = headAwhile p:q = headBwhile q:if p == q:return pq = q.nextp = p.nextreturn p
时间复杂度:O(n^2)
空间复杂度:O(1)
无法通过,会超时。
方法二:
对暴力解法的一个优化方案是:先将其中一个链表存到哈希表中,此时再遍历另外一个链表查找重复结点只需 O(n) 时间。
class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:s = set()p,q = headA,headBwhile p:s.add(p)p = p.nextwhile q:if q in s:return qq = q.nextreturn None
时间复杂度:O(n)
空间复杂度:O(n)
方法三:走过彼此的路
利用两链表长度和相等的性质来使得两个遍历指针同步。
具体做法是:让两指针同时开始遍历,遍历到结尾的时候,跳到对方的头指针,如果有公共结点,则,会同时到达相遇的地方。
代码如下:
class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:p,q = headA,headBwhile p != q:p = p.next if p else headBq = q.next if q else headAreturn p
时间复杂度:O(n)
空间复杂度:O(1)
3、概率题:两个人轮流抛硬币,抛到正面获胜,反面给对方。先抛的人胜率是多少?
先抛的人胜率是 2/3
A先,B后P(A) = 1/2 +//A直接取胜 1/2 * 1/2 * 1/2 +// A1失败B1失败A2取胜1/2 * 1/2 * 1/2 * 1/2 *1/2 + //A1失败B1失败A2失败B2失败A3取胜...p(A) = 1/2 + (1/2)^3 + (1/2)^5 + (1/2)^7 + ...等比数列求和p(A) = 1/2 * (1 - (1/4)^n) / (1 - 1/4) = 2/3P(B) = 1/2 * 1/2 +// A1失败B1取胜1/2 * 1/2 * 1/2 * 1/2 +// A1失败B1失败A2失败B2取胜1/2 * 1/2 * 1/2 * 1/2 * 1/2 * 1/2 + //A1失败B1失败A2失败B2失败A3失败B3取胜、... p(B) = (1/2)^2 + (1/2)^4 + (1/2)^6 + ..p(B) = 1/4 * (1 - (1/4)^n) / (1 - 1/4) = 1/3
如果觉得《字节跳动计算机视觉算法工程师面试题(秋招)》对你有帮助,请点赞、收藏,并留下你的观点哦!