# 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.

跳表(skiplist)Python实现的更多相关文章

  1. 跳表SkipList

    原文:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html 跳表SkipList   1.聊一聊跳表作者的其人其事 2. 言归正 ...

  2. 跳表 SkipList

    跳表是平衡树的一种替代的数据结构,和红黑树不同,跳表对树的平衡的实现是基于一种随机化的算法,这样就使得跳表的插入和删除的工作比较简单.     跳表是一种复杂的链表,在简单链表的节点信息之上又增加了额 ...

  3. 存储系统的基本数据结构之一: 跳表 (SkipList)

    在接下来的系列文章中,我们将介绍一系列应用于存储以及IO子系统的数据结构.这些数据结构相互关联又有着巨大的区别,希望我们能够不辱使命的将他们分门别类的介绍清楚.本文为第一节,介绍一个简单而又有用的数据 ...

  4. 3.3.7 跳表 SkipList

    一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSki ...

  5. 跳表(SkipList)设计与实现(Java)

    微信搜一搜「bigsai」关注这个有趣的程序员 文章已收录在 我的Github bigsai-algorithm 欢迎star 前言 跳表是面试常问的一种数据结构,它在很多中间件和语言中得到应用,我们 ...

  6. [转载] 跳表SkipList

    原文: http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html leveldb中memtable的思想本质上是一个skiplist ...

  7. C语言跳表(skiplist)实现

    一.简介 跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入.删除.查找的复杂度均为O(logN).LevelDB的核心数据结构是用跳表实现的,redis的sorted set数据结构也 ...

  8. 跳表(SkipList)原理篇

    1.什么是跳表? 维基百科:跳表是一种数据结构.它使得包含n个元素的有序序列的查找和插入操作的平均时间复杂度都是 O(logn),优于数组的 O(n)复杂度.快速的查询效果是通过维护一个多层次的链表实 ...

  9. redis笔记_源码_跳表skiplist

    参照:https://juejin.im/post/57fa935b0e3dd90057c50fbc#comment http://redisbook.com/preview/skiplist/dat ...

随机推荐

  1. Navicat #1045 - Access denied for user 'root'@'localhost' (using password: NO)

    Navicat #1045 - Access denied for user 'root'@'localhost' (using password: YES) 出现上述问题,原因在于本机还开了APMS ...

  2. dockerk个人学习(0)

    接下来几篇记录学习docker和ks的部署搭建环境和应用部署等

  3. sleep和 wait

  4. Django中提供了6种缓存方式

    开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块) Memcache缓存(pylibmc模块) 1. 开发调试 1 2 3 4 5 6 7 8 9 10 11 ...

  5. C经典案例

    1. C中可变参数函数作为函数参数: void media_debug_set_handler(struct media_device *media, void (*debug_handler)(vo ...

  6. NTLM 了解

    NTLM是NT LAN Manager的缩写,这也说明了协议的来源.NTLM 是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容.Windo ...

  7. Codelf 变量取名

    Codelf 变量取名 可以看到别的变量是怎么命名的,站在巨人的肩膀上.

  8. FP-growth算法发现频繁项集(二)——发现频繁项集

    上篇介绍了如何构建FP树,FP树的每条路径都满足最小支持度,我们需要做的是在一条路径上寻找到更多的关联关系. 抽取条件模式基 首先从FP树头指针表中的单个频繁元素项开始.对于每一个元素项,获得其对应的 ...

  9. selenium启动谷歌所遇到的问题

    最近在学习selenium webdriver,发现启动火狐时,运行非常慢,几天前一直在尝试启动谷歌驱动启动,但启动中总遇到问题,启动不起来,一直百度查找方法,还是没搞定,个人比较执着,爱钻牛角尖,弄 ...

  10. java编译需要文件后缀名.java 而运行不需要后缀名.class

    对于java源文件HelloWorld.java编译命令:javac HelloWorld.java运行命令:java HelloWorld 编译需要文件后缀名.java 而运行不需要后缀名.clas ...