配列の基礎

概要

  • データの取得と更新がO(1)
  • 削除がO(n-i)
  • 時々resizingが必要になる
  • brute forceでO(n)spaceだが、ソリューションによってはO(1)space
  • 後ろから探索することが有効な時がある
  • 削除に変わって、オーバーライドが有効なこともある
  • 後ろから数字を扱うのが有効な時がある
  • 二次元配列には並行処理が有効な場合もある
  • シミュレーションするとソリューションが浮かびやすいこともある

5.1 Dutch flag problem

  • 数字の配列を、与えられたpivot以下、pivotと同じ値、pivotより大きい値に並べる
def dutch_flag(pivot_index, A):
    pivot = A[pivot_index]
    smaller, equal, larger = 0, 0, len(A)

    while equal < larger:
        if A[equal] < pivot:
            A[smaller], A[equal] = A[equal], A[smaller]
            smaller, equal = smaller + 1, equal + 1
        elif A[equal] == pivot:
            equal += 1
        else:
            larger -= 1
            A[equal], A[larger] = A[larger], A[equal]
    return A


ret = dutch_flag(1, [4, 0, -1, 1, -1, 1, 0, 2])
print(ret)
このエントリーをはてなブックマークに追加
Takatomo Honda avatar
About Takatomo Honda
システム開発 / プロトタイプ開発 / 開発組織の構築 / アプリケーションの内製化 /等、お気軽にご相談ください。