由于Python是用C实现的,所以我很困惑,开发人员如何使Python内置的len
函数以恒定的时间O(1)在任意序列上运行,而C的字符串函数strlen
以线性时间O(n)运行。
Python内置len
函数的时间复杂度背后的秘密是什么?如果我们要用C编写程序,那么如果我们想对涉及序列长度的快速C程序进行复制,最好的方法是复制len
的Python代码吗?
答案 0 :(得分:8)
我想您可能缺少一个概念,那就是数据结构如何在恒定时间内即O(1)返回其大小。
粗略地考虑这样一个程序:
void init(){
// code to initialize (or allocate memory) the container
size = 0;
}
void add(Something something){
container.add(something);
size++;
}
void remove(Something something){
//Code to search 'something'
if(found) {
container.remove(something);
size--;
}
}
int len(){
return size;
}
现在,您每次调用方法len()
时,都可以返回整数值,而无需遍历container
。
为什么strlen
或任何与C相关的数据结构不能那样工作,原因是 拥有类似size
这样的计数器的空间开销。但这并不意味着您无法定义一个。
提示:
使用struct并保持大小不变。
答案 1 :(得分:1)
python中的任何字符串/列表都是一个对象。与许多对象一样,它具有len
方法,该方法存储列表的长度。当我们调用__len__
时,{{1}}在内部被调用,并返回存储的值,该值是O(1)运算。