Go 言語アルゴリズムの美しさ - 基本的なソート

Go 言語アルゴリズムの美しさ - 基本的なソート

[[404642]]

この記事はWeChatの公開アカウント「roseduanの執筆場所」から転載したもので、著者はroseduanです。この記事を転載する場合は、roseduanが執筆しているローカルの公開アカウントまでご連絡ください。

Rosedb ビデオを録画するときに、穴を掘って、一般的なデータ構造とアルゴリズムを Go 言語で実装すると言いました。すでにそのような記事はたくさんありますが、Rose 兄弟?? 埋めなければならない穴があります! 勇気を出してこのシリーズを書くしかないので、これを Go 言語アルゴリズムの美しさと呼びましょう!

ソートは非常に古い問題であり、コンピュータ分野における古典的なアルゴリズム問題の 1 つです。次の記事では、一般的なソート アルゴリズムについて説明します。

完全なコードを添付し、関連する Leetcode の質問をいくつかお勧めします。これらの質問は、アルゴリズムの知識を学習して強化するだけでなく、面接でより快適に過ごすのにも役立ちます。

この記事では、バブルソート、選択ソート、挿入ソートという 3 つの基本的なソートアルゴリズムを紹介します。

バブルソート

バブルソートは比較と交換に基づいています。基本的な考え方は、データを走査することです。隣接する要素のサイズが異なる場合、それらの位置が交換され、データが完全に順序付けられるまでこのサイクルが繰り返されます。

下の図に示すように、テストデータ -2 45 0 11 -9 があります。

最初のトラバースでは、データ内の最大値 45 が末尾に移動され、次に 45 以外のデータが再度トラバースされて最大値が 45 の前に移動します。最後の要素を走査した後、データは順序どおりになります。

次の図は、バブルソートのプロセスをより直感的に示しています。

コードは次のとおりです。

  1. 関数 bubbleSort(data[] int ) {
  2. i := 0; i < len(データ); i++ {
  3. j := 0; j < len(data)-i-1; j++ {
  4. データ[j] > データ[j+1]の場合{
  5. データ[j]、データ[j+1] = データ[j+1]、データ[j]
  6. }
  7. }
  8. }
  9. }

ここで、小さな最適化ポイントがあります。データが元々 1 3 4 5 6 のように順序付けられている場合、一度走査した後、交換するデータがないことがわかります。早期に終了して、走査を続ける必要はありません。コードは次のように最適化できます。

  1. 関数 bubbleSort(data[] int ) {
  2. スワップ:= true  
  3. i := 0; i < len(data) && swap; i++ {
  4. スワップ = 
  5. j := 0; j < len(data)-i-1; j++ {
  6. データ[j] > データ[j+1]の場合{
  7. データ[j]、データ[j+1] = データ[j+1]、データ[j]
  8. スワップ = 
  9. }
  10. }
  11. }
  12. }

バブルソート関連の複雑さ:

時間計算量
最悪 O(n2 ) 場合
ほとんど の上)
平均 O(n2 ) 場合
空間の複雑さ オー(1)
安定していますか? はい

選択ソート

選択ソートも理解しやすいです。順序付けられていない配列の場合、配列内の最小値を毎回検索し、それを最初の要素と交換します。

下の図に示すように、テストデータは 20 12 10 15 2 です。最初のトラバーサルで見つかった最小値は 2 です。

そして、それを配列の最初の要素と交換します。

次に、残りのデータで最小値を探し続け、それを配列の 2 番目の要素と交換し、最後のデータまでこのサイクルを繰り返して、配列全体を順序付けます。

次のアニメーションは、選択ソートのプロセス全体を理解するのに役立ちます。

コード実装:

  1. 関数selectionSort(data[] int ) {
  2. i := 0; i < len(data)-1; i++ {
  3. 最小:= i
  4. j : = i + 1; j < len(データ); j++ {
  5. データ[j] < データ[ min ]の場合
  6. 最小= j
  7. }
  8. }
  9. データ[i]、データ[] = データ[]、データ[i]
  10. }
  11. }

選択ソート関連の複雑さ:

時間計算量
最悪 O(n2 ) 場合
ほとんど O(n2 ) 場合
平均 O(n2 ) 場合
空間の複雑さ オー(1)
安定していますか? いいえ

挿入ソート

カードゲームをしていた頃を思い出してください。私たちはどのようにして手札のカードを並べたでしょうか。新しいカードが来たら、すでに手札にあるカードの中から適切な位置を見つけて、それを差し込みます。

挿入ソートでも同じことが言えます。挿入ソートでは、配列内の各データを順に走査し、適切な位置に挿入します。次のアニメーション画像は、このプロセスをより鮮明に示しています。

コードは次のように実装されます。

  1. 関数挿入ソート(データ[] int ) {
  2. i := 0; i < len(data)-1; i++ {
  3. j, k := i+1、データ[i+1]
  4. に対して; j > 0 && data[j-1] > k; j -- {  
  5. データ[j] = データ[j-1]
  6. }
  7. データ[j] = k
  8. }
  9. }

挿入ソート関連の複雑さ:

時間計算量
最悪 O(n2 ) 場合
ほとんど の上)
平均 O(n2 ) 場合
空間の複雑さ オー(1)
安定していますか? はい

注: 完全なコードを Github アドレスに置きました:

https://github.com/roseduan/Go-アルゴリズム

<<:  生体認証技術丨「ブラックテクノロジー」で体のパスワードを解読

>>:  北京大学の研究者らは、今回AIが「平らになる」理由を発見した。それはすべてデータセットのせいだ

ブログ    
ブログ    

推薦する

...

アンドリュー・ングのパレートの法則: データの 80% + モデルの 20% = より優れた機械学習

機械学習の進歩がモデルによってもたらされるのか、それともデータによってもたらされるのかは、今世紀の論...

Weibo の背後にあるビッグデータの原理を探る: 推奨アルゴリズム

推薦システムは早くから誕生していたが、本格的に注目されるようになったのは、「Facebook」に代表...

2019年北京知源会議が北京で開幕、中国と海外の学術リーダーが人工知能研究の最前線について議論

10月31日、北京知源人工知能研究所が主催する2019年北京知源大会が国家会議センターで2日間にわた...

VAE から拡散モデルへ: テキストを使用して画像を作成する新しいパラダイム

1 はじめにDALL·E のリリースから 15 か月後、OpenAI は今春、続編の DALL·E ...

サイバー犯罪におけるAI時代の到来

人工知能の分野で画期的な進歩が起こったばかりであり、サイバーセキュリティに携わっている人であれば、そ...

Dianping.com における検索関連性技術の探求と実践

著者: Xiaoya、Shen Yuan、Judy など1. 背景レビュー検索は、Dianping ...

利便性を超えて:スマートホームは信頼できるのか?

映画鑑賞の夜に快適なアームチェアに腰を下ろすと、プロジェクターが起動し、スマートライトが自動的に暗く...

GitHubが機械学習ベースのコードスキャンと分析機能を開始

GitHub は、クロスサイト スクリプティング (XSS)、パス インジェクション、NoSQL イ...

人工知能はどれくらい怖いのでしょうか?アメリカはAI兵器を開発し、イランの科学者は死亡した

[[358758]]人工知能はかつてはSF映画にしか登場しない言葉でした。しかし、通信、ビッグデータ...

指紋と顔は本当に生体認証を表現できるのでしょうか?

今年初めから現在まで、ToFセンサーはApple、Samsung、GD、AMSなどのセンサー企業やス...

ディープラーニング + OpenCV、Python でリアルタイムのビデオ オブジェクト検出を実現

OpenCV と Python を使用してライブ ビデオ ストリームでディープラーニング オブジェク...

顔認識アクセス制御システムの登場により、私たちのプライバシーを誰が守るのでしょうか?

最近は「顔カード」、つまり「顔を売る」という言葉をよく耳にしますが、あなたの「顔」が身分証明書や電話...

GPT-3 ハイパーパラメータは単一の GPU で解決できます。まず小さなモデルをトレーニングし、ワンクリックで移行します

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...