Go admitirá un nuevo algoritmo de clasificación en la próxima versión: pdqsort

82ff6e7a6aa7d5e7400cd80e62cf1972.gif

Acabado | Sueño Yidan       

Listado | CSDN (ID: CSDNnews)

Tras la compatibilidad con los genéricos en Go 1.18 , Go admitirá el algoritmo de clasificación pdqsort en la próxima versión, lo que una vez más ha provocado una acalorada discusión entre los desarrolladores.

192e7e06c4cdae0aeb0e860de0051279.png

Actualmente, la descripción funcional relevante de pdqsort se presenta en la última confirmación del repositorio de Go:

  • En todos los puntos de referencia, pdqsort no parecía ser más lento que otros algoritmos anteriores;

  • En patrones comunes, pdqsort es generalmente más rápido (es decir, 10 veces más rápido en la clasificación de segmentos)

af1b1ddd311b0cf736fdc64566cdb0a2.png

498eb486a2da8b803d2a1427832d768b.png

¿Qué es el algoritmo de clasificación pdqsort?

pdqsort, abreviatura de Pattern-defeating quicksort, es un algoritmo de clasificación novedoso que combina el caso promedio rápido de clasificación rápida aleatoria con el peor de los casos rápido de clasificación en montón, al tiempo que logra un tiempo lineal en las entradas con patrones específicos. pdqsort es una extensión y mejora del introsort de David Mussers. Todo el código es gratuito bajo la licencia zlib.

Actualmente está implementado en C++ y Rust, y de acuerdo con la medición actual de muchos desarrolladores, pdqsort, que se usa más comúnmente como introsort, tendrá una mayor mejora en el rendimiento.

  • Implementación de C++: https://github.com/orlp/pdqsort

  • Implementación de óxido: https://docs.rs/pdqsort/latest/pdqsort/

Demostración de código C++:

#include <algorithm>
#include <functional>
#include <array>
#include <iostream>
#include <string_view>
 
int main()
{
    std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
 
    auto print = [&s](std::string_view const rem) {
        for (auto a : s) {
            std::cout << a << ' ';
        }
        std::cout << ": " << rem << '\n';
    };
 
    std::sort(s.begin(), s.end());
    print("sorted with the default operator<");
 
    std::sort(s.begin(), s.end(), std::greater<int>());
    print("sorted with the standard library compare function object");
 
    struct {
        bool operator()(int a, int b) const { return a < b; }
    } customLess;
    std::sort(s.begin(), s.end(), customLess);
    print("sorted with a custom function object");
 
    std::sort(s.begin(), s.end(), [](int a, int b) {
        return a > b;
    });
    print("sorted with a lambda expression");
}

Resultados de la:

0 1 2 3 4 5 6 7 8 9 : ordenado con el operador predeterminado< 9 8 7 6 5 4 3 2 1 0 : ordenado con el objeto de función de comparación de biblioteca estándar 0 1 2 3 4 5 6 7 8 9 : ordenado con un objeto de función personalizada 9 8 7 6 5 4 3 2 1 0: ordenado con una expresión lambda

Demostración de código de óxido:

extern crate pdqsort;


let mut v = [-5i32, 4, 1, -3, 2];


pdqsort::sort(&mut v);
assert!(v == [-5, -3, 1, 2, 4]);


pdqsort::sort_by(&mut v, |a, b| b.cmp(a));
assert!(v == [4, 2, 1, -3, -5]);


pdqsort::sort_by_key(&mut v, |k| k.abs());
assert!(v == [1, 2, -3, 4, -5]);

En cuanto a la compatibilidad de Go con el algoritmo pdqsort, se ha debatido mucho sobre HN. Algunas personas dijeron: Hemos estado estudiando algoritmos de clasificación durante tanto tiempo y nos sorprende que todavía podamos encontrar esquemas de optimización que puedan producir resultados reales. mejoras ¿Qué opinas sobre esto? Empecemos y experimentémoslo.

Link de referencia:

  • https://github.com/golang/go/commit/72e77a7f41bbf45d466119444307fd3ae996e257

  • https://noticias.ycombinator.com/item?id=31106157

  • https://en.cppreference.com/w/cpp/algorithm/sort

5c0730708ea0f9467d38092bd3582981.png

FIN

¡Este artículo es del próximo "Nuevo programador 004", un diálogo con maestros de clase mundial e informes sobre la innovación y la creación de la industria de TI de China!

03bc3d3a4cd15813ebc26bdd2eb766e9.png

 
  

- Lectura recomendada -

 
  
☞腾讯被曝要求员工还清90万房贷再离职;苹果因不附带充电器被判赔偿消费者7000元;Git 2.6发布|极客头条
☞《程序员延寿指南》登GitHub热榜,最多可增寿20年?
☞对话PostgreSQL作者Bruce:“转行”是为了更好地前行

—Haz clic aquí↓↓↓ Recuerda prestar atención a las estrellas~- 

"Compartir", "Me gusta" y "Ver" con un solo clic

Lograr 100 millones de técnicos

62a45e78dc2763e76c6c2668eaa79b8b.png

Supongo que te gusta

Origin blog.csdn.net/csdnnews/article/details/124335579
Recomendado
Clasificación