Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで相対ソート配列を解く方法:arr2の順序に従った並べ替えの実装例

問題の概要

2つの配列 arr1arr2 が与えられます。arr2 の要素はすべて一意(重複なし)であり、arr2 の全要素は arr1 にも含まれています。この条件のもと、arr1arr2 と同じ相対的な順序になるように並べ替えます。arr2 に存在しない要素については、arr1 の末尾に昇順で配置します。

例えば、arr1 = [2,3,1,3,2,4,6,7,9,2,19]arr2 = [2,1,4,3,9,6] の場合、出力は [2,2,2,1,4,3,3,9,6,7,19] になります。

解法のステップ

  • 辞書(マップ)D を作成し、arr1 に含まれる各要素の出現回数を記録します。
  • 結果を格納する配列 res と、残りの要素を一時的に保持する配列 temp を定義します。
  • arr2 の各要素 i に対して、以下を繰り返します。
    • D[i] 回だけ ires に追加します。
    • D[i] を 0 にリセットします。
  • 辞書 D の(キー, 値)ペアを走査し、値が 0 でない場合は、そのキーを値の回数だけ temp に追加します。
  • temp をソートし、res の末尾に連結して返します。

Pythonでの実装例

以下のコードは、上記の手順を実際に実装したものです。

class Solution(object):
    def relativeSortArray(self, arr1, arr2):
        d = {}
        for i in arr1:
            if i not in d:
                d[i] = 1
            else:
                d[i] += 1
        res = []
        temp = []
        for i in arr2:
            for j in range(d[i]):
                res.append(i)
            d[i] = 0
        for k, v in d.items():
            if v:
                for i in range(v):
                    temp.append(k)
        temp.sort()
        res.extend(temp)
        return res

ob1 = Solution()
print(ob1.relativeSortArray([2,3,1,3,2,4,6,7,9,2,19], [2,1,4,3,9,6]))

入力

[2,3,1,3,2,4,6,7,9,2,19]
[2,1,4,3,9,6]

出力

[2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19]

計算量の目安

n を arr1 の長さ、m を arr2 の長さとすると、出現回数の集計に O(n)、arr2 に基づく配置に O(m)、残り要素のソートに O(k log k)(k は arr2 に含まれない要素の総数)がかかります。全体の時間計算量は O(n + m + k log k)、空間計算量は O(n) です。

なお、Pythonでは標準ライブラリの collections.Counter を利用すると、出現回数の集計部分をより簡潔に記述できます。ロジックの本質は変わらないため、まずは上記の基本形を理解しておくと応用が効きやすくなります。

  1. Pythonで挿入ソート(Insertion Sort)を実装する方法:アルゴリズムとサンプルコードを徹底解説

    この記事では、Python 3.x(およびそれ以前のバージョン)における挿入ソートの実装方法について詳しく解説します。挿入ソートは、トランプの手札を整理するイメージに近い、直感的で理解しやすいソートアルゴリズムです。挿入ソートのアルゴリズム挿入ソートは以下の手順で動作します。入力要素を順番に走査し、各反復ごとにソート済みの配列部分を少しずつ拡張していきます。現在注目している要素(キー)を、ソート済み部分の中で最も大きい値と比較します。キーがその値より大きければ、要素は元の位置のまま次の要素へ進みます。そうでなければ、ソート済み配列内の正しい位置を探し出し、そこへ移動させます。具体的には、ソート

  2. Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法

    この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要