是否有一種本地方法來檢查切片是否有重複?現在我用這個:如何檢查切片中是否有重複?
fn has_dup<T: PartialEq>(slice: &[T]) -> bool {
for i in 1..slice.len() {
if slice[i..].contains(&slice[i - 1]) {
return true;
}
}
false
}
fn main() {
use std::ops::Not;
assert!(has_dup(&[1, 2, 3, 2, 5, 6]));
assert!(has_dup(&[1, 2, 3, 4, 5, 6]).not());
}
但是對於這種基本操作,我不喜歡用手工編碼。
如果在標準庫中沒有可用的函數來執行此操作,是否可以優化我的代碼?我知道索引切片不是最優化的方式(for i in slice {}
vs for i in 0..slice.len() { slice[i] }
)。
這基本上是[Element distinctness problem](https://en.wikipedia.org/wiki/Element_distinctness_problem)。比檢查每個元素與列表的其餘部分是'O(n^2)'還是更有效的方法,但是這些都沒有在std中實現。然而,這種折衷是他們可能需要更多的記憶。在rosetta-code上查看[使用HashSet移除dupes]的方法(https://github.com/Hoverbear/rust-rosetta/blob/master/tasks/remove-duplicate-elements/src/main.rs)。這是刪除vs只是檢查,但它應該讓你知道如何做到這一點。 –
@PaoloFalabella這很奇怪,這樣一個基本的算法不在std中。 – Boiethios
@Boiethios爲什麼你認爲這是一個「基本」算法?即使是這樣,請記住許多人認爲「基本」的*隨機數生成*是由一個箱子提供的。 – Shepmaster