Go言語は新しいソートアルゴリズムを導入します:pdqsort

元のリンク:Go言語は新しいソートアルゴリズムを導入します:pdqsort

みなさん、こんにちはasong最近倉庫で買い物をしていると、並べ替えアルゴリズム、つまり並べ替えアルゴリズムGoを見ました。バージョンで並べ替えアルゴリズムをサポートする予定です。これについては、以下で詳しく見ていきましょう。commitpdqsortGo

commitアドレス:github.com/golang/go/c…

スクリーンショット2022-05-061.37.10PM

これcommitで提示されるpqdsortテスト結果:

  • すべてのベンチマークで、pdqsort以前の他のアルゴリズムよりも遅いことが示されていません
  • 通常、一般的なパターンでは高速ですpdqsort(つまり、ソートされたスライスでは10倍高速です)

pdqsort本質的に、これはさまざまな状況でさまざまな並べ替えメカニズムに切り替わるハイブリッド並べ替えアルゴリズムです。実装はC++sumの実装に触発され、標準ライブラリアルゴリズムRUSTを改善したものです。理想的な時間の複雑さはO(n)で、最悪です。 -ケース時間の複雑さはO(n * logn)であり、追加のスペースは必要ありません。C++introsort

pdqsortアルゴリズムの改善は、一般的な状況の特別な最適化にあります。主なアイデアは、現在のシーケンス状況を継続的に判断し、さまざまな方法とパスを使用して最適なソリューションを実現することです。アルゴリズムの特定の実装を確認したい場合、確認できますhttps://github.com/zhangyunhao116/pdqsort。実際には、その実現は次の3つの状況の連続サイクルです。

  • 短いシーケンスの場合:長さが[0、MAX_INSERTION]の入力の場合、挿入ソートを使用して直接ソートして返します。ここで、Go言語のパフォーマンステストでは、MAX_INSERTIONが24として選択されています。
  • **最悪の場合、**改善されたクイックソートが無効であることが判明した場合(limit == 0)、ヒープソートが後続のソートに使用され、最悪の場合の時間計算量がO(n * logn)になるようにします。
  • **通常の場合、**他の入力の場合は、変更されたクイックソートを使用して並べ替えます

特定のソースコードの実装は自分で見ることができます。この記事ではあまり分析しません。pdqsortデモを見てみましょう。

import (
	"fmt"

	"github.com/zhangyunhao116/pdqsort"
)

func main() {
	x := []int{3, 1, 2, 4, 5, 9, 8, 7}
	pdqsort.Slice(x)
	fmt.Printf("sort_result = %v\n", x)
	search_result := pdqsort.Search(x, 4)
	fmt.Printf("search_result = %v\n", search_result)
	is_sort := pdqsort.SliceIsSorted(x)
	fmt.Printf("is_sort = %v\n", is_sort)
}
复制代码

演算結果:

sort_result = [1 2 3 4 5 7 8 9]
search_result = 3
is_sort = true
复制代码

このソートアルゴリズムの最適化についてどう思いますか?急いでそれを体験してください。

参照リンク:

さて、この記事はここで終わります、私は同意します、次回お会いしましょう。

パブリックアカウントへようこそ:Golang Dream Factory

おすすめ

転載: juejin.im/post/7098354555636678687