バブル&ビンから脱却。バケットソートは最速のソートです。

バケットソートアルゴリズムは、おそらく製品の世界を飾る最高のソート方法なので、クリックしないでください。

しかし、その理由を説明します。

今回のバケツソートの記事で

では、バケットソート法とはどのようなものなのでしょうか。

バケットソートは、配列のデータを並べ替えるという前提で始めると、とても良い出発点になります。もし、あなたのニーズに合っていれば、これ以上探す必要はありません。

項目の配列を並べ替えるには、リストを走査して各値を比較し正しい順序を見つける方法(バブルソート)と、各値に専用の記憶領域を与えてそれぞれの場所に移動させる方法(ビンソート)がある。

バケットソートは後者の方法、つまりビンソートで動作します。バケットソートがなぜ優れているのかを紹介する前に、ビンソートとどう違うのかを詳しく見ていきましょう。

では、10 個の整数を含む配列があるとします。これがバケツです。それぞれのバケツに入っているアイテムの数を表すカウンタがあり、起動時にはこのカウンタは配列の要素数、つまり 10 と等しくなっています。

この配列を並べ替える前に、各バケツに同じ値、つまり0から9までの整数値を入れてみましょう。

5つのバケツがすべて満杯になったので、次は仕分けに移ります。各バケツの容量はどのようにして知るのでしょうか?各バケツには現在入っている値の2倍の値が入ります。つまり、2n(n = 0〜9、バケツ10個分)です。ここで2倍にしているのは、あるバケツの中に探している値が入っているかどうかを確認するために、そのバケツの中を見に行くとき、1/10のスペースしか取らないからです。

例えば、バケツ5には8つの値(8 * 2)が入っており、2つの値を含む次の最小のバケツには4つの値(4 * 2)が入っています。これがいかに2倍になっているかわかりますか?

最初にソートされる値、つまり 5 を見てみると、5 番のバケツの中を探すには、その容量の少なさからほんの数秒しかかからないことがわかります。では、配列の中で 34 がどこにあるか探すとしましょう。この場合、34 番のバケツを探すのに 0.000000001 秒かかるわけではありません。なぜならそこには 100000 個もの値があるからです。

さて、要点はつかめたと思います。では、バケットソートの代替案をざっと見てみましょう。

バケットソートアルゴリズムの歴史

では、この方法はいつから始まったのだろうか。バケットソートは1955年に発明されたとされているが、少なくとも1945年からこの方法があったことが後に判明している。

1970年代に普及し始めたが、コンピュータの速度が本格的に向上し始めた1995年までは、まだ広く採用されていなかった。

今日、バケットソートは最も人気のあるソートアルゴリズムのひとつとなっています。マージソートやクイックソートに次いで3番目です。ビンソートもバケットソートも一般的には O(n * log(n)) であるため、これは大きな問題ではないように見えますが、もしあなたのデータが大きければ、比較を効率的に行うためにバケットソートを使いたいことでしょう。

ビン・バブルソートとは?

ビンソートでは、ソートされる各値に対して別々の「領域」を持つことが考えられています。以下はビンソートの実装例です。

この実装はおそらくバケットソートよりも速くなく、バケットソートとほぼ同じ時間複雑性ですが、もしほんの少し余分に削ることができるとしたらどうでしょう?まあ、それは可能です!

バブルソートとバケットソートの比較 - バブルソートはどのような方程式に当てはまりますか?

バブルソートでは、隣り合った2つの値を比較し、必要なら入れ替えるだけです(ブルートフォースアプローチ)。バケットソートとの唯一の違いは、バケットの大きさで、バブルソートではすべて同じ大きさになっています。バケットソートで一番大きいバケットと同じ大きさにすると、バケットソートになります。

バブルソートとバケットソートの比較 - なぜバケットソートの方が速いのか?

一言で言えば、バブルソートの時間計算量は O(n^2) です。バケットソートの時間計算量は、その中の要素を見つけるために必要なすべての分岐を掛け合わせることで求められます。つまり、最終的に見つけるか、十分に深入りしないかのどちらかになるまで、すべてのバケットの中を探すのです。

もし、これを10個のバケツに10万個のアイテムを入れたら......このシステムは長くは持ちませんね。ビンソートがうまく機能しない理由もそこにあります。

では、バケットソートに10万点のバケットを持たせてみたらどうでしょう?今、バケットソートにかかる時間は?O(n) (線形)!

そうなんです。100000個の整数の配列を線形探索するのと同じです。バケットソートアルゴリズムが裏で行っているすべての分岐とチェックは、「この整数は私が探しているものより小さいか大きいか」ということに集約されます。

バケットソート ビッグオー

バケットソート Big O表記はO(n + n * k)、ここでnは配列の要素数、kはバケットの数です。

バケットソートタイムコンプリシティ

バケットソートの時間複雑性はバケットの数の関数である。バケットが1つのバケットソートは一定の時間を要しますが、2つ以上のバケットを持つバケットソートは、各ステップで常に2つの操作が行われるため、実行時間が加算されます:1)要素がすでに配置されているかどうかをチェックし、2)要素を正しい位置に配置すること。この一定の乗算係数の選択は、データ構造をどの程度の大きさにしたいのか、あなた次第です。一般に、このような最適化は、アイテム数が非常に多くなるまで必要ないかもしれない。

バケットソート Java

java でバケットソートアルゴリズムを実装するには、まずバケットデータ構造を作成する必要があります。最も簡単な方法は、自動拡張機能を持つ ArrayList を使うことでしょうが、リンクリストやその他のものを好むなら、それはあなた次第です!私はここで、独自のソートアルゴリズムをプログラムする方法を教えるつもりはありません。

import java.util.*; class BucketSort { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here List<Integer> arr = new ArrayList<Integer>(); for (int i = 0; i < 100000; i++) { arr.add(i); } Bucket sortBucketSort = new BucketSort(); String bucketName = “”; int[] bucketArray = null; System.out.println(“Please input the number of buckets you would like to use.”); int bucketNumInput = Integer.parseInt( JOptionPane.showInputDialog(“How many buckets do you want?”)); if (bucketNumInput < 1) { JOptionPane.showMessageDialog(null, “Invalid Number”); return; } if (arr == null) { arr = new ArrayList<Integer>(); } bucketArray=new int [bucketNumInput]; for (int i=0; i<bucketNumInput ;i++){ bucketArray [i]=arr.size(); } Arrays.sort(bucketArray); for (int i=0; i<bucketArray.length-1; i++) { bucketName = Integer.toString(bucketArray [i]); System.out.println(“Working on bucket ” + bucketName); // inserts data from array to proper location int j = 0; while (j < arr.size()) { if (arr.get(j) > bucketArray [i+1]) { break; } else if (arr.get(j) <= bucketArray [i+1]) { continue; } else { arr.set(j, bucketArray [i+1]); j++; } } bucketArray [i] = arr.size(); // delete from array } System.out.println(“All done!”); for (int i=0; i<bucketArray.length-1; i++) { System.out.println(“Working on bucket ” + bucketName); System.out .print(bucketName + “, you have ” + arr.get(bucketArray [i])); if (arr.get(bucketArray [i]) != 0) { bucketName = Integer .toString(bucketArray [i]); System.out .print(“Removing ” + bucketName); arr .remove(bucketArray [i]); }

Phew!長いコードだ

バケットソートアルゴリズム - 最速の並べ替えアルゴリズム...

さて、バケットソートアルゴリズムとは何か、おわかりいただけたでしょうか。バケットソートは大きなデータの塊を高速にソートする方法であり、特にインメモリデータをソートする際に有効です。バケットソートアルゴリズムを使えば、100000個の整数を素早くソートすることができます。これは、他のあらゆるソートアルゴリズムでは不可能なことですいかがでしょうか?これからはバケツソートがあなたの定番になるのでしょうか?

tl;dvビジネス向け
tl;dv は、組織全体の会議から価値を得るお手伝いをします。記録、書き起こし、要約、生成、自動化することで、あなたと組織にとって価値ある会議の洞察を得ることができます。数分でセットアップ完了。
録音・録画は無制限
AIサマリー
Asktl;dv AI
30以上の言語に対応
マルチミーティングAIレポート
+5000の統合

tl;dv ブログ

ブログを購読する

会議、営業、Customer Success 、生産性、職場文化に関する最新のヒントやニュースをお届けします。