Python 两个列表之间匹配和计数的时间复杂性

Python 两个列表之间匹配和计数的时间复杂性,python,time-complexity,Python,Time Complexity,在这里,我试图确定我的特征工程计算时间: 通过使用这行代码,它遍历每个文档,检查是否有,如果有,那么它的单词在我拥有的这本词典中也出现了多少,它生成了一个名为n_dicwords的特性。对不起,我是复杂性理论的一个迷,我认为生成此功能的时间复杂性是O(n*m*w),其中n是文档数,m是每个文档中的单词数,w是字典中的单词数。我说得对吗?如果是这样的话,有什么办法可以改进这一点吗 非常感谢你!非常感谢你的帮助 我有点惊讶地注意到python中的“x in s”结构是O(n),其中n是列表中的项数。

在这里,我试图确定我的特征工程计算时间:

通过使用这行代码,它遍历每个文档,检查是否有,如果有,那么它的单词在我拥有的这本词典中也出现了多少,它生成了一个名为n_dicwords的特性。对不起,我是复杂性理论的一个迷,我认为生成此功能的时间复杂性是O(n*m*w),其中n是文档数,m是每个文档中的单词数,w是字典中的单词数。我说得对吗?如果是这样的话,有什么办法可以改进这一点吗


非常感谢你!非常感谢你的帮助

我有点惊讶地注意到python中的“x in s”结构是O(n),其中n是列表中的项数。所以,你的估计是正确的。一种更为正确的方式:由于您的文档或所说的工作计数根本没有变化,因此重要的数字是必须检查的单词总数,以及检查它们的字典长度。显然,这根本不会改变计算的数量,它只是让我们得到一个快速可识别的O(m*n)形式

可以想象,您可以将字典存储在二叉树中,从而将其减少到O(log(n))

在谷歌上搜索“二叉树python”,我发现了一些有趣的东西,比如一个叫做“bintrees”的包

然而,Erik Vesteraas指出,python“set”数据结构是一个基于散列的集合,在一般情况下复杂性为O(1),在最坏的情况下复杂性为O(n),并且非常罕见


请参见

,除非代码下面的代码做了一些巧妙的事情,否则您的复杂性分析应该是正确的

如果这一部分的性能很重要,那么您应该使用多模式字符串搜索算法,该算法尝试解决您正在做的几乎完全相同的问题

首先,看看哪一个是最常用的,并以线性时间运行。谷歌搜索“ahocarasickpython”时发现了一些不同的实现,所以虽然我个人没有使用过其中任何一种,但我认为您不必实现算法本身就可以使用它


如果您只需要代码运行得快一点,而不需要获得最佳性能,那么您可以为字典使用一个集合。在python中,普通集是散列集,因此它具有恒定的查找时间。然后,您可以只检查每个单词是否在字典中。

实际上python中的标准集是一个哈希集(在这种情况下更好),因此不需要额外的包。为什么您会惊讶于s中的x是O(n)?它几乎是字面上说的“每一个
x
,索引从0到
n-1
in
s
”。不,“因为x在s中”表示查看所有内容,“如果x在s中”不必查看所有内容。我已经将字典从类型列表更改为类型集,但现在似乎需要更多的时间:start=time.clock()
n\u dicwords=[np.sum([c.lower]().count(字典中w的w.decode('utf-8'))count(字典中w的w.decode('utf-8'))count(子样本文档中c的w.decode('utf-8'))打印“花费的时间:”,Time.clock()-花费的开始时间:21.483408对于子样本_文档中的c,打印“所用时间:”,Time.clock()-开始时间:24.844395
或者计算时间不一致是正常现象吗?迭代集合与迭代列表一样昂贵。您应该迭代文档中的单词,并检查每个单词是否在字典中。现在您正在迭代字典中的单词,并为每个单词检查chec如果他们在文件中,也就是说,你做得不对。
n_dicwords = [np.sum([c.lower().count(w.decode('utf-8')) for w in dictionary])
                                                for c in documents]