Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的Mime类型优化_Python_Python 3.x_Dictionary_Optimization - Fatal编程技术网

python中的Mime类型优化

python中的Mime类型优化,python,python-3.x,dictionary,optimization,Python,Python 3.x,Dictionary,Optimization,我想解决编码games.com中的mime挑战。我的代码可以通过所有测试,但不能通过优化测试 我试图删除所有无用的函数,比如解析为字符串,但问题正在我考虑的过程中 导入系统 输入数学 #下面自动生成的代码旨在帮助您解析 #根据问题陈述的标准输入。 n=int(input())#组成关联表的元素数。 q=int(输入()) #要分析的文件名的数量Q。 dico={} #我的职能 def检查(word): 对于dico中的项目: 如果(单词[-len(item)-1:][.upper()=“+”it

我想解决编码games.com中的mime挑战。我的代码可以通过所有测试,但不能通过优化测试

我试图删除所有无用的函数,比如解析为字符串,但问题正在我考虑的过程中

导入系统 输入数学 #下面自动生成的代码旨在帮助您解析 #根据问题陈述的标准输入。 n=int(input())#组成关联表的元素数。 q=int(输入()) #要分析的文件名的数量Q。 dico={} #我的职能 def检查(word): 对于dico中的项目: 如果(单词[-len(item)-1:][.upper()=“+”item.upper()): 退货(dico[项目]) 返回(“未知”) 对于范围(n)中的i: #扩展名:文件扩展名 #mt:MIME类型。 ext,mt=input().split() dico[ext]=mt 对于范围(q)内的i: fname=input() fname=fname 打印(支票(fname)) #使用print编写操作 #调试:打印(“调试消息…”,file=sys.stderr) #打印(“调试消息…”,文件=sys.stderr) 失败
进程已超时。这可能意味着您的解决方案没有优化到足以处理某些情况。

这是正确的想法,但一个细节似乎破坏了性能。问题在于dico:中item的
行,它不必要地循环了该行中的每个条目。这是一个线性搜索O(n),逐项检查目标项。但这在很大程度上违背了字典数据结构的目的,即提供恒定时间的O(1)查找。“恒定时间”意味着无论字典有多大,查找条目所需的时间总是一样的(多亏了)

打个比方,想象你正在厨房里找一把勺子。如果你提前知道所有的餐具、用具和炊具都在哪里,你就不需要在每个抽屉里寻找餐具。取而代之的是,你只需直接走到盛着你想要的勺子的餐具抽屉,这是一次性的

另一方面,如果你在别人的厨房,很难找到勺子。你必须从橱柜的一端开始,检查每个抽屉,直到找到餐具为止。在最坏的情况下,你可能会运气不好,在找到餐具抽屉之前,你必须检查每个抽屉

回到代码,上面的代码片段使用的是后一种方法,但我们正在尝试在10k个不熟悉的厨房中找到一些东西,每个厨房都有10k个抽屉。相当慢,对吧

如果您可以调整解决方案以在固定时间内检查字典,而无需循环,那么您就可以处理
n=10000
q=10000
,而无需进行
q*n
迭代(您可以在
q
迭代中执行,速度更快!)

谢谢你的帮助, 我想出了解决办法

n = int(input())  # Number of elements which make up the association table.
q = int(input())  # Number Q of file names to be analyzed.
dico = {}

# My function
def check(word):
    if("." in word):
        n = len(word)-(word.rfind(".")+1)
        extension = word[-n:].lower()
        if(extension in dico):
            return(dico[extension])
    return("UNKNOWN")


for i in range(n):
    # ext: file extension
    # mt: MIME type.
    ext, mt = input().split()
    dico[ext.lower()] = mt

for i in range(q):
    fname = input()
    print(check(fname))
你的解释很清楚:D 多谢各位