バケットソートとは Python競プロメモ⑥


バケットソートとは、あらかじめデータがとりうる値すべての容器を順番通りに並べて用意しておき、値を対応する容器に移すことでソートを行う整列アルゴリズムのことである。

このアルゴリズムを使う際に注意すべき点として、データがとり得る値が分かってなければ、ソートのためのバケットを準備することができないため、このアルゴリズムを使うことができない。

今回はバケットソートの考え方を用いてリスト内に含まれている重複した数を取り出すコードを書いたので備忘録として記載しておく。

#dataがとり得る値の範囲は0以上200未満である
data = [123,23,123,123,0,0]
buckets = []
count_list = []
for i in range(200):
  buckets.append(i)
  count_list.append(0)
for k in data:
  for i in range(200):
    if buckets[i] == k:
      count_list[i] += 1
      break
count_list = list(set(count_list))
count_list.pop(0)
print(count_list)

=>[1,2,3]

これで重複した値がそれぞれ何個あるかが可視化できるようになった。
愚直にforやsetで無理やり求めることももちろん可能だが、このバケットソートの考えを使うことで高速化を図ることができた。

今回は何の数字がいくつ重複しているのか、という情報はいらなかったので、このような記述にしたが、もしなんの数字がいくつ重複しているのか、という情報が欲しいときは先ほどのコードと途中までは一緒で

#dataがとり得る値の範囲は0以上200未満である
data = [123,23,123,123,0,0]
buckets = []
count_list = []
for i in range(200):
  buckets.append(i)
  count_list.append(0)
for k in data:
  for i in range(200):
    if buckets[i] == k:
      count_list[i] += 1
      break
num = []
count_num = []
for i in range(len(count_list)):
  if count_list[i] != 0:
    num.append(i)
    count_num.append(count_list[i])
print(num)
print(count_num)

=>[0,23,123]
  [2,1,3]

このようにnumとcount_numを対応させることで、何の数字がいくつ重複しているのか、という情報を得ることができた。