繁体   English   中英

python中的Mime类型优化

[英]Mime type optimisation in python

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

我试图删除所有无用的函数,例如解析为字符串,但问题出在我思考的方式上。

import sys
import math



# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.

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):
    for item in dico:
        if(word[-len(item)-1:].upper() == "."+item.upper()):
            return(dico[item])
    return("UNKNOWN")



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


for i in range(q):
    fname = input()
    fname = fname
    print(check(fname))


# Write an action using print
# To debug: print("Debug messages...", file=sys.stderr)
#print("Debug message...", file=sys.stderr)

失败进程已超时。 这可能意味着您的解决方案没有优化到足以处理某些情况。

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

打个比方,想象一下你在厨房里找勺子。 如果您提前知道所有餐具、电器和炊具的位置,您就无需在每个抽屉中寻找餐具。 相反,您只需直接走到装有您想要的勺子的餐具抽屉,就可以一次性完成!

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

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

如果您可以调整解决方案以在恒定时间内检查字典,无需循环,那么您可以处理n = 10000q = 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 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM