In this answer it is mentioned that for a string doing
s.chars().count()
to get the number of characters is an O(n) operation.
For simple ASCII strings getting the number of bytes using s.len()
works as well. When using a check to make sure that all those bytes are actually ASCII this is probably safe.
I want to know what the complexity of that operation is. It might still have to find the end of the string like in C and be O(n).
I tried to look it up and found the documentation of the std::string::String
,
which applies for appropriate s
. However it doesn't state its complexity. Looking at the source it just does this self.vec.len()
. So we go to look at the vector docs and find that this simply returns a stored length self.len
meaning that this is indeed an O(1) operation.
That was a lot of work though. Now what about the case that s
is a std::str? I tried to do the same but got stuck in this mess.
Is there a more easily accessible ressource for operation complexities in Rust?
Something like this list for Python would be great.
If your algorithm runs in a time proportional to the logarithm of the input data size, that is log ( n ) \log(n) log(n), then you have O ( log ( n ) ) \mathcal{O}(\log(n)) O(log(n)) complexity. This type of complexity is usually present in algorithms that somehow divide the input size.
Operational complexity is a result of internal and external factors impacting company's ways to manage operations to produce products and services. Complexity can stem from the following, for example: Product life cycles are becoming shorter and companies need to launch new products at a faster pace.
The time complexity, measured in the number of comparisons, then becomes T(n) = n - 1. In general, an elementary operation must have two properties: There can't be any other operations that are performed more frequently as the size of the input grows.
Other than the performance section on collections I don't think there currently is a common list like the Python one you referenced.
As for str
, determining its length is an O(1) operation, because a string slice consists of a pointer and length:
// We can re-build a str out of ptr and len. This is all unsafe because
// we are responsible for making sure the two components are valid:
let s = unsafe {
// First, we build a &[u8]...
let slice = slice::from_raw_parts(ptr, len);
// ... and then convert that slice into a string slice
str::from_utf8(slice)
};
String
and str
offer the same complexity guarantees for all actions. In fact, most operations on String
(including chars()
) are actually operations on str
that use the implicit conversion from String
to str
(that conversion is free since they share the same low-level representation).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With