6.00 Introduction to Computer Science and Programming Lec 9: Lecture 9: Memory and Search Methods

5508 ワード

このlecは主にソートアルゴリズムについて述べ,まずlistの実現から始まる.Pythonのリストは明らかに可変で、様々なタイプの要素を自由に追加、削除することができ、Javaのリストに似ているものもあります.Pythonのリストは、リストに格納されている要素のタイプが異なるため、チェーンテーブルを用いてこの問題を解決することは明らかにできないが、効率の問題があり、例えばリストaListの199番目の要素aList[198]を検索すると、198回リンクする必要がある.純粋な配列と純粋なチェーンテーブルがこの問題を解決できない場合,両者を組み合わせると,比較的良い解決策を形成することができる.PythonにおけるListの実装を下図に示す.
このlecの他の部分は主によく使われるソートアルゴリズムの説明に集中しており、コードを貼って見ればいいです.
def bSearch(L, e, low, high):
    if high - low < 2:
        return L[low] == e or L[high] == e
    mid = low + int((high - low)/2)
    if L[mid] == e:
        return True
    if L[mid] > e:
        return bSearch(L, e, low, mid - 1)
    else:
        return bSearch(L, e, mid + 1, high)

def selSort(L):
    """Assumes that L is a list of elements that can be compared
       using >.  Sorts L in ascending order"""
    for i in range(len(L) - 1):
        #Invariant: the list L[:i] is sorted
        minIndx = i
        minVal= L[i]
        j = i + 1
        while j < len(L):
            if minVal > L[j]:
                minIndx = j
                minVal= L[j]
            j += 1
        temp = L[i]
        L[i] = L[minIndx]
        L[minIndx] = temp
        print 'Partially sorted list =', L

##L = [35, 4, 5, 29, 17, 58, 0]
##selSort(L)
##print 'Sorted list =', L

def merge(left, right, lt):
    """Assumes left and right are sorted lists.
     lt defines an ordering on the elements of the lists.
     Returns a new sorted(by lt) list containing the same elements
     as (left + right) would contain."""
    result = []
    i,j = 0, 0
    while i < len(left) and j < len(right):
        if lt(left[i], right[j]):
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    while (i < len(left)):
        result.append(left[i])
        i += 1
    while (j < len(right)):
        result.append(right[j])
        j += 1
    return result
            
def sort(L, lt = lambda x,y: x < y):
    """Returns a new sorted list containing the same elements as L"""
    if len(L) < 2:
        return L[:]
    else:
        middle = int(len(L)/2)
        left = sort(L[:middle], lt)
        right = sort(L[middle:], lt)
        print 'About to merge', left, 'and', right
        return merge(left, right, lt)

##L = [35, 4, 5, 29, 17, 58, 0]
##newL = sort(L)
##print 'Sorted list =', newL
##L = [1.0, 2.25, 24.5, 12.0, 2.0, 23.0, 19.125, 1.0]
##newL = sort(L, float.__lt__)
##print 'Sorted list =', newL

def lastNameFirstName(name1, name2):
    import string
    name1 = string.split(name1, ' ')
    name2 = string.split(name2, ' ')
    if name1[1] != name2[1]:
        return name1[1] < name2[1]
    else:
        return name1[0] < name2[0]

def firstNameLastName(name1, name2):
    import string
    name1 = string.split(name1, ' ')
    name2 = string.split(name2, ' ')
    if name1[0] != name2[0]:
        return name1[0] < name2[0]
    else:
        return name1[1] < name2[1]

##L = ['John Guttag', 'Tom Brady', 'Chancellor Grimson', 'Gisele Brady',
##     'Big Julie']
##newL = sort(L, lastNameFirstName)
##print 'Sorted list =', newL
##newL = sort(L, firstNameLastName)
##print 'Sorted list =', newL
上のコードには、興味深いコードセグメントがあります.
def sort(L, lt = lambda x,y: x < y):
のうち、lt=xxxxはltパラメータのデフォルト値がlambda x、y:xPythonは、単行の最小関数を迅速に定義できる興味深い構文をサポートしています.これらlambdaという関数は,Lispから借りたもので,任意の関数が必要な場所で使用できる.
例4.20.Lambda関数の紹介
>>> def f(x):
...     return x*2
...     
>>> f(3)
6
>>> g = lambda x: x*2  
>>> g(3)
6
>>> (lambda x: x*2)(3) 
6

これはlambda関数で、上の普通の関数と同じことを完成します.ここでの短い構文に注意してください.パラメータリストの周囲にカッコがなく、returnキーワードが無視されています(関数全体が1行しかないため、隠しています).また、この関数には関数名はありませんが、変数に値を付けて呼び出すことができます.
Lambda関数を使用する場合は、変数に値を割り当てる必要もありません.これは世界で最も役に立つものではないかもしれませんが、lambda関数がインライン関数であることを示しています.
総じて、lambda関数は、任意の複数のパラメータ(オプションパラメータを含む)を受信し、単一の式の値を返すことができる.Lambda関数にはコマンドは含まれません.式は1つを超えてはいけません.lambda関数に多くのものを詰め込もうとしないでください.もっと複雑なものが必要な場合は、普通の関数を定義して、どれだけ長くしたいかを定義する必要があります.