跳表(skiplist)Python實現


# coding=utf-8
# 跳表的Python實現

import random

# 最高層數設置為4
MAX_LEVEL = 4


def randomLevel():
    """
    返回隨機層數 如果大於最大層數則返回最大層數
    :return: random level
    """
    k = 1
    while random.randint(1, 100) % 2:
        k += 1
    k = k if k < MAX_LEVEL else MAX_LEVEL
    return k


def traversal(skiplist):
    """
    跳表的遍歷功能
    對每一層的元素都進行遍歷
    :param skiplist: 待遍歷的跳表
    :return: None
    """
    level = skiplist.level
    i = level - 1
    while i >= 0:
        level_str = 'header'
        header = skiplist.header
        while header:
            level_str += ' -> %s' % header.key
            header = header.forward[i]
        print level_str
        i -= 1


class Node(object):
    def __init__(self, level, key, value):
        """
        跳表節點初始化
        :param level: 這個節點在小於等於level的層數都出現了
        :param key: 查詢關鍵字
        :param value: 存儲的信息
        """
        self.key = key
        self.value = value
        self.forward = [None] * level


class Skiplist(object):
    def __init__(self):
        """
        跳表初始化 層數為0 初始化頭部節點()
        """
        self.level = 0
        self.header = Node(MAX_LEVEL, 0, 0)

    def insert(self, key, value):
        """
        跳表插入操作
        :param key: 節點索引值
        :param value: 節點內容
        :return: Boolean 用於判斷插入成功或失敗
        """
        # 更新的最大層數為 MAX_LEVEL 層
        update = [None] * MAX_LEVEL
        p = self.header
        q = None
        k = self.level
        i = k - 1
        # i from k-1 to 0
        while i >= 0:
            q = p.forward[i]
            while q and q.key < key:
                p = q
                q = p.forward[i]
            update[i] = p
            i -= 1
        if q and q.key == key:
            return False

        k = randomLevel()
        if k > self.level:
            i = self.level
            while i < k:
                update[i] = self.header
                i += 1
            self.level = k

        q = Node(k, key, value)
        i = 0
        while i < k:
            q.forward[i] = update[i].forward[i]
            update[i].forward[i] = q
            i += 1

        return True

    def delete(self, key):
        """
        跳表刪除操作
        :param key: 查找的關鍵字
        :return: Boolean 用於判斷刪除成功或失敗
        """
        update = [None] * MAX_LEVEL
        p = self.header
        q = None
        k = self.level
        i = k - 1
        # 跟插入一樣 找到要刪除的位置
        while i >= 0:
            q = p.forward[i]
            while q and q.key < key:
                p = q
                q = p.forward[i]
            update[i] = p
            i -= 1
        if q and q.key == key:
            i = 0
            while i < self.level:
                if update[i].forward[i] == q:
                    update[i].forward[i] = q.forward[i]
                i += 1
            del q
            i = self.level - 1
            while i >= 0:
                if not self.header.forward[i]:
                    self.level -= 1
                i -= 1
            return True
        else:
            return False

    def search(self, key):
        """
        跳表搜索操作
        :param key: 查找的關鍵字
        :return: 節點的 key & value & 節點所在的層數(最高的層數)
        """
        i = self.level - 1
        while i >= 0:
            q = self.header.forward[i]
            while q and q.key <= key:
                if q.key == key:
                    return q.key, q.value, i
                q = q.forward[i]
            i -= 1
        return None


def main():
    number_list = (7, 4, 1, 8, 5, 2, 9, 6, 3)
    skiplist = Skiplist()
    for number in number_list:
        skiplist.insert(number, None)

    traversal(skiplist)
    print skiplist.search(4)
    skiplist.delete(4)
    traversal(skiplist)

if __name__ == '__main__':
    main()

End.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM