• 科大讯飞算法笔试1028



    时长120min


    一、选择题(部分,共23题)

    1 资源分配图

    在资源分配图中,通常使用一个矩形或方框来表示一个进程。这个矩形或方框包含有关该进程的信息,如进程的标识符、状态等。资源分配图用于可视化表示系统中的进程、资源和它们之间的关系,以便更好地理解资源的分配和使用情况,以及识别潜在的死锁情况。
    通常,资源分配图中的元素包括:

    • 进程:用矩形或方框表示,通常包含进程的标识符或名称。
    • 资源:通常用椭圆或菱形表示,表示系统中的资源,如打印机、内存块等。
    • 边:用箭头表示资源请求和释放的关系,箭头的方向表示请求和释放的方向。
    • 数量:可以在进程和资源之间的边上标注资源的数量,以表示资源的请求或释放数量。

    2 霍夫圆变换

    霍夫圆变换的目的是检测图像中具有已知半径的圆。**霍夫圆变换需要明确的半径值作为输入参数,以便精确地检测和定位图像中的圆。**在霍夫圆变换中,不应该随意假设半径值。如果半径未知,通常需要采用其他方法来估计或检测半径,然后再应用霍夫圆变换来查找具有已知半径的圆。


    3 特征子集

    一个具有 n 个特征的数据集的特征子集的数量可以通过计算2的n次方来确定,其中 n 是特征的数量。这是因为对于每个特征,可以选择将其包含在子集中(存在)或排除(不存在),这两个选项构成了特征子集的所有可能组合。
    因此,特征子集的数量等于 2 n 2^n 2n


    4 极大似然估计法

    在单变量正态分布情况下,可以使用极大似然估计法来估计均值和方差。极大似然估计法的目标是找到使观测数据出现的概率最大化的参数值。对于单变量正态分布,均值和方差的估计如下:

    1. 均值(μ)的极大似然估计:
      估计均值 μ 的公式是观测数据样本的平均值
    2. 方差(σ²)的极大似然估计:
      估计方差 σ² 的公式是观测数据样本的方差

    极大似然估计法是一种常用的统计方法,用于从观测数据中找出最有可能的分布参数值。


    5 ReLU激活函数

    ReLU激活函数虽然具有许多有利的特性,例如计算复杂度低、非饱和性以及相对较宽的激活边界,但它也具有一个缺点,即神经元的死亡问题。当输入的加权和小于等于零时,ReLU激活函数输出零,这意味着神经元不会激活。在训练期间,如果某些神经元的权重更新导致它们的输出一直为零,那么它们将不再参与梯度下降的更新,导致它们“死亡”,无法学习。这是ReLU的一个潜在问题,尤其在深度神经网络中。


    6 蒙特卡洛(Monte Carlo,MC)方法

    在强化学习中,蒙特卡洛(Monte Carlo,MC)方法用于估计状态的长期价值,其中 gt 表示从 t 时刻开始获得的所有打折回报。蒙特卡洛方法的核心思想是通过采样多条轨迹(或者称为回合)来估计状态的值函数。
    具体而言,蒙特卡洛方法使用从 t 时刻开始的一条轨迹,计算从状态 s 开始获得的打折回报 gt,然后使用这个回报来更新状态 s 的长期价值估计 vs。这是通过对多条轨迹进行平均来实现的。


    7 KNN算法

    KNN算法的步骤包括:

    1. 选择合适的K值:首先,选择一个合适的K值,表示要考虑的最近邻居的数量。
    2. 计算预测样本与训练集中每个样本之间的距离:通常使用欧氏距离或其他距离度量方法来计算预测样本与训练样本之间的距离。
    3. 找出K个最近邻居:将计算的距离按照升序排序,并选择前K个最小距离对应的样本作为K个最近邻居。
    4. 统计K个最近邻居中每个类别的出现次数:对K个最近邻居中的样本标签进行统计。
    5. 预测样本的类别:选择K个最近邻居中出现次数最多的类别作为预测结果。

    8 随机森林

    随机森林通常在基学习器较少的情况下泛化效果相对较差。随机森林的优势通常体现在有大量基学习器(树)的情况下,而且这些树之间是相对独立的

    随机森林引入了两种随机性:通过bootstrap方法随机选择训练数据,以及在每个节点随机选择属性。这些随机性有助于减少过拟合,提高模型的泛化能力,但当基学习器的数量较少时,这些随机性可能会减弱,导致模型的性能不如在基学习器数量较多时。

    通常情况下,随机森林会在有足够多的树和数据时表现出良好的性能,但当基学习器数量较少时,可能不如bagging方法表现出色。


    9 激活函数

    • ReLU(Rectified Linear Unit)激活函数在输入小于零时会输出零
    • Tanh(双曲正切):Tanh激活函数的范围在[-1, 1]之间,因此它可以输出负数的激活值,但它在输入接近零时会接近零,而不是直接变为零。
    • Sigmoid:Sigmoid激活函数的范围在[0, 1]之间,因此它也可以输出正数或负数的激活值,但它在输入远离零时会饱和,接近0或1。
    • ReLU6:ReLU6激活函数是ReLU的变种,它的输出范围在[0, 6]之间。当输入为负数时,它的输出将是零

    10 C和C++

    int、float和double这三种数据类型在C和C++中都是通用的,而bool类型是C++引入的,用于表示布尔值(true或false)


    11 前端文本分析

    前端文本分析模块 g2p(Grapheme-to-Phoneme)的主要作用是将文本中的字母或字形(grapheme)转换为对应的音素(phoneme)。


    12 空洞卷积

    在多尺度目标检测中,使用空洞卷积(dilated convolution)可以改变特征图的感受野,而不改变特征图的大小。

    • Dilation rate(扩张率)用于控制卷积核中间的空洞之间的距离。

    使用dilation rate为2和padding方式为same,输出特征图的宽高将如下计算:

    • 输出宽(output width) = 输入宽(input width) * dilation rate - (dilation rate - 1) - 1


    二、代码题(3题)

    1 文本相似度度量问题——动态规划

    需要计算将一个文本转化为另一个文本所需的最小编辑操作次数

    • 这类问题通常使用编辑距离(Levenshtein距离)或其他文本相似性度量来解决。
    • 编辑距离是一种度量两个字符串之间相似性的方法,可以通过插入、删除和替换字符来将一个字符串转换为另一个字符串。

    输入两个本文。输出第二个文本相比第一个文本而言的话,需要修改或者删除或者替换其中的字所需的最小操作次数。

    计算最小编辑距离通常采用动态规划方法,

    • 它涉及创建一个矩阵,将一个字符串转化为另一个字符串的最小操作次数存储在矩阵中。
    import numpy as np
    
    def edit_distance(str1, str2):
        len1 = len(str1)
        len2 = len(str2)
        
        #dp = np.zeros((len1 + 1, len2 + 1))
        dp = [[0 for _ in range(len2 + 1)] for _ in range(len1 + 1)]
        
        for i in range(len1 + 1):
            dp[i][0] = i
        
        for j in range(len2 + 1):
            dp[0][j] = j
        
        for i in range(1, len1 + 1):
            for j in range(1, len2 + 1):
                cost = 0 if str1[i - 1] == str2[j - 1] else 1
                dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + cost)
        
        return dp[len1][len2]
    
    # 例子
    text1 = "kitten"
    text2 = "sitting"
    distance = edit_distance(text1, text2)
    print("编辑距离:", distance)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28


    代码题2——动态规划

    输入n、m,接下来输入n行m列。表示一个方格形状的地图,有n✖️m个小块,
    各个小块中

    • 正数表示该处有充电设备 及可以获得的电量
    • 反之,负数表示该处需要消耗的电量

    现在有一个机器人,从地图的左上角出发

    • 进入一个小块处后,只能向下或者向右走
    • 最后目标是到达地图的右下角。

    现在,需要计算输出如果需要满足机器人在任何一个块处的电量都不小于1,则初始电量至少是多少

    这个问题可以使用动态规划来解决。

    • 可以从右下角向左上角逆向计算机器人需要的最小初始电量
    • 基本思想是计算每个小块的最小初始电量,从右下角开始,逐渐向左上角推进

    首先,创建一个与地图大小相同的二维数组,用于存储每个小块的最小初始电量。初始化右下角的小块为满足电量需求的最小值,即 m a x ( 1 , 1 − v a l u e ) max(1, 1 - value) max(1,1value),其中 value 为右下角小块的电量。

    然后,从右下角开始逆向遍历地图,计算每个小块的最小初始电量。对于每个小块,它的最小初始电量可以通过以下公式计算:

    min_initial_energy[i][j] = max(1, min(min_initial_energy[i+1][j], min_initial_energy[i][j+1]) - value[i][j])
    
    
    • 1
    • 2

    其中, m i n i n i t i a l e n e r g y [ i + 1 ] [ j ] min_initial_energy[i+1][j] mininitialenergy[i+1][j]表示下方小块的最小初始电量, m i n i n i t i a l e n e r g y [ i ] [ j + 1 ] min_initial_energy[i][j+1] mininitialenergy[i][j+1]表示右侧小块的最小初始电量, v a l u e [ i ] [ j ] value[i][j] value[i][j]表示当前小块的电量。

    • 这个公式确保机器人在当前小块处的电量不小于1,并根据下方小块和右侧小块的情况来计算最小初始电量。

    最后, m i n i n i t i a l e n e r g y [ 0 ] [ 0 ] min_initial_energy[0][0] mininitialenergy[0][0] 将是从左上角出发所需的最小初始电量。


    编码题3——动态规划

    对十一个中文字编码成1到11,一一对应

    • 解码过程发现无法将一段文字一一对应起来,
      • 例如输入 ‘ 221011 ’ ‘221011’ ‘221011’,其中的 11 11 11既可以看作是第十一个文字也可以看作两个第一个文字组合

    输入一段编码字符串,现在需要计算并输出可能情况的总数。

     for i in range(2, n + 1):
            one_digit = int(s[i - 1])
            two_digits = int(s[i - 2:i])
    
            if one_digit >= 1:
                dp[i] += dp[i - 1]
    
            if 10 <= two_digits <= 26:
                dp[i] += dp[i - 2]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    从程序员成长为500强企业的架构师,如何掌控自己的职业生涯?
    如何制作很火的抖音配音?原来爆款短视频配音方法这么简单
    Python基于循环神经网络的情感分类系统设计与实现,附源码
    (附源码)springboot 在线考试系统 毕业设计461317
    JVM内存和垃圾回收-13.垃圾回收算法
    【MySQL】数据类型
    电话呼入呼出场景下是否需要做DDS切换
    教你如何进行Prometheus 分片自动缩放
    Docker学习总结
    ChatGLM OPENCL 和 CUDA 哪个 GPU 加速计算框架更快
  • 原文地址:https://blog.csdn.net/weixin_43338969/article/details/134092798