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

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 先进行二分图黑白染色,S到黑,白到T,黑到白,问题转化成了求最大权独立集,最大点权独立集=sum-最小点权 ...

  2. 前端开发 —— google chart 的使用

    1. 引入所需的 js 库 在 <head></head>中 <script src="https://ajax.googleapis.com/ajax/lib ...

  3. PR5

    修改字幕的两种方式

  4. SQL Server常用SQL集合

    ================================================ 1.SQL查询一年之内的数据记录 select * from 表名 where CreateDate& ...

  5. JPEG文件格式

    格式:JFIF(JPEG档的交换格式)压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1)以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身,用来定义图像的压 ...

  6. hdu1114 dp(完全背包)

    题意:已知空钱罐质量和满钱罐质量(也就是知道钱罐里的钱的质量),知道若干种钱币每种的质量以及其价值,钱币都是无限个,问最少钱罐中有多少钱. 这个题在集训的时候学长给我们做过,所以你会做是应该的,由于已 ...

  7. leetcode:Same Tree【Python版】

    1.p或q为None的情况用开始的两个if语句进行判断: 2.类中递归调用函数需要使用self进行调用: 3.代码很简洁,最后几行通过同时为None和同时非None的条件进行判断: # Definit ...

  8. 使用点聚 weboffice 以及vsto、 web service 实现word 的自动化文档处理

    开发环境的搭建: 1.visual studio 2010 2. 点聚web office 开发步骤 1. 创建word vsto 项目 比较简单 1. 添加任务窗格 页面如下: 代码如下: 1. 使 ...

  9. Linux部署禅道Steps&Q&A

    1.查看Linux的位数: getconf LONG_BIT 结果:32/64 2. 禅道开源版安装包下载 Linux 64位 下载站点1: http://sourceforge.net/projec ...

  10. nnlog模块使用

    安利一个好用的写日志模块,python自带的logging模块理解起来比较费劲,直接pip install nnlog即可 使用例子如下代码:   1 2 3 4 5 6 7 8 9 10 11 12 ...