Python常用查找算法

1.無序表查找:數據不排序的線性查找,遍歷數據元素

def sequential_search(slist, key):
    for i in xrange(len(slist)):
        if slist[i] == key:
            return i
    return -1

sindex = sequential_search([1,3,4,7,5,8,2,9,6], 3)
print sindex

2.二分查找:查找表中不斷取中間元素與查找值進行比較,以二分之一的倍率進行表範圍的縮小

def middle_search(mlist,value):
    if value > mlist[-1] or value < mlist[0]:
        return -1
    else:
        start,end = 0,len(mlist)
        while start < end:
            middle = (start+end)/2
            if mlist[middle] == value:
                return middle
            elif mlist[middle] > value:
                end = middle
            else:
                start = middle
        return -1

mindex = middle_search([1,2,3,4,5,6,7,8,9], 1)
print mindex

3.二叉排序樹:二叉排序樹又稱爲二叉查找樹;若它的左子樹不爲空,則左子樹上所有節點的值均小於它的根結構的值;若它的右子樹不爲空,則右子樹上所有節點的值均大於它的根結構的值;它的左、右子樹也分別爲二叉排序樹

# -*- coding:utf-8 -*-

class BSTNode:
    """
    定義一個二叉樹節點類。
    以討論算法爲主,忽略了一些諸如對數據類型進行判斷的問題。
    """
    def __init__(self, data, left=None, right=None):
        """
        初始化
        :param data: 節點儲存的數據
        :param left: 節點左子樹
        :param right: 節點右子樹
        """
        self.data = data
        self.left = left
        self.right = right

class BinarySortTree:
    """
    基於BSTNode類的二叉排序樹。維護一個根節點的指針。
    """
    def __init__(self):
        self._root = None

    def is_empty(self):
        return self._root is None

    def search(self, key):
        """
        關鍵碼檢索
        :param key: 關鍵碼
        :return: 查詢節點或None
        """
        bt = self._root
        while bt:
            entry = bt.data
            if key < entry:
                bt = bt.left
            elif key > entry:
                bt = bt.right
            else:
                return entry
        return None

    def insert(self, key):
        """
        插入操作
        :param key:關鍵碼 
        :return: 布爾值
        """
        bt = self._root
        if not bt:
            self._root = BSTNode(key)
            return
        while True:
            entry = bt.data
            if key < entry:
                if bt.left is None:
                    bt.left = BSTNode(key)
                    return
                bt = bt.left
            elif key > entry:
                if bt.right is None:
                    bt.right = BSTNode(key)
                    return
                bt = bt.right
            else:
                bt.data = key
                return

    def delete(self, key):
        """
        二叉排序樹最複雜的方法
        :param key: 關鍵碼
        :return: 布爾值
        """
        p, q = None, self._root     # 維持p爲q的父節點,用於後面的鏈接操作
        if not q:
            print("空樹!")
            return
        while q and q.data != key:
            p = q
            if key < q.data:
                q = q.left
            else:
                q = q.right
            if not q:               # 當樹中沒有關鍵碼key時,結束退出。
                return
        # 上面已將找到了要刪除的節點,用q引用。而p則是q的父節點或者None(q爲根節點時)。
        if not q.left:
            if p is None:
                self._root = q.right
            elif q is p.left:
                p.left = q.right
            else:
                p.right = q.right
            return
        # 查找節點q的左子樹的最右節點,將q的右子樹鏈接爲該節點的右子樹
        # 該方法可能會增大樹的深度,效率並不算高。可以設計其它的方法。
        r = q.left
        while r.right:
            r = r.right
        r.right = q.right
        if p is None:
            self._root = q.left
        elif p.left is q:
            p.left = q.left
        else:
            p.right = q.left

    def __iter__(self):
        """
        實現二叉樹的中序遍歷算法,
        展示我們創建的二叉排序樹.
        直接使用python內置的列表作爲一個棧。
        :return: data
        """
        stack = []
        node = self._root
        while node or stack:
            while node:
                stack.append(node)
                node = node.left
            node = stack.pop()
            yield node.data
            node = node.right
lis = [62, 58, 88, 48, 73, 99, 35, 51, 93, 29, 37, 49, 56, 36, 50]
bs_tree = BinarySortTree()
for i in range(len(lis)):
    bs_tree.insert(lis[i])

for i in bs_tree:
    print i

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章