Rust에서 벡터를 내림차순으로 정렬하는 방법은 무엇입니까?

nnnmmm

Rust에서의 정렬 방법은 Vec항상 가장 작은 것부터 가장 큰 것까지 요소를 정렬합니다. 대신 가장 큰 것에서 가장 작은 것으로 정렬하는 범용 방법은 무엇입니까?

숫자 벡터가있는 경우 다음과 같이 숫자를 "반전"하는 키 추출 함수를 제공 할 수 있습니다.

let mut numbers: Vec<u32> = vec![100_000, 3, 6, 2];
numbers.sort_by_key(|n| std::u32::MAX - n);

그러나 그것은 그다지 명확하지 않으며 그 방법을 문자열과 같은 다른 유형으로 확장하는 것은 간단하지 않습니다.

nnnmmm

이를 수행하는 방법은 최소한 세 가지가 있습니다.

뒤집힌 비교 기능

vec.sort_by(|a, b| b.cmp(a))

이렇게하면 요소가 비교되는 순서가 전환되어 더 작은 요소가 정렬 기능에 더 크게 나타나고 그 반대의 경우도 마찬가지입니다.

역 Ord 인스턴스가있는 래퍼

use std::cmp::Reverse;
vec.sort_by_key(|w| Reverse(*w));

ReverseOrd래핑 된 유형의 순서와 반대 인 인스턴스를 가진 일반 래퍼입니다 .

Reverse를 제거하여 포함 된 참조 를 반환하려고하면 *내부에서 직접 참조를 반환 할 때와 마찬가지로 수명 문제가 발생합니다 sort_by_key( 이 질문 참조 ). 따라서이 코드 조각은 키가 Copy유형 인 벡터에만 사용할 수 있습니다.

정렬 후 반전

vec.sort();
vec.reverse();

처음에는 잘못된 순서로 정렬 한 다음 모든 요소를 ​​반대로합니다.

공연

criterion길이 100_000에 대해 세 가지 방법을 벤치마킹했습니다 Vec<u64>. 타이밍 결과는 위의 순서로 나열됩니다. 왼쪽 값과 오른쪽 값은 각각 신뢰 구간의 하한과 상한을 표시하고 중간 값은 criterion의 최선의 추정치입니다.

성능은 비슷하지만 반전 된 비교 기능은 약간 느립니다.

Sorting/sort_1          time:   [6.2189 ms 6.2539 ms 6.2936 ms]
Sorting/sort_2          time:   [6.1828 ms 6.1848 ms 6.1870 ms]
Sorting/sort_3          time:   [6.2090 ms 6.2112 ms 6.2138 ms]

로 다음 파일 저장, 재생하는 방법 benches/sort.rsCargo.toml, 다음 실행합니다 cargo bench. 벡터 복제 비용이 정렬과 관련이 없는지 확인하는 추가 벤치 마크가 있으며 몇 마이크로 초 만 소요됩니다.

fn generate_shuffled_data() -> Vec<u64> {
    use rand::Rng;
    let mut rng = rand::thread_rng();
    (0..100000).map(|_| rng.gen::<u64>()).collect()
}

pub fn no_sort<T: Ord>(vec: Vec<T>) -> Vec<T> {
    vec
}

pub fn sort_1<T: Ord>(mut vec: Vec<T>) -> Vec<T> {
    vec.sort_by(|a, b| b.cmp(a));
    vec
}

pub fn sort_2<T: Ord + Copy>(mut vec: Vec<T>) -> Vec<T> {
    vec.sort_by_key(|&w| std::cmp::Reverse(w));
    vec
}

pub fn sort_3<T: Ord>(mut vec: Vec<T>) -> Vec<T> {
    vec.sort();
    vec.reverse();
    vec
}

use criterion::{black_box, criterion_group, criterion_main, Criterion};

fn comparison_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("Sorting");
    let data = generate_shuffled_data();

    group.bench_function("no_sort", |b| {
        b.iter(|| black_box(no_sort(data.clone())))
    });

    group.bench_function("sort_1", |b| {
        b.iter(|| black_box(sort_1(data.clone())))
    });

    group.bench_function("sort_2", |b| {
        b.iter(|| black_box(sort_2(data.clone())))
    });

    group.bench_function("sort_3", |b| {
        b.iter(|| black_box(sort_3(data.clone())))
    });

    group.finish()
}

criterion_group!(benches, comparison_benchmark);
criterion_main!(benches);
[package]
name = "sorting_bench"
version = "0.1.0"
authors = ["nnnmmm"]
edition = "2018"

[[bench]]
name = "sort"
harness = false

[dev-dependencies]
criterion = "0.3"
rand = "0.7.3"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

지도 축소에서 데이터를 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

파일에서 텍스트를 읽고 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

내림차순 / 오름차순 값과 오름차순 / 내림차순 키로 Perl에서 해시 참조를 정렬하는 방법은 무엇입니까?

분류에서Dev

PHP에서 키로 배열을 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

PHP에서 키로 배열을 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

Dataweave에서 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

iOS에서 내림차순으로 배열을 정렬하는 방법은 무엇입니까?

분류에서Dev

Bash에서 문자열 배열을 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

내림차순으로 열별로 GridView를 정렬하는 방법은 무엇입니까?

분류에서Dev

내림차순으로 문자열 번호를 정렬하는 방법은 무엇입니까?

분류에서Dev

Django에서 데이터를 오름차순 및 내림차순으로 표시하는 방법은 무엇입니까?

분류에서Dev

터미널 폴더에서 파일을 오름차순 (내림차순)으로 표시하는 방법은 무엇입니까?

분류에서Dev

삼중 항 값에서만 주어진 열로 벡터를 정렬하는 방법은 무엇입니까?

분류에서Dev

Rust에서 정수 벡터를 반복하는 방법은 무엇입니까?

분류에서Dev

PHP에서 내림차순 배열로 두 차원 배열을 정렬하는 방법은 무엇입니까?

분류에서Dev

redis에서 삽입 순서에 따라 키를 내림차순으로 가져 오는 방법은 무엇입니까?

분류에서Dev

메서드 참조를 사용하여 내림차순으로 정렬하는 방법이 있습니까?

분류에서Dev

MongoDB-PHP : 오름차순 / 내림차순으로 타임 스탬프별로 조회 결과를 정렬하는 방법은 무엇입니까?

분류에서Dev

내림차순으로 열을 정렬하는 방법과 묶인 레코드를 찾은 경우 SQL의 다른 열에 따라 정렬하는 방법은 무엇입니까?

분류에서Dev

r에서 데이터 프레임의 순위를 지정하는 방법은 목록 요소를 기반으로 일부 열을 내림차순으로, 다른 열은 오름차순으로 정렬합니까?

분류에서Dev

libxml2 : xmlNode 결과를 오름차순 및 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

특정 속성을 기준으로 사용자 지정 개체의 NSArray를 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

행 순서에 관계없이 df의 각 열을 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

Scala에서 각 쌍의 두 번째 항목을 기준으로 숫자 쌍 목록을 내림차순으로 정렬하는 방법은 무엇입니까?

분류에서Dev

오름차순 및 내림차순으로 정렬을 수정하는 방법은 무엇입니까?

분류에서Dev

객체 배열을 내림차순으로 올바르게 정렬하고 Java에서 검색하는 방법은 무엇입니까?

분류에서Dev

Excel-초기 값과 최종 값이 알려져 있으며, 내림차순으로 사이에 난수를 생성하는 방법은 무엇입니까?

분류에서Dev

R의 다른 벡터 순서와 일치하도록 벡터를 재정렬하는 방법은 무엇입니까?

분류에서Dev

자바 스크립트에서 가장 많이 반복되는 배열 값을 내림차순으로 정렬하고 반환하는 함수를 만드는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    지도 축소에서 데이터를 내림차순으로 정렬하는 방법은 무엇입니까?

  2. 2

    파일에서 텍스트를 읽고 내림차순으로 정렬하는 방법은 무엇입니까?

  3. 3

    내림차순 / 오름차순 값과 오름차순 / 내림차순 키로 Perl에서 해시 참조를 정렬하는 방법은 무엇입니까?

  4. 4

    PHP에서 키로 배열을 내림차순으로 정렬하는 방법은 무엇입니까?

  5. 5

    PHP에서 키로 배열을 내림차순으로 정렬하는 방법은 무엇입니까?

  6. 6

    Dataweave에서 내림차순으로 정렬하는 방법은 무엇입니까?

  7. 7

    iOS에서 내림차순으로 배열을 정렬하는 방법은 무엇입니까?

  8. 8

    Bash에서 문자열 배열을 내림차순으로 정렬하는 방법은 무엇입니까?

  9. 9

    내림차순으로 열별로 GridView를 정렬하는 방법은 무엇입니까?

  10. 10

    내림차순으로 문자열 번호를 정렬하는 방법은 무엇입니까?

  11. 11

    Django에서 데이터를 오름차순 및 내림차순으로 표시하는 방법은 무엇입니까?

  12. 12

    터미널 폴더에서 파일을 오름차순 (내림차순)으로 표시하는 방법은 무엇입니까?

  13. 13

    삼중 항 값에서만 주어진 열로 벡터를 정렬하는 방법은 무엇입니까?

  14. 14

    Rust에서 정수 벡터를 반복하는 방법은 무엇입니까?

  15. 15

    PHP에서 내림차순 배열로 두 차원 배열을 정렬하는 방법은 무엇입니까?

  16. 16

    redis에서 삽입 순서에 따라 키를 내림차순으로 가져 오는 방법은 무엇입니까?

  17. 17

    메서드 참조를 사용하여 내림차순으로 정렬하는 방법이 있습니까?

  18. 18

    MongoDB-PHP : 오름차순 / 내림차순으로 타임 스탬프별로 조회 결과를 정렬하는 방법은 무엇입니까?

  19. 19

    내림차순으로 열을 정렬하는 방법과 묶인 레코드를 찾은 경우 SQL의 다른 열에 따라 정렬하는 방법은 무엇입니까?

  20. 20

    r에서 데이터 프레임의 순위를 지정하는 방법은 목록 요소를 기반으로 일부 열을 내림차순으로, 다른 열은 오름차순으로 정렬합니까?

  21. 21

    libxml2 : xmlNode 결과를 오름차순 및 내림차순으로 정렬하는 방법은 무엇입니까?

  22. 22

    특정 속성을 기준으로 사용자 지정 개체의 NSArray를 내림차순으로 정렬하는 방법은 무엇입니까?

  23. 23

    행 순서에 관계없이 df의 각 열을 내림차순으로 정렬하는 방법은 무엇입니까?

  24. 24

    Scala에서 각 쌍의 두 번째 항목을 기준으로 숫자 쌍 목록을 내림차순으로 정렬하는 방법은 무엇입니까?

  25. 25

    오름차순 및 내림차순으로 정렬을 수정하는 방법은 무엇입니까?

  26. 26

    객체 배열을 내림차순으로 올바르게 정렬하고 Java에서 검색하는 방법은 무엇입니까?

  27. 27

    Excel-초기 값과 최종 값이 알려져 있으며, 내림차순으로 사이에 난수를 생성하는 방법은 무엇입니까?

  28. 28

    R의 다른 벡터 순서와 일치하도록 벡터를 재정렬하는 방법은 무엇입니까?

  29. 29

    자바 스크립트에서 가장 많이 반복되는 배열 값을 내림차순으로 정렬하고 반환하는 함수를 만드는 방법은 무엇입니까?

뜨겁다태그

보관