是否有一种本地方法来检查切片是否有重复?现在我用这个:如何检查切片中是否有重复?
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