2020秋招 携程算法岗笔试编程题解答

这篇博客详细解答了2020年携程算法岗位笔试中的三道编程题:矩阵求导,比当前数大的最小递减数和排版问题。矩阵求导涉及张量运算和权值共享的梯度累加;递减数问题通过特定策略调整数字确保递减;排版问题采用递归算法计算排列组合。
摘要由CSDN通过智能技术生成

矩阵求导

题目:
给出一个5*2*2的张量A,一个2*2*2的张量B,一个5维向量M;M中的元素为0或者1。我们执行这样的矩阵乘法
pointwise_matmul(A[1,2,3,4,5],B[M])
即让i=1:5, A[i] 对应的2*2矩阵和B[M[i]]对应的2*2矩阵两两之间做矩阵乘法,这样将得到5个结果2*2矩阵,即输出5*2*2的张量Z。
现在给出A,B,M和Z的导数dZ,请问A,B,M的导数dA,dB和dM分别为何?

解答:
这是一道概念题。熟悉多元函数微分学的同学很容易就能写出矩阵求导的公式。
除此之外,B[M[i]]中涉及权值共享,这是我们在使用tensorflow等库时常用的操作。根据计算图模型的理论,共享的权值的梯度应该是累加的。
由此我们就能很快给出解答。

#!/bin/python
# -*- coding: utf8 -*-
import sys
import os
import re


class Matrix:
    def __init__(self, shape, data: list):
        self.shape = shape
        self.data = data
        self.length = self.shape[0] * self.shape[1]

    def _verify(self, location):
        assert location[0] < self.shape[0] and location[1] < self.shape[1]

    def __getitem__(self, location):
        self._verify(location)
        return self.data[location[0] * self.shape[1] + location[1]]

    def __setitem__(self, location, value: int):
        self._verify(location)
        self.data[location[0] * self.shape[1] + location[1]] = value

    def transpose(self):
        transposed_data = [self.data[i * self.shape[1] + j] for j in range(self.shape[1]) for i in range(self.shape[0])]
        return Matrix((self.shape[1], self.shape[0]), transposed_data)

    def reshape(self, shape):
        self.shape = shape

    @staticmethod
    def matmul(ma, mb):
        assert ma.shape[1] == mb.shape[0]
        mc = Matrix.zeros((ma.shape[0], mb.shape[1]))
        for i in range(mc.shape[0]):
            for j in range(mc.shape[1]):
                mc[i, j] = sum([ma[i, k] * mb[k, j] for k in range(ma.shape[1])])
        return mc

    def __add__(self, other):
        if 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值