[OJ]平均串问题,存在超时问题未解决

news2024/9/20 1:09:36

众所周知,两个数a和b的平均数计算公式为(a+b)/2。
实际上平均数也可以描述为:从较小的数依次遍历到较大的数,将遍历的数放入一个列表中,该列表的中心元素。例如:求
3和7的平均数,列表为{3,4,5,6,7},平均数即为中心元素5。
类似的可以定义两个字符串A和B的平均串:设A的字典序小于B,,将由A按字典序生成B依次产生的字符串放入一个集合中,
该集合的中心元素即为平均串。例如求AZ和BF的平均串,按字典序生成的集合为{AZ,BA,BB,BC,BD,BE,BF},取中心元素BC即
为平均串。
给定两个长度相同,内容均为大写字母的字符串s1和s2,s1的字典序小于s2,输出它们的平均串。
在这里插入图片描述
在这里插入图片描述

1.暴力解决方法:使用大量递归,并占用大量内存,罗列每一个数,空间复杂度和时间复杂度极高

import sys
sys.setrecursionlimit(100000000) #例如这里设置为十万 
def main():
    #code here
    global s1,s2,s
    s1=input().strip()
    s2=input().strip()
    s=s1

    if s1.isupper() and s2.isupper() and len(s1)==len(s2) and (len(s1)>=1 and len(s1)<=200000):
        global newStr,count
        count=1
        newStr=[]
        newStr.append(s1)
        meanString(len(s1)-1)
        if count%2!=0:
            global meanStr
            meanStr=count//2+1
            #subStr=newStr[1015:]
            
            addString(len(s1)-1)
            print(s)
        pass

#在s1的基础上,加上count//2
def addString(k):
    global meanStr,s
    for i in range(k,-1,-1):
        while meanStr>1 and s<s2:
            if i==len(s)-1 and ord(s[i])!=90:
                meanStr-=1
                s=s[:i]+s[i].replace(s[i],chr(ord(s[i])+1))+s[i+1:]
            else:
                if ord(s[i])!=90:    
                    s=s[:i]+s[i].replace(s[i],chr(ord(s[i])+1))+s[i+1:]
                    i=len(s)-1
                    s=s[:i]+s[i].replace(s[i],chr(ord(s[i])-25))+s[i+1:]
                    meanStr-=1
                    addString(i)
                elif ord(s[i])==90:
                    addString(i-1)

#通过Ascii码进行比较 A=65 Z=90
def meanString(k):
    global s1,s2,newStr,count
    #通过首字母,保证s1的字典序小于s2
    #生成奇数个字符串 
    if s1<s2:#回溯
            for i in range(k,-1,-1):#从后往前循环
                #针对最后一个数
                while s1<s2: 
                    if i==len(s1)-1:                
                            if ord(s1[i])<90:
                                #将最后一个字符串替换                        
                                s1=s1[:i]+s1[i].replace(s1[i],chr(ord(s1[i])+1))+s1[i+1:]
                                count+=1
                                newStr.append(s1)
                            elif ord(s1[i])==90:
                                i-=1
                                meanString(i)
                                break
                    elif i!=0:            
                            if ord(s1[i])<90:   
                                s1=s1[:i]+s1[i].replace(s1[i],chr(ord(s1[i])+1))+s1[i+1:]
                                i=i+1                 
                                s1=s1[:i]+s1[i:].replace(s1[i],chr(ord(s1[i])-25))
                                i=len(s1)-1 
                                count+=1
                                newStr.append(s1)
                                meanString(i)
                                break                     
                            elif ord(s1[i])==90:
                                i-=1
                                meanString(i)
                                break
                    elif i==0: 
                            if ord(s1[i])<90:
                                s1=s1[:i]+s1[i].replace(s1[i],chr(ord(s1[i])+1))+s1[i+1:] 
                                i=i+1                                  
                                s1=s1[:i]+s1[i:].replace(s1[i],chr(ord(s1[i])-25))
                                i=len(s1)-1
                                count+=1 
                                newStr.append(s1)   
                                meanString(i)
                                break
                            elif ord(s1[i])==90:
                                break

if __name__ == '__main__':
    main();

运行结果如下:
在这里插入图片描述在这里插入图片描述问题:当字符长度为4时,进行上千次递归,程序出现问题,闪退
在这里插入图片描述
2.规律总结方法:

‘’’
规律总结:
AZ–DF : 1+52+6=59 (count=59)
(Z-Z+1):表示最后一位数,+1表示加上最开始的AZ,这里为1
(D-A-1)*26:表示BA–BZ…CA–CZ,,这里为52
(F-A)+1:表示从DA–DF之间的数,+1表示加上最后的DF这里为6
ABF–DDH:21+624+1352+78+7=2083(count=2083)
(Z-F+1):表示最后一位数ABF–ABZ,+1表示最开始的ABF,这里为21
(Z-B)*26:表示ACA–ACZ…AZA–AZZ,这里为624
(D-A-1)2626:表示BAA–BZZ…CAA–CZZ,这里为1352
(D-A)*26:表示从DAA–DAZ…DCA–DCZ,这里为78
(H-A+1):表示DDA–DDH,+1表示加上最后的DDH,这里为7
AABF–DDBH:21+624+16900+35152+2028+26+8=54759(count=54759)
(Z-F+1):表示最后一位数AABF–AABZ,+1表示最开始的AABF,这里为21
(Z-B)26:表示AACA–AACZ…AAZA–AAZZ,这里为624
(Z-A)2626:表示ABAA–ABZZ…AZAA–AZZZ,这里是16900
(D-A-1)2626
26:表示从BAAA–BZZZ…CAAA–CZZZ,这里是35152
(D-A)2626:表示从DAAA–DAZZZ…DCAAA–DCZZZ,这里是2028
(B-A)*26:表示从DDAA–DDAZ,这里是26
(H-A)+1:表示从DDBA–DDBH,+1表示加上最后的DDBH,这里是8

规律总结: 如果存在长度在2位以上的数,且首位不相等,首位相减大于1(这里D-A),那么count/2,即中心点一定在首位的式子中
例如AABF–DDBH:的中心点,在BAAA到DZZZ之间
如果存在长度在2位以上的数,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZZZ–BBZZ的中心点,在BAAA到BBZZ之间
如果存在长度为2位,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZ–BF的中心点在BA到BF之间

‘’’

'''
规律总结:
AZ--DF : 1+52+6=59 (count=59)
(Z-Z+1):表示最后一位数,+1表示加上最开始的AZ,这里为1
(D-A-1)*26:表示BA--BZ...CA--CZ,,这里为52
(F-A)+1:表示从DA--DF之间的数,+1表示加上最后的DF这里为6
ABF--DDH:21+624+1352+78+7=2083(count=2083)
(Z-F+1):表示最后一位数ABF--ABZ,+1表示最开始的ABF,这里为21
(Z-B)*26:表示ACA--ACZ...AZA--AZZ,这里为624
(D-A-1)*26*26:表示BAA--BZZ..CAA--CZZ,这里为1352
(D-A)*26:表示从DAA--DAZ...DCA--DCZ,这里为78
(H-A+1):表示DDA--DDH,+1表示加上最后的DDH,这里为7
AABF--DDBH:21+624+16900+35152+2028+26+8=54759(count=54759)
(Z-F+1):表示最后一位数AABF--AABZ,+1表示最开始的AABF,这里为21
(Z-B)*26:表示AACA--AACZ...AAZA--AAZZ,这里为624
(Z-A)*26*26:表示ABAA--ABZZ...AZAA--AZZZ,这里是16900
(D-A-1)*26*26*26:表示从BAAA--BZZZ...CAAA--CZZZ,这里是35152
(D-A)*26*26:表示从DAAA--DAZZZ...DCAAA--DCZZZ,这里是2028
(B-A)*26:表示从DDAA--DDAZ,这里是26
(H-A)+1:表示从DDBA--DDBH,+1表示加上最后的DDBH,这里是8

规律总结:
如果存在长度在2位以上的数,且首位不相等,首位相减大于1(这里D-A),那么count/2,即中心点一定在首位的式子中
例如AABF--DDBH:的中心点,在BAAA到DZZZ之间
如果存在长度在2位以上的数,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZZZ--BBZZ的中心点,在BAAA到BBZZ之间
如果存在长度为2位,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZ--BF的中心点在BA到BF之间
'''
def main():
    #code here
    global s1,s2
    s1=input().strip()
    s2=input().strip()

    if s1.isupper() and s2.isupper() and len(s1)==len(s2) and (len(s1)>=1 and len(s1)<=200000):
        global newStr,count,current_count,current_str,end_count
        count=0
        current_count=0
        end_count=0
        current_str=s1
        substractString(0,s1,s2)
        if count%2!=0:        
            #print(count)
            global meanStr
            #在cureent_count的基础上进行计数
            #即在current_str的基础上进行加法A
            meanStr=count//2-current_count
            addString(len(s1)-1)
            print(current_str)
            pass

#在s1的基础上,加上count//2
def addString(k):
    global current_str,meanStr
    #从末尾开始加,每当Z时,前一位变为原来的数加1,末尾置为A,例如BAAA
    for i in range(k,-1,-1):
        '''
        判断meanStr落在哪个范围内
        如果1<=meanStr<=26,则在BAAA到BAAZ之间
        如果26+1<=meanStr<=26*26,则在BABA到BAZZ之间
        如果26*26+1<=meanStr<=26*26*26,则在BBAA到BZZZ之间
        '''
        if meanStr>0:
            if i==len(s1)-1:
                if  pow(26,len(s1)-(i+1))<= meanStr<=pow(26,len(s1)-i):
                    current_str=current_str[:i]+current_str[i].replace(current_str[i],chr(ord(current_str[i])+meanStr))+current_str[i+1:]
                    break
            elif i!=0:
                while  pow(26,len(s1)-(i+1))+1<= meanStr<=pow(26,len(s1)-i):
                    meanStr-=(pow(26,len(s1)-(i+1)))
                    current_str=current_str[:i]+current_str[i].replace(current_str[i],chr(ord(current_str[i])+1))+current_str[i+1:] 
                if meanStr<pow(26,len(s1)-(i+1))+1:
                    addString(i+1)
                    break
            else:#当i==0时
                while  pow(26,len(s1)-(i+1))+1<= meanStr<=end_count:
                    meanStr-=(pow(26,len(s1)-(i+1))+1)
                    current_str=current_str[:i]+current_str[i].replace(current_str[i],chr(ord(current_str[i])+1))+current_str[i+1:]
                if meanStr<pow(26,len(s1)-(i+1))+1:
                    addString(i+1)
                    break 
            pass

#需要记录首位的状态和此时计数的状态
def substractString(k,s1,s2):
    global count,current_count,current_str,end_count
    for i in range(k,len(s1)):#s1中从前往后遍历
        if i==0:
            if  ord(s2[i])>ord(s1[i]):
                if ord(s2[i])-ord(s1[i])>1:
                    for j in range(len(s1)-1,-1,-1):#从后往前遍历
                        if j!=i:
                            if j==len(s1)-1:
                                count+=ord('Z')-ord(s1[j])+1#开始时的末尾
                            else:
                                count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)
                    current_count=count
                    current_str=chr(ord(s1[i])+1)+(len(s1)-1)*'A'#首字母加1,除了首字母外都是A
                    count+=(ord(s2[i])-ord(s1[i])-1)*pow(26,len(s1)-1)#计算首位
                    #首位结束时的count
                    end_count=count
                elif ord(s2[i])-ord(s1[i])==1:#当首位相差等于1时且2位数以上
                    if len(s1)==2:
                        for j in range(len(s1)-1,-1,-1):#从后往前遍历
                            if j!=i:
                                if j==len(s1)-1:
                                    count+=ord('Z')-ord(s1[j])+1#开始时的末尾
                                else:
                                    count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)
                        current_count=count
                        current_str=chr(ord(s1[i])+1)+(len(s1)-1)*'A'#首字母加1,除了首字母外都是A
                        count+=(ord(s2[i])-ord(s1[i])-1)*pow(26,len(s1)-1)#计算首位
                        #首位结束时的count
                        end_count=count
                    elif len(s1)>2:
                        for j in range(len(s1)-1,-1,-1):#从后往前遍历
                            if j!=i:
                                if j==len(s1)-1:
                                    count+=ord('Z')-ord(s1[j])+1#开始时的末尾
                                elif j==1:  
                                        current_count=count
                                        count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)
                                        if ord(s1[i+j])+1<90:
                                            current_str=s1[i]+chr(ord(s1[i+j])+1)+(len(s1)-1-j)*'A'#第二个字母加1,除了首字母、第二个字母外都是A
                                              #首位结束时的count
                                            end_count=count
                                            count+=(ord(s2[i+j])-ord(s1[i+j])-1)*pow(26,len(s1)-1-j)#计算首位
                                        else:
                                            current_str=chr(ord(s1[i])+1)+(len(s1)-1)*'A'
                                            substractString(i+1,s1,s2) 
                                            break       
                                else:
                                    count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)
                        break
            elif ord(s1[i])==ord(s2[i]): 
                substractString(i+1,s1,s2)
                break
            else:
                break
        elif i!=len(s1)-1:
            count+=(ord(s2[i])-ord('A'))*pow(26,len(s1)-1-i)
        else:#结束时的末尾
            count+=ord(s2[i])-ord('A')+1
            if end_count==0:
                 end_count=count
    pass



if __name__ == '__main__':
    main();

结果运行如下:直接突破50位长度,最终多少长度这里没有进行计算,但能够满足许多需求
在这里插入图片描述存在超时问题,超出该题的时间限制2m,未解决该问题,或许可以改用C++代码,能够大幅降低时间复杂度
在这里插入图片描述
3.为了找到两个字符串的平均串,我们可以按照字典序生成从第一个字符串到第二个字符串的所有中间字符串,然后找到中间位置的字符串作为平均串。下面是具体的步骤和代码实现:

步骤:

  • 确保字符串s1的字典序小于s2。如果不是,则交换两个字符串以确保条件满足。
  • 初始化一个空集合,用于存储按字典序遍历的所有字符串。
  • 从s1开始,逐步修改每个字符直到变成s2,同时将这些字符串添加到集合中。具体来说,对于s1和s2的每个位置i,从s1[i]开始逐步增加到s2[i],并构建对应的字符串添加到集合中。这样可以保证生成的字符串是字典有序的。
  • 找到集合中的字符串数量N(实际上这将是中间位置之前的字符串数量加上中间位置之后的字符串数量)。由于集合中的字符串是按字典序排序的,所以中间位置的字符串将是平均串。如果集合中的元素数量是奇数,则中间位置就是 (N+1)/2;如果集合中的元素数量是偶数,则中间位置介于 N/2 和 (N+1)/2 之间(即取两个中间位置的平均值)。计算平均串的方式可以是简单地取这两个中间位置的字符串的对应字符的平均值(这实际上不太可能产生有意义的平均串,因为我们处理的是字母而非数字),或者可以通过其他方法确定更合适的平均串。由于这个问题没有明确规定如何平均字母,我们可以假设需要找到中间位置的字符串。因此,我们需要向下取整来确定真正的中间位置。
  • 返回集合中对应中间位置的字符串作为平均串。假设返回的是更接近于末尾的中间位置的字符串(即向下取整的中间位置)。
def average_string(s1, s2):
    # 确保s1字典序小于s2
    if s1 > s2:
        s1, s2 = s2, s1
    
    # 构建按字典序排列的字符串集合
    strings_set = set()
    for i in range(len(s1)):
        # 逐步生成从s1到s2的所有可能字符串并添加到集合中
        for c in range(ord(s1[i]), ord(s2[i]) + 1):  # 使用ord函数获取字符的ASCII值范围遍历字符集
            temp_str = list(s1)  # 创建s1的副本以避免修改原始字符串
            temp_str[i] = chr(c)  # 修改副本中的字符以构建新的字符串
            strings_set.add(''.join(temp_str))  # 将新构建的字符串添加到集合中
    
    # 计算中间位置的索引并返回对应的字符串作为平均串
    middle_index = len(strings_set) // 2  # 计算中间位置索引(向下取整)
    average_str = list(strings_set)[middle_index]  # 获取中间位置的字符串(转换为列表方便索引)或者直接用二分查找等优化手段获取中间元素的值也可以避免将整个集合转换为列表带来的性能损耗。这里为了简化代码直接使用了列表访问方式。
    return average_str

# 测试函数
print(average_string("AZ", "BF"))  # 输出应为 "BC"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA与ASIC:深入解析芯片设计的双子星

前言 在半导体世界里&#xff0c;FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;与ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;专用集成电路&#xff09;是两种截然不同的芯片设计策略&#xff0c;各自在…

短视频矩阵系统,一键智能成片

在信息爆炸的时代&#xff0c;短视频以其短平快的特点迅速崛起&#xff0c;成为人们获取信息、娱乐消遣的重要渠道。然而&#xff0c;如何在这个竞争激烈的领域中脱颖而出&#xff0c;制作出吸引眼球的爆款视频呢&#xff1f;今天&#xff0c;我们就来揭秘一款神奇的短视频矩阵…

76.WEB渗透测试-信息收集- WAF、框架组件识别(16)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;75.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;15&#xff09; Php的Laraverl…

C语言 之 理解指针(4)

文章目录 1. 字符指针变量2. 数组指针变量2.1 对数组指针变量的理解2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用 5. 函数指针数组 1. 字符指针变量 我们在前面使用的主要是整形指针变量&#xff0c;现在要学…

php--高级反序列化

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

21 Python常用内置函数——zip()

zip() 函数用来把多个可迭代对象中的元素压缩到一起&#xff0c;返回一个可迭代的 zip 对象&#xff0c;其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组&#xff0c;最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个。 可以这样理解这个函…

学习笔记(数据结构:队列)4

qt加库 队列&#xff1a; 队列是只允许在一段进行插入&#xff0c;而在另一端进行删除操作的线性表。 允许插入的称谓队尾&#xff0c;允许删除的一端队头。 顺序队列。 循环队列&#xff0c; 常用操作&#xff0c;入队&#xff0c;出队。 先进先出&#xff0c;FIFO 用&#x…

安装nfs和rpcbind设置linux服务器共享磁盘

1、安装nfs和rpcbind 1.1 检查服务器是否安装nfs和rpcbind&#xff0c;执行下命令&#xff0c;检查服务器是否安装过。 rpm -qa|grep nfs rpm -qa|grep rpcbind 说明服务器以安装了&#xff0c;如果没有就需要自己安装 2、安装nfs和rpcbind 将rpm安装包&#xff1a; libtirpc-…

【kubernetes】认识K8S基础理论

目录 1.背景 2.虚拟机、物理机与容器 3.K8S 基本概念 3.1 K8S 的特点 4.Kubernetes 集群架构与组件 4.1 核心组件 4.1.1 Master组件 4.1.2 配置存储中心 4.1.3 Node 组件 5.Kubernetes 核心概念 6.总结 1.背景 服务器经历了三次演变过程&#xff1a;物理机、虚拟机…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十八章 中断下文之tasklet

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

跨越至智慧水利新时代:以科技创新为核心引擎,全面构建智能化水资源管理体系,显著提升水资源治理的智能化水平与高效治理能力,共筑可持续水生态未来

目录 一、智慧水利的概念与重要性 &#xff08;一&#xff09;智慧水利的概念 &#xff08;二&#xff09;智慧水利的重要性 二、智慧水利的关键技术 &#xff08;一&#xff09;物联网技术 &#xff08;二&#xff09;大数据技术 &#xff08;三&#xff09;云计算技术 …

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控

本文字数&#xff1a;4187&#xff1b;估计阅读时间&#xff1a;11 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立&#xff0c;利用大数据、人工智能和物联网等技术&#xff0c;为其汽车客户解决…

X00078-基于深度强化学习图神经网络的云工作流调度python

强化学习&#xff08;RL&#xff09;技术通过蒙特卡洛树搜索&#xff08;MCTS&#xff09;的加速&#xff0c;成功解决了多资源需求下的DAG问题&#xff0c;优化目标为缩短makespan。根据当前的计算资源和任务状态&#xff0c;MCTS算法被用来探索并选择最佳的动作&#xff0c;在…

【Linux】远程连接Linux虚拟机(MobaXterm)

【Linux】远程连接Linux虚拟机&#xff08;MobaXterm&#xff09; 零、原因 有时候我们在虚拟机中操作Linux不太方便&#xff0c;比如不能复制粘贴&#xff0c;不能传文件等等&#xff0c;我们在主机上使用远程连接软件远程连接Linux虚拟机后可以解决上面的问题。 壹、软件下…

快速搞定分布式RabbitMQ---RabbitMQ进阶与实战

本篇内容是本人精心整理&#xff1b;主要讲述RabbitMQ的核心特性&#xff1b;RabbitMQ的环境搭建与控制台的详解&#xff1b;RabbitMQ的核心API&#xff1b;RabbitMQ的高级特性;RabbitMQ集群的搭建&#xff1b;还会做RabbitMQ和Springboot的整合&#xff1b;内容会比较多&#…

The resource type Sheet does not implement java.lang.AutoCloseable

The resource type Sheet does not implement java.lang.AutoCloseable 修改一下 应该是【高版本JDK】切换集成到我这个项目【低版本 JDK 8】出错了

Ubuntu设置网络

进入网络配置文件夹 cd /etc/netplan 使用 vim 打开下的配置文件 打开后的配置 配置说明&#xff1a; network:# 网络配置部分ethernets:# 配置名为ens33的以太网接口ens33:addresses:# 为ens33接口分配IP地址192.168.220.30&#xff0c;子网掩码为24位- 192.168.220.30/24n…

【MySQL】:表操作语法大全

表内容的操作 增删改查 CRUD (create、retrieve、update、delete) 新增 基本语法 语法为&#xff1a; insert into 表名 values (值&#xff0c;值&#xff0c;值...);这里的列数和类型&#xff0c;要和表结构匹配插入中文的话&#xff0c;要确保数据库创建的时候要设置字…

Python 高阶语法

前言&#xff1a; 我们通过上篇文章学习了Python的基础语法&#xff0c;接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性&#xff1a;  封装  继承 …

NLP基础知识2【各种大模型的注意力】

注意力 传统Attention存在的问题优化方向变体有哪些现在的主要变体集中在KVMulti-Query AttentionGrouped-query AttentionFlashAttention 传统Attention存在的问题 上下文约束速度慢&#xff0c;显存占用大&#xff08;因为注意力考虑整体信息&#xff0c;所以每一个位置都要…