为啥一种方法比另一种更有效?
Posted
技术标签:
【中文标题】为啥一种方法比另一种更有效?【英文标题】:Why is one way more efficient than another?为什么一种方法比另一种更有效? 【发布时间】:2017-12-09 18:27:06 【问题描述】:我正在尝试hackerrank,我遇到了一个我试图使用python3解决的问题。 问题是 “一名绑匪写了一张赎金单,但担心会被追查到他的手上。他找到一本杂志,想知道他是否可以从中剪下整个单词,并用它们来制作他赎金单的无法追踪的复制品。这些话在他的笔记中是区分大小写的,他必须使用杂志中可用的整个单词,这意味着他不能使用子字符串或串联来创建他需要的单词。
鉴于杂志上的文字和赎金信中的文字,如果他能准确地使用杂志上的整个文字复制他的赎金信,则打印 Yes;否则,打印编号。”
我尝试使用以下方法,
def ransom_note(magazine, ransom):
# comparing based on the number of times word occurred in the list
for word in set(ransom):
if ransom.count(word) > magazine.count(word):
return False
return True
这确实有效,我在 20 个测试用例中得到了 18 个正确。 但是其他两个案例都超时了,所以我必须找到最划算的方法来做这件事。 我试图通过使用单词作为键并将单词的计数作为值来将单词存储为字典。仍然没有得到这两个案例,当我查看案例时,输入都有 30000 个单词,预期的输出是“是”。
我看到了讨论页面,发现了一段让我通过的代码。
from collections import Counter
def ransom_note(magazine, ransom):
return not (Counter(ransom) - Counter(magazine))
有人能解释一下为什么这比我的方法更有效吗? 在此先感谢:)
【问题讨论】:
为什么要一遍又一遍地做,而不是只做一次并推荐它?即ransom.count(word)
和magazine.count
在for
循环中与拥有字典并将计数存储一次相比。
你的做法是一个幼稚的O(N^2)
算法,而Counter类使用multiset来优化计数过程
【参考方案1】:
据我了解,在您第二次尝试解决该问题时,ransom
和 magazine
都是字典,因此理论上您的代码尽可能快。
Python Counter 集合专门设计用于处理简单的整数计数,并经过优化以非常快速地执行常见操作。事实证明,查看一个列表中是否有足够的东西来满足来自另一个列表的请求是一个非常常见的操作。所以他们花时间优化 Counter
非常快地完成该操作。
【讨论】:
以上是关于为啥一种方法比另一种更有效?的主要内容,如果未能解决你的问题,请参考以下文章
用 jquery 前置 html 的一种方法有效,但为啥另一种方法无效?