python - 理解 python 的 len() 时间复杂度

我有一个问题,关于我是否正确理解了 Python 中 len 函数的时间复杂度。我看过关于此主题的多个帖子 here和 here但我觉得答案没有明确回答我的另一个问题。

据我了解,调用len函数的时间复杂度是O(1),因为对象(例如数组)的长度存储在场景。但是,调用未存储在幕后的函数(例如 maxmin)的时间复杂度为 O(n),因为我们将不得不搜索整个数组。

我想知道,将 len 的时间复杂度也考虑为 O(n) 是否正确(因为它需要 n 当我们从数组中添加或删除值时跟踪数组长度的常量操作数)但仅为 O(1) 因为我们跟踪后面的长度场景?

从技术上讲,我们应该能够在创建数组时存储其他信息,例如 maxmin 并且访问这些信息也将是 O(1 ) 如果我们明确保存这些值。

最佳答案

len(obj) 简单地调用 obj.__len__():

>>> [1, 2, 3, 4].__len__()
4

因此说 len() 总是 O(1) 是不正确的——在大多数对象上调用len() (例如列表)是 O(1),但任意对象可能以任意低效的方式实现 __len__

max(obj) 是另一回事,因为它不会在 obj 上调用单个神奇的 __max__ 方法;它会迭代它,调用 __iter__ 然后调用 __next__。它执行了 n 次(并且每次都进行比较以跟踪到目前为止看到的最大项),因此它必须始终至少为 O(n)。 (如果 __next__ 或比较方法很慢,它可能会更慢,尽管这很不寻常。)

对于其中任何一个,我们都不将构建集合所花费的时间计算为调用操作本身的成本的一部分——这是因为您可能构建一次列表然后调用 len( ) 很多次,并且知道 len() 本身非常便宜,即使构建列表非常昂贵也是很有用的。

https://stackoverflow.com/questions/71684970/

相关文章:

linux - 使用打印命令选择子域

r - 如何在数据帧的特定索引中插入行,其中仅在 R pipe dplyr 中包含上面几行的总和

swift - 如何快速制作圆形或填充和圆形进度 View (使用 CAShapeLayers)

r - 如何创建一个虚拟变量对应于 R 中值的变化

python - 极地 : switching between dtypes within a Da

c++ - 键入 “$” 命令不会跳转到行尾 [光标设置为 “|”(条形/管道)而不是 block

c++ - const char * 数组中的元素数

r - 根据 R 中的出生年份对人员进行分组

awk - 如果模式存在于另一列中,则从该列中移除模式

r - 与另一列中的变量相比,如何找到 R 列中两两变量之间的共同变量数?