challenge 急勾配の判定

有限の長さの数列で,各要素の値が,その要素の後ろにある残りの列に含まれるすべての要素の和よりも大きい列を「急勾配の列」ということにします(空列の和は0とします).

任意の長さ(ただし有限の長さの)数列を与えられたとき,それが「急勾配の列」であるかどうかを判定する述語関数を定義してください.

必須ではありませんが,効率についてコメントがあれば面白いかもしれませんね.

Posted feedbacks - Other

とりあえず急勾配な場合でもO(n)。かっこわるいです。 一般的にはもっと良いはず。ランダムな数列において後ろから見たときに急勾配の条件に合わない値が出てくる確率ってどのくらいなんでしょう。(考えるのめんどくさい)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
List.metaClass.is急勾配 {->
    def sum
    for (val in delegate.reverse()) {
        if (sum != null && val <= sum) {
            return false
        }
        sum = (sum?:0) + val
    }
    return true
}

組み込み関数reversedのオーダは分かりませんが、少なくともそれ以外の部分は要素数について、線形時間です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/python

def checkSteep(target):
    li = reversed(target)
    sum = 0
    for x in li:
        if x <= sum: return False
        sum += x
    return True

if __name__ == '__main__':
    print 'Steep' if checkSteep([32, 16, 8, 4, 2, 1]) else 'not Steep' # => Steep
    print 'Steep' if checkSteep([32, 15, 8, 4, 2, 1]) else 'not Steep' # => not Steep

Index

Feed

Other

Link

Pathtraq

loading...