所以我今天接受采访,我的面试官和我不确定哪个更有效率:给出一长串字符,这是更快的'len(str)'或'len(freqDict)',其中freqDict是一个字符作为键的字典和字符串中字符的频率作为值?
答案 0 :(得分:3)
这取决于“字符串”和频率字典的含义:
如果您提到python数据类型str
和dict
:
字符串在C结构的字段中跟踪它们的长度,这意味着len(str)
是O(1),也就是恒定时间(并且具有非常小的常量)。
使用频率表,您必须对计数求和,即O(k),其中k
是字符串中不同字母的数量(假设为常数时间整数运算,其中不完全是真的)。由于字符数是有界的O(k)= O(1),所以,渐近,它们需要相同的时间,但常量的差异非常大:len(str)
总会要快点(另外,如果你认为unicode字符k
可能是数百万的数量级,那么使用频率表的速度可能会慢10 ^ 6倍。
如果你的意思是“字符串”,那么计算字符串中的字符需要花费O(n)时间,而如前所述,对频率表中的计数求和是O(k),即O(1)假设有限数量的字符。但是,这并没有考虑创建频率表的时间。
我假设对整数进行恒定时间操作,因为这对于现实世界的使用是有意义的。但是,即使使用无界整数,求和k
整数所需的时间也会小于O(n)。实际上它应该是O(log(n)),因为操作必须计算log(n)
表示的n
位,这是字符串的长度。
(假设有一定数量的字符,否则你可以拥有长度为n
且每个n
都有n
个不同字符的字符串......)
这里我假设您要解决的问题是通过计算单个字符或总结一些计数来计算字符串的长度。
但是,如果你真的想len(a_string)
vs len(a_dict)
,那么答案就会非常简单:他们都会花费相同的O(1)时间,因为str
和dict
存储了一个字段长度。
答案 1 :(得分:1)
对于大字符串,字典会更快。由于英文字母中只有26个字母,因此最多可以有26个字母。然后,您只需将字典中的值相加。在这种情况下,len
操作会强制您遍历整个列表(或字符串)。
使用长度
>>> s = 'halloween'
>>> len(s) # O(N)
9
使用dict
>>> d = {'a': 1, 'e': 2, 'h': 1, 'l': 2, 'o': 1, 'n': 1, 'w': 1}
>>> sum(d.values()) # O(N) but capped at N = 26
9
答案 2 :(得分:0)
根据此table list
len
具有O(1)复杂度(它是预先计算的)。字符串也有预先计算的长度。所以字符串len应该更快。
len
方法。
Python字符串在用于len的C API中使用PyString_GET_SIZE,只是Py_SIZE的别名。