consistent big O notation
This commit is contained in:
parent
197fc8591e
commit
956f87fb04
9 changed files with 26 additions and 25 deletions
|
@ -4985,7 +4985,7 @@ Libraries
|
||||||
- [Upgrade to Unicode 10.0.0][42999]
|
- [Upgrade to Unicode 10.0.0][42999]
|
||||||
- [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
|
- [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
|
||||||
- [Skip the main thread's manual stack guard on Linux][43072]
|
- [Skip the main thread's manual stack guard on Linux][43072]
|
||||||
- [Iterator::nth for `ops::{Range, RangeFrom}` is now done in O(1) time][43077]
|
- [Iterator::nth for `ops::{Range, RangeFrom}` is now done in *O*(1) time][43077]
|
||||||
- [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
|
- [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
|
||||||
previously 2^15.
|
previously 2^15.
|
||||||
- [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
|
- [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
|
||||||
|
@ -8288,7 +8288,7 @@ Libraries
|
||||||
algorithm][s].
|
algorithm][s].
|
||||||
* [`std::io::copy` allows `?Sized` arguments][cc].
|
* [`std::io::copy` allows `?Sized` arguments][cc].
|
||||||
* The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
|
* The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
|
||||||
[override `count`, `nth` and `last` with an O(1)
|
[override `count`, `nth` and `last` with an *O*(1)
|
||||||
implementation][it].
|
implementation][it].
|
||||||
* [`Default` is implemented for arrays up to `[T; 32]`][d].
|
* [`Default` is implemented for arrays up to `[T; 32]`][d].
|
||||||
* [`IntoRawFd` has been added to the Unix-specific prelude,
|
* [`IntoRawFd` has been added to the Unix-specific prelude,
|
||||||
|
@ -8810,7 +8810,7 @@ Libraries
|
||||||
* The `Default` implementation for `Arc` [no longer requires `Sync +
|
* The `Default` implementation for `Arc` [no longer requires `Sync +
|
||||||
Send`][arc].
|
Send`][arc].
|
||||||
* [The `Iterator` methods `count`, `nth`, and `last` have been
|
* [The `Iterator` methods `count`, `nth`, and `last` have been
|
||||||
overridden for slices to have O(1) performance instead of O(n)][si].
|
overridden for slices to have *O*(1) performance instead of *O*(*n*)][si].
|
||||||
* Incorrect handling of paths on Windows has been improved in both the
|
* Incorrect handling of paths on Windows has been improved in both the
|
||||||
compiler and the standard library.
|
compiler and the standard library.
|
||||||
* [`AtomicPtr` gained a `Default` implementation][ap].
|
* [`AtomicPtr` gained a `Default` implementation][ap].
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//! Also computes as the resulting DAG if each SCC is replaced with a
|
//! Also computes as the resulting DAG if each SCC is replaced with a
|
||||||
//! node in the graph. This uses [Tarjan's algorithm](
|
//! node in the graph. This uses [Tarjan's algorithm](
|
||||||
//! https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm)
|
//! https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm)
|
||||||
//! that completes in *O(n)* time.
|
//! that completes in *O*(*n*) time.
|
||||||
|
|
||||||
use crate::fx::FxHashSet;
|
use crate::fx::FxHashSet;
|
||||||
use crate::graph::vec_graph::VecGraph;
|
use crate::graph::vec_graph::VecGraph;
|
||||||
|
|
|
@ -9,7 +9,7 @@ mod index_map;
|
||||||
pub use index_map::SortedIndexMultiMap;
|
pub use index_map::SortedIndexMultiMap;
|
||||||
|
|
||||||
/// `SortedMap` is a data structure with similar characteristics as BTreeMap but
|
/// `SortedMap` is a data structure with similar characteristics as BTreeMap but
|
||||||
/// slightly different trade-offs: lookup, insertion, and removal are O(log(N))
|
/// slightly different trade-offs: lookup, insertion, and removal are *O*(log(*n*))
|
||||||
/// and elements can be iterated in order cheaply.
|
/// and elements can be iterated in order cheaply.
|
||||||
///
|
///
|
||||||
/// `SortedMap` can be faster than a `BTreeMap` for small sizes (<50) since it
|
/// `SortedMap` can be faster than a `BTreeMap` for small sizes (<50) since it
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//! Insertion and popping the largest element have *O*(log(*n*)) time complexity.
|
//! Insertion and popping the largest element have *O*(log(*n*)) time complexity.
|
||||||
//! Checking the largest element is *O*(1). Converting a vector to a binary heap
|
//! Checking the largest element is *O*(1). Converting a vector to a binary heap
|
||||||
//! can be done in-place, and has *O*(*n*) complexity. A binary heap can also be
|
//! can be done in-place, and has *O*(*n*) complexity. A binary heap can also be
|
||||||
//! converted to a sorted vector in-place, allowing it to be used for an *O*(*n* \* log(*n*))
|
//! converted to a sorted vector in-place, allowing it to be used for an *O*(*n* * log(*n*))
|
||||||
//! in-place heapsort.
|
//! in-place heapsort.
|
||||||
//!
|
//!
|
||||||
//! # Examples
|
//! # Examples
|
||||||
|
@ -243,9 +243,9 @@ use super::SpecExtend;
|
||||||
///
|
///
|
||||||
/// # Time complexity
|
/// # Time complexity
|
||||||
///
|
///
|
||||||
/// | [push] | [pop] | [peek]/[peek\_mut] |
|
/// | [push] | [pop] | [peek]/[peek\_mut] |
|
||||||
/// |--------|-----------|--------------------|
|
/// |---------|---------------|--------------------|
|
||||||
/// | O(1)~ | *O*(log(*n*)) | *O*(1) |
|
/// | *O*(1)~ | *O*(log(*n*)) | *O*(1) |
|
||||||
///
|
///
|
||||||
/// The value for `push` is an expected cost; the method documentation gives a
|
/// The value for `push` is an expected cost; the method documentation gives a
|
||||||
/// more detailed analysis.
|
/// more detailed analysis.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
//! A contiguous growable array type with heap-allocated contents, written
|
//! A contiguous growable array type with heap-allocated contents, written
|
||||||
//! `Vec<T>`.
|
//! `Vec<T>`.
|
||||||
//!
|
//!
|
||||||
//! Vectors have `O(1)` indexing, amortized `O(1)` push (to the end) and
|
//! Vectors have *O*(1) indexing, amortized *O*(1) push (to the end) and
|
||||||
//! `O(1)` pop (from the end).
|
//! *O*(1) pop (from the end).
|
||||||
//!
|
//!
|
||||||
//! Vectors ensure they never allocate more than `isize::MAX` bytes.
|
//! Vectors ensure they never allocate more than `isize::MAX` bytes.
|
||||||
//!
|
//!
|
||||||
|
@ -1268,7 +1268,7 @@ impl<T, A: Allocator> Vec<T, A> {
|
||||||
///
|
///
|
||||||
/// The removed element is replaced by the last element of the vector.
|
/// The removed element is replaced by the last element of the vector.
|
||||||
///
|
///
|
||||||
/// This does not preserve ordering, but is O(1).
|
/// This does not preserve ordering, but is *O*(1).
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
///
|
///
|
||||||
|
|
|
@ -1798,10 +1798,11 @@ pub trait Iterator {
|
||||||
/// The relative order of partitioned items is not maintained.
|
/// The relative order of partitioned items is not maintained.
|
||||||
///
|
///
|
||||||
/// # Current implementation
|
/// # Current implementation
|
||||||
|
///
|
||||||
/// Current algorithms tries finding the first element for which the predicate evaluates
|
/// Current algorithms tries finding the first element for which the predicate evaluates
|
||||||
/// to false, and the last element for which it evaluates to true and repeatedly swaps them.
|
/// to false, and the last element for which it evaluates to true and repeatedly swaps them.
|
||||||
///
|
///
|
||||||
/// Time Complexity: *O*(*N*)
|
/// Time complexity: *O*(*n*)
|
||||||
///
|
///
|
||||||
/// See also [`is_partitioned()`] and [`partition()`].
|
/// See also [`is_partitioned()`] and [`partition()`].
|
||||||
///
|
///
|
||||||
|
|
|
@ -97,11 +97,11 @@
|
||||||
//!
|
//!
|
||||||
//! ## Sequences
|
//! ## Sequences
|
||||||
//!
|
//!
|
||||||
//! | | get(i) | insert(i) | remove(i) | append | split_off(i) |
|
//! | | get(i) | insert(i) | remove(i) | append | split_off(i) |
|
||||||
//! |----------------|----------------|-----------------|----------------|--------|----------------|
|
//! |----------------|------------------------|-------------------------|------------------------|-----------|------------------------|
|
||||||
//! | [`Vec`] | O(1) | O(n-i)* | O(n-i) | O(m)* | O(n-i) |
|
//! | [`Vec`] | *O*(1) | *O*(*n*-*i*)* | *O*(*n*-*i*) | *O*(*m*)* | *O*(*n*-*i*) |
|
||||||
//! | [`VecDeque`] | O(1) | O(min(i, n-i))* | O(min(i, n-i)) | O(m)* | O(min(i, n-i)) |
|
//! | [`VecDeque`] | *O*(1) | *O*(min(*i*, *n*-*i*))* | *O*(min(*i*, *n*-*i*)) | *O*(*m*)* | *O*(min(*i*, *n*-*i*)) |
|
||||||
//! | [`LinkedList`] | O(min(i, n-i)) | O(min(i, n-i)) | O(min(i, n-i)) | O(1) | O(min(i, n-i)) |
|
//! | [`LinkedList`] | *O*(min(*i*, *n*-*i*)) | *O*(min(*i*, *n*-*i*)) | *O*(min(*i*, *n*-*i*)) | *O*(1) | *O*(min(*i*, *n*-*i*)) |
|
||||||
//!
|
//!
|
||||||
//! Note that where ties occur, [`Vec`] is generally going to be faster than [`VecDeque`], and
|
//! Note that where ties occur, [`Vec`] is generally going to be faster than [`VecDeque`], and
|
||||||
//! [`VecDeque`] is generally going to be faster than [`LinkedList`].
|
//! [`VecDeque`] is generally going to be faster than [`LinkedList`].
|
||||||
|
@ -110,10 +110,10 @@
|
||||||
//!
|
//!
|
||||||
//! For Sets, all operations have the cost of the equivalent Map operation.
|
//! For Sets, all operations have the cost of the equivalent Map operation.
|
||||||
//!
|
//!
|
||||||
//! | | get | insert | remove | range | append |
|
//! | | get | insert | remove | range | append |
|
||||||
//! |--------------|-----------|-----------|-----------|-----------|--------|
|
//! |--------------|---------------|---------------|---------------|---------------|--------------|
|
||||||
//! | [`HashMap`] | O(1)~ | O(1)~* | O(1)~ | N/A | N/A |
|
//! | [`HashMap`] | *O*(1)~ | *O*(1)~* | *O*(1)~ | N/A | N/A |
|
||||||
//! | [`BTreeMap`] | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n+m) |
|
//! | [`BTreeMap`] | *O*(log(*n*)) | *O*(log(*n*)) | *O*(log(*n*)) | *O*(log(*n*)) | *O*(*n*+*m*) |
|
||||||
//!
|
//!
|
||||||
//! # Correct and Efficient Usage of Collections
|
//! # Correct and Efficient Usage of Collections
|
||||||
//!
|
//!
|
||||||
|
|
|
@ -43,8 +43,8 @@
|
||||||
//! terminator, so the buffer length is really `len+1` characters.
|
//! terminator, so the buffer length is really `len+1` characters.
|
||||||
//! Rust strings don't have a nul terminator; their length is always
|
//! Rust strings don't have a nul terminator; their length is always
|
||||||
//! stored and does not need to be calculated. While in Rust
|
//! stored and does not need to be calculated. While in Rust
|
||||||
//! accessing a string's length is a `O(1)` operation (because the
|
//! accessing a string's length is an *O*(1) operation (because the
|
||||||
//! length is stored); in C it is an `O(length)` operation because the
|
//! length is stored); in C it is an *O*(*n*) operation because the
|
||||||
//! length needs to be computed by scanning the string for the nul
|
//! length needs to be computed by scanning the string for the nul
|
||||||
//! terminator.
|
//! terminator.
|
||||||
//!
|
//!
|
||||||
|
|
|
@ -995,7 +995,7 @@ declare_clippy_lint! {
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// ### What it does
|
/// ### What it does
|
||||||
/// Checks for use of `.iter().nth()` (and the related
|
/// Checks for use of `.iter().nth()` (and the related
|
||||||
/// `.iter_mut().nth()`) on standard library types with O(1) element access.
|
/// `.iter_mut().nth()`) on standard library types with *O*(1) element access.
|
||||||
///
|
///
|
||||||
/// ### Why is this bad?
|
/// ### Why is this bad?
|
||||||
/// `.get()` and `.get_mut()` are more efficient and more
|
/// `.get()` and `.get_mut()` are more efficient and more
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue