python數據結構-順序查找

搜索

    在項集合中查找特定的算法過程,搜索通常對於項是否存在返回True或False,有時它可能返回項被找到的地方,該成員存在 返回True 否則False。在python中使用in運算符可以非常簡單的判斷

順序查找

   當數據項存儲在諸如列表的集合中時,我們說它們具有線性或順序關係。 每個數據項都存儲在相對於其他數據項的位置。 在 Python 列表中,這些相對位置是單個項的索引值。由於這些索引值是有序的,我們可以按順序訪問它們。 這個過程產生我們的第一種搜索技術 順序查找  下圖展示了這種搜索的工作原理。 從列表中的第一個項目開始,我們按照基本的順序排序,簡單地從一個項移動到另一個項,直到找到我們正在尋找的項或遍歷完整個列表。如果我們遍歷完整個列表,則說明正在搜索的項不存在


建立sequentialSearch.py

 順序查找
def sequentialSearch(alist, item):
    pos = 0
    found = False
    while pos < len(alist) and not found:
        if alist[pos] == item:
            found = True
        else:
            pos = pos + 1
    return found


testlist = [1, 2, 32, 8, 17, 19, 42, 13, 0]
print(sequentialSearch(testlist, 3))
print(sequentialSearch(testlist, 13))

        如果項不在列表中,知道它的唯一方法是將其與存在的每個項進行比較。如果有n 個項,則順序查找需要 n 個比較來發現項不存在。在項在列表中的情況下,分析不是那麼簡單。實際上有三種不同的情況可能發生。在最好的情況下,我們在列表的開頭找到所需的項,只需要一個比較。在最壞的情況下,我們直到最後的比較才找到項,第 n 個比較。平均情況怎麼樣?平均來說,我們會在列表的一半找到該項; 也就是說,我們將比較 n/2 項。然而,回想一下,當 n 變大時,係數,無論它們是什麼,在我們的近似中變得不重要,因此順序查找的複雜度是 O(n)。



我們之前假設,我們列表中的項是隨機放置的,因此在項之間沒有相對順序。如果項以某種方式排序,順序查找會發生什麼?我們能夠在搜索技術中取得更好的效率嗎?假設項的列表按升序排列。如果我們正在尋找的項存在於列表中,它在 n 個位置中的概率依舊相同。我們仍然會有相同數量的比較來找到該項。然而,如果該項不存在,則有一些優點。下圖展示了這個過程,尋找項 50。注意,項仍然按順序進行比較直到 54。此時,我們知道一些額外的東西。不僅 54 不是我們正在尋找的項,也沒有超過 54 的其他元素可以匹配到該項,因爲列表是有序的。在這種情況下,算法不必繼續查看所有項。它可以立即停止。


# 順序查找(有序)
def sequentialSearch(alist, item):
    pos = 0
    found = False
    stop = False
    while pos < len(alist) and not found and not stop:
        if alist[pos] == item:
            found = True
        else:
            # 後面的元素都不需要再次比較,跳出循環
            if alist[pos]>item:
                stop=True
            else:
                pos = pos + 1
    return found


testlist = [0,1,2,8,13,17,19,32,42]
print(sequentialSearch(testlist, 3))
print(sequentialSearch(testlist, 13))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章