Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

3 25 本の整理問題の解説

4,094 views

Published on

paizaでpizzaイベントの問題解説
http://paiza.hatenablog.com/entry/2017/04/06/%E3%80%8Cpaiza%E5%B0%B1%E6%B4%BB%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%80%8D%E3%81%A7%E5%87%BA%E9%A1%8C%E3%81%95%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C

Published in: Business
  • Be the first to comment

  • Be the first to like this

3 25 本の整理問題の解説

  1. 1. イベント問題解説 本の整理
  2. 2. アルゴリズムの改善 5432 1 i = 1に立つ→赤い本(ID=1)の本まで歩く→ j = 4 i ≠ j なので入れ替える i = 2 に立つ→オレンジの本(ID=2)の本まで歩く→ j = 4 i ≠ j なので入れ替える 541 3 2 i = 3 に立つ→黄色の本(ID=3)の本まで歩く→ j = 4 i ≠ j なので入れ替える 541 32 i = 4 に立つ→青色の本(ID=5)の本まで歩く→ j = 4 i = jなので入れ替えない 541 32 挿入ソート的な手順。計算量的には O(N^2 )
  3. 3. 本の整理 N = int(input()) A = list(map(int, input().split())) cnt = 0 for i in range(N-1): min_index = A.index(min(A[i::])) if A[i] != A[min_index]: A[i], A[min_index] = A[min_index], A[i] cnt += 1 print(cnt) Pythonのコードはこんな感じ・・・計算量は O(N^2) N=100000 100000^2だと10000000000 中々厳しい・・・
  4. 4. ここで考えるのは・・・・ 一番小さい数字の本のところまで歩いて確認して行くのに時間がかかっています。 じゃあそれを楽にしようと考えます。 Pythonのコードで言うとmin()関数の部分 一番小さい数字というのは、並べ替えていくので、必ず 1, 2 ,3 … N と順に見ていく事になります。 それを考えると1が何番目にある、2が何番目にあるというように記録しておくと良いことに気が付きます。 5432 1 4 1 2 3 5 1が4番目にある 2が1番目にある 3が2番目にある 4が3番目にある 5が5番目にある というように配列に記録しておく この作業自体は N 回の操作 (1からN番目まで歩いて記録していけば )のみで済む
  5. 5. 5432 1 4 1 2 3 5 本の i = 1 を見た時に→オレンジ本のID=2 i = 1 が ID=2では当然交換が必要。 交換対象は ID=1 の本なので位置を確認。 本は ID=1 の本の位置と ID=2 の本の位置の交換 記録は ID=1 の本の記録と ID=2 の本の記録の交換 をする 同じように i = 2 を見た時は 本は ID=2 の本の位置と ID=3 の本の位置を交換 記録は ID=2 の本の位置と ID=3 の本の位置を交換 ID=1の本の位置を確認 1 4 2 3 5 ID=2の本の位置を確認 543 21 …… このようにすると、本の位置を確認する際に順に見る必要がないので交換する位置を O(1) で確認できます。 (先の手順では最大で一番うしろまで順に見るので最悪 O(N) ) よって計算量は O(N) となります。
  6. 6. N = int(input()) A = list(map(lambda a: int(a)-1, input().split())) R = [0]*N for i in range(N): R[A[i]] = i ans = 0 for i in range(N): if A[i] != i: tmp = R[i] R[i], R[A[i]] = R[A[i]], R[i] A[i], A[tmp] = A[tmp], A[i] ans += 1 print(ans) Pythonでのコードは以下の通り
  7. 7. この問題の意図は… ここまで説明するとバケット(バケツ)ソートを連想した人がいるかも…? 各要素が1つしか存在しないバケットソートを実装するのと同等となります。 バケットソートを発想することができたり ソートアルゴリズムを自ら実装出来るかを問うています

×