ThinkStats (11)

演習問題 3-3 を考えてみる。例示されているのは以下な実装。

def PercentileRank(scores, your_score):
    count = 0
    for score in scores:
        if score <= your_score:
            count += 1

    percntile_rank = 100.0 * count / len(scores)
    return percentile_rank

def Percentile(scores, percentile_rank):
    scores.sort()
    for score in scores:
        if PercentileRank(scores, score) >= percentile_rank:
            return score

これは確かに非効率。テキストに記載されているように先にパーセンタイル順位を出してインデクスを計算した方が良いですね。
Parcentile な手続きのプロトタイプは同じ、となると

def Percentile(scores, percentile_rank):
    count = 0
    percentile_ranks = []
    scores.sort()

    for score in scores:
    	count += 1
        percentile_ranks.append(100.0 * count / len(scores))

    return scores[percentile_ranks.index(percentile_rank)]

本当かなぁ。と言いつつ修正後のソレを引用してたり。
バグッてた部分は以下。

  • count を増分させてなかった
  • return scores.index( ってヤッてた

選択アルゴリズム

別途確認の方向で。この後も面白いんですが別途で。