python - python 中具有 o(n) 顺序的大列表的快速列表减法

标签 python list subtraction

我在 python 中有两个大字符串列表。我想以 o(n) 的顺序快速减去这两个列表。我找到了一些方法,例如从第一个列表中删除循环中的第二个列表元素,或者将列表转换为 set() (问题:更改列表的顺序)并使用减号(-)运算符,但这些方法效率不高。有什么办法可以实现这个操作吗?

a=['1','2','3',...,'500000']
b=['1','2','3',...,'200000']

c=a-b

c=['200001','200002',...,'500000']

最佳答案

按照表述,您的问题是:

  • 遍历A
  • 对于每个元素,在B中查找,没有找到则取
  • 不对元素做出任何假设

对于任意数据,列表搜索为 O(N),集合搜索为 O(1),转换为集合为 O(N)。遍历 A 的时间复杂度为 O(N)。

因此,仅使用列表的复杂度为 O(N^2),如果将 B 转换为集合,则复杂度为 O(N)。

加快速度的唯一方法是提高迭代或搜索的效率——如果不使用一些关于数据的额外知识,这是不可能的。例如

  • 在您的示例中,您的数据是连续的数字,因此您可以采用 A[len(B):]
  • 如果您要多次使用同一个 B,则可以缓存该集合
  • 您可以立即将 B 设为一组(如果需要保留顺序,可以使用 an ordered set )
  • 如果所有数据都属于同一类型且较短,you can use numpy arrays而且速度很快setdiff1d
  • 等等

关于python - python 中具有 o(n) 顺序的大列表的快速列表减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56089135/

相关文章:

python - 安装 python-mysql 包时出现问题

python - 在 python 2.7 中将十分之零和百分之零的浮点字符串转换为整数

python - 在字典列表中查找并更新字典的值

python - 如何查找列表中元素的所有出现?

python - 查找与条件匹配的第一个序列项

floating-point - 如何在硬件中实现 IEEE 754 浮点减法?

algorithm - 计算机对两个大数进行乘法、除法、减法、加法是否比较小的数花费更多的时间

C# 双减法

python - 如何获得有关 Python 意外 SIGABRT 的更多信息?

python - 为什么 django 按错误的字段分组?注释()