跳表(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.
跳表(skiplist)Python实现的更多相关文章
- 跳表SkipList
原文:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html 跳表SkipList 1.聊一聊跳表作者的其人其事 2. 言归正 ...
- 跳表 SkipList
跳表是平衡树的一种替代的数据结构,和红黑树不同,跳表对树的平衡的实现是基于一种随机化的算法,这样就使得跳表的插入和删除的工作比较简单. 跳表是一种复杂的链表,在简单链表的节点信息之上又增加了额 ...
- 存储系统的基本数据结构之一: 跳表 (SkipList)
在接下来的系列文章中,我们将介绍一系列应用于存储以及IO子系统的数据结构.这些数据结构相互关联又有着巨大的区别,希望我们能够不辱使命的将他们分门别类的介绍清楚.本文为第一节,介绍一个简单而又有用的数据 ...
- 3.3.7 跳表 SkipList
一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSki ...
- 跳表(SkipList)设计与实现(Java)
微信搜一搜「bigsai」关注这个有趣的程序员 文章已收录在 我的Github bigsai-algorithm 欢迎star 前言 跳表是面试常问的一种数据结构,它在很多中间件和语言中得到应用,我们 ...
- [转载] 跳表SkipList
原文: http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html leveldb中memtable的思想本质上是一个skiplist ...
- C语言跳表(skiplist)实现
一.简介 跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入.删除.查找的复杂度均为O(logN).LevelDB的核心数据结构是用跳表实现的,redis的sorted set数据结构也 ...
- 跳表(SkipList)原理篇
1.什么是跳表? 维基百科:跳表是一种数据结构.它使得包含n个元素的有序序列的查找和插入操作的平均时间复杂度都是 O(logn),优于数组的 O(n)复杂度.快速的查询效果是通过维护一个多层次的链表实 ...
- redis笔记_源码_跳表skiplist
参照:https://juejin.im/post/57fa935b0e3dd90057c50fbc#comment http://redisbook.com/preview/skiplist/dat ...
随机推荐
- Buildroot Qt 5
/********************************************************************************* * Buildroot Qt 5 ...
- opencv-python教程学习系列5-处理鼠标事件
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv-python处理鼠标事件,坚持学习,共同进步. 系列教程参照OpenCV-Pytho ...
- OLED的相关信息
有2种方式与OLED模块相连接,一种是8080的并口方式,另一种是4线SPI方式. ALIENTEK OLED 模块的 8080 接口方式需要如下一些信号线:CS: OLED 片选信号.WR:向 OL ...
- [转载]redis持久化的两种操作RDB和AOF
Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...
- BC32(hdu5182~5185)
恩……又是一个悲伤的故事,然后BC做出来一题,因为自己傻逼,可能紧张,也可能是其他,反正没看全题目就敲,敲完WA,WA完改,改完WA,没了……大概五十几分钟WA了五法,然后问了才知道没看全,就这样,后 ...
- this的区别
数据中心:this与_this的区别 getSelectData:function(){ var _this=this; _this.queryAjax(URL.selectData,'','post ...
- WPF优化体验<一>(转)
最近将一个开发和维护了五年的一个Winform项目进行重构,考虑到最近很流行将用户体验挂在嘴上,于是采用了WPF技术,希望能在外观和体验上有一个全新的效果. 以前使用Winform的时候内存控制得不错 ...
- ballerina 学习二十八 快速grpc 服务开发
ballerina 的grpc 开发模型,对于开发者来说简单了好多,不是schema first 的方式,而是我们 只要编写简单的ballerina service 就可以了,proto 文件是自动帮 ...
- watchtower 自动更新容器的工具
watchtower 自动更新容器的工具 安装 使用docker docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/ru ...
- C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别
额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别... 在C#中 ...