Clarify docs for std::collections · qinheping/verify-rust-std@95f9af0 (original) (raw)

`@@ -79,41 +79,49 @@

`

79

79

`//! see each type's documentation, and note that the names of actual methods may

`

80

80

`//! differ from the tables below on certain collections.

`

81

81

`//!

`

82

``

`-

//! Throughout the documentation, we will follow a few conventions. For all

`

83

``

`-

//! operations, the collection's size is denoted by n. If another collection is

`

84

``

`-

//! involved in the operation, it contains m elements. Operations which have an

`

85

``

`` -

//! amortized cost are suffixed with a *. Operations with an expected

``

86

``

`` -

//! cost are suffixed with a ~.

``

``

82

`+

//! Throughout the documentation, we will adhere to the following conventions

`

``

83

`+

//! for operation notation:

`

87

84

`//!

`

88

``

`-

//! All amortized costs are for the potential need to resize when capacity is

`

89

``

`-

//! exhausted. If a resize occurs it will take O(n) time. Our collections never

`

90

``

`-

//! automatically shrink, so removal operations aren't amortized. Over a

`

91

``

`-

//! sufficiently large series of operations, the average cost per operation will

`

92

``

`-

//! deterministically equal the given cost.

`

``

85

`` +

//! * The collection's size is denoted by n.

``

``

86

`` +

//! * If a second collection is involved, its size is denoted by m.

``

``

87

`` +

//! * Item indices are denoted by i.

``

``

88

`` +

//! * Operations which have an amortized cost are suffixed with a *.

``

``

89

`` +

//! * Operations with an expected cost are suffixed with a ~.

``

93

90

`//!

`

94

``

`` -

//! Only [HashMap] has expected costs, due to the probabilistic nature of hashing.

``

95

``

`` -

//! It is theoretically possible, though very unlikely, for [HashMap] to

``

96

``

`-

//! experience worse performance.

`

``

91

`+

//! Calling operations that add to a collection will occasionally require a

`

``

92

`+

//! collection to be resized - an extra operation that takes O(n) time.

`

97

93

`//!

`

98

``

`-

//! ## Sequences

`

``

94

`+

//! Amortized costs are calculated to account for the time cost of such resize

`

``

95

`+

//! operations over a sufficiently large series of operations. An individual

`

``

96

`+

//! operation may be slower or faster due to the sporadic nature of collection

`

``

97

`+

//! resizing, however the average cost per operation will approach the amortized

`

``

98

`+

//! cost.

`

99

99

`//!

`

100

``

`-

//! | | get(i) | insert(i) | remove(i) | append | split_off(i) |

`

101

``

`-

//! |----------------|------------------------|-------------------------|------------------------|-----------|------------------------|

`

102

``

`` -

//! | [Vec] | O(1) | O(n-i)* | O(n-i) | O(m)* | O(n-i) |

``

103

``

`` -

//! | [VecDeque] | O(1) | O(min(i, n-i))* | O(min(i, n-i)) | O(m)* | O(min(i, n-i)) |

``

104

``

`` -

//! | [LinkedList] | O(min(i, n-i)) | O(min(i, n-i)) | O(min(i, n-i)) | O(1) | O(min(i, n-i)) |

``

``

100

`+

//! Rust's collections never automatically shrink, so removal operations aren't

`

``

101

`+

//! amortized.

`

105

102

`//!

`

106

``

`` -

//! Note that where ties occur, [Vec] is generally going to be faster than [VecDeque], and

``

107

``

`` -

//! [VecDeque] is generally going to be faster than [LinkedList].

``

``

103

`` +

//! [HashMap] uses expected costs. It is theoretically possible, though very

``

``

104

`` +

//! unlikely, for [HashMap] to experience significantly worse performance than

``

``

105

`+

//! the expected cost. This is due to the probabilistic nature of hashing - i.e.

`

``

106

`+

//! it is possible to generate a duplicate hash given some input key that will

`

``

107

`+

//! requires extra computation to correct.

`

108

108

`//!

`

109

``

`-

//! ## Maps

`

``

109

`+

//! ## Cost of Collection Operations

`

110

110

`//!

`

111

``

`-

//! For Sets, all operations have the cost of the equivalent Map operation.

`

112

111

`//!

`

113

``

`-

//! | | get | insert | remove | range | append |

`

114

``

`-

//! |--------------|---------------|---------------|---------------|---------------|--------------|

`

115

``

`` -

//! | [HashMap] | O(1)~ | O(1)* | O(1) | N/A | N/A |

``

116

``

`` -

//! | [BTreeMap] | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n+m) |

``

``

112

`+

//! | | get(i) | insert(i) | remove(i) | append(Vec(m)) | split_off(i) | range | append |

`

``

113

`+

//! |----------------|------------------------|-------------------------|------------------------|-------------------|------------------------|-----------------|--------------|

`

``

114

`` +

//! | [Vec] | O(1) | O(n-i)* | O(n-i) | O(m)* | O(n-i) | N/A | N/A |

``

``

115

`` +

//! | [VecDeque] | O(1) | O(min(i, n-i))* | O(min(i, n-i)) | O(m)* | O(min(i, n-i)) | N/A | N/A |

``

``

116

`` +

//! | [LinkedList] | O(min(i, n-i)) | O(min(i, n-i)) | O(min(i, n-i)) | O(1) | O(min(i, n-i)) | N/A | N/A |

``

``

117

`` +

//! | [HashMap] | O(1)~ | O(1)* | O(1) | N/A | N/A | N/A | N/A |

``

``

118

`` +

//! | [BTreeMap] | O(log(n)) | O(log(n)) | O(log(n)) | N/A | N/A | O(log(n)) | O(n+m) |

``

``

119

`+

//!

`

``

120

`` +

//! Note that where ties occur, [Vec] is generally going to be faster than

``

``

121

`` +

//! [VecDeque], and [VecDeque] is generally going to be faster than

``

``

122

`` +

//! [LinkedList].

``

``

123

`+

//!

`

``

124

`+

//! For Sets, all operations have the cost of the equivalent Map operation.

`

117

125

`//!

`

118

126

`//! # Correct and Efficient Usage of Collections

`

119

127

`//!

`