您好、欢迎来到现金彩票网!
当前位置:2019全年免费资料大全 > 桶链算法 >

第十章 映射、哈希表和跳跃表的基本知识及python实现(from Goodr

发布时间:2019-07-14 18:27 来源:未知 编辑:admin

  dict类可以说是python语言中最重要的数据结构。它表示一种称作字典的抽象,在其中每个唯一的关键字都被映射到对应的值上。由于字典所表示的键和值之间的关系,我们通常称其为关联数组(associative array)或者映射(map)。在此,我们使用术语字典(dictionary)来讨论python的dict类,并且使用术语映射(map)来讨论抽象数据类型的更一般的概念。

  1.大学信息系统依赖于某种形式的映射,这种映射以学生ID作为键,并且将其映射到学生相关的记录

  2.域名系统(DNS)将主机名映射到一个网络协议(IP)地址,这样的键可以高效地映射到特定用户的相关信息上。

  3.计算机图像系统上可以将一个颜色名称映射到用于描述颜色RGB(红-绿-蓝)的三元组上。

  如果存在,返回映射M中与键k相对应的值,否则返回KeyError错误。在Python中是由__getitem__实现的

  将映射M中的键k与值v建立关联,如果映射中的键k已经有了对应的值存在,则进行替换该值,由__setitem__实现

  从映射M中删除键为k的元组,如果M中不存在这样的元组,则返回KeyError错误,有__delitem__实现

  默认的对一个映射迭代生成其中包含所有键的序列,由__iter__实现,并且支持以for k in M形式控制的循环

  如果映射中包含键为k的元组则返回True,有__contains__实现

  如果映射中存在键k则返回M[k],否则返回缺省值d。这种方法提供了一种避免返回KeyError风险的M[k]查询方法。

  如果映射中存在键k则返回M[k],而如果键k不存在,则设置M[k]=d,并返回这个值。

  从映射M中删除键为k的元组,并返回与其对应的值v。如果不存在则返回缺省值None

  从映射M中随机删除一个key-value键值对,并返回一个用于表示被删除的键值对的(k,v)数据元组。如果为空,则KeyyError.

  如果映射M和映射M2中所包含的key-value键值对完全相同,则返回True

  如果映射M和M2包含有不同的key-value键值对,则返回True.

  在抽象基类中,被定义为抽象的方法必须由具体的子类实现。然而,一个抽象的基类可以提供其他方法的具体实现,这取决于所使用的假定的抽象方法。collections模块提供了两个与我们现在所讨论的内容相关的抽象基类:Mapping和MutableMapping.Mapping类包含由python的dict类所支持的所有不变的方法,而MutableMapping类扩展包含所有 可变的方法。这些抽象基类的意义在于他们提供了一个框架以帮助创建用户自定义的Map类。但不提供__getitem__、__setitem__、__delitem__、__len__、__iter__这五个行为,这些行为是在具体的子类中根据情况而设定的。

  通过一个简单的Map ADT的具体实现来说明MapBase类的使用。下面是一个unsortedTableMap类,它依赖于在python列表中以任意顺序存储键值对。

  在这个map构造器中,将一个空的表格初始化为self._table.当一个新的键被放入map中,通过__setitem__函数,我们创建了一个嵌套类_Item的实例,该嵌套类继承自MapBase类。但给非有序映射的效率不高,因为他们都依赖一个for循环扫描列表中的元组,以搜素匹配的键。

  哈希表应该是一个最实用的实现map/dict类的数据结构。哈希表的一个新概念是使用哈希函数将每个一般的键映射到一个表中的相应索引上。在理想情况下,键将由哈希函数分布到从0到N-1的范围内,但是在实践中可能有两个或者更多的不同的键被映射到同一个索引上(冲突)。

  哈希函数h的目标就是把每个键k映射到[0,N-1]区间内的整数,其中N是哈希表的桶数组的容量。使用这种哈希函数h的主要思想是使用哈希函数值h(k)作为哈希函数桶数组A内部的索引,而不用键k做索引,也就是说在桶A[h(k)]中存储元组(k,v).

  如果有两个或者更多的键具有相同的哈希值,那么两个不同的元组将被映射到相同的桶A中。这种情况被称为‘冲突’.

  评价哈希函数h(k)常见的方法由两部分组成:一个哈希码,将一个键映射到一个整数;另一个是压缩函数,将哈希码映射到一个桶数组的索引,这个索引是范围在区间[0,N-1]的一个整数。

  哈希码计算部分独立于具体的哈希表的大小。这样就可以为每个对象开发一个通用的哈希码,并且可以用于任何大小的哈希表,只有压缩函数与表的大小有关。这样就特别方便,因为哈希表底层的桶数组可以根据当前存储在映射中的元组数动态调整大小。

  哈希函数执行的第一步是取出映射中的任意一个键k,并且计算得到一个整数作为键k的哈希码;这个整数不需要在[0,N-1]f范围内,甚至可以是负数。我们希望分配给键的哈希码集合尽可能避免冲突。因为如果哈希码都产生了冲突,经过压缩函数之后必然是冲突的。python哈希码可以通过以下方式实现:

  32位键的处理,64位键的处理:高阶32位和低阶32位采用一定的方式进行合并,生成一个32位的哈希码。

  一个多项式哈希码的变种,是用一定数量的位循环位移得到部分和来替代乘以a.

  在pythonh中计算哈希码的标准机制是一个内置签名hash(x)函数,该函数将返回一个整数型值作为对象x的哈希码。然而在python中,只有不变的数据类型是可哈希的。在默认情况下,用户定义的实例被视为不可哈希的,并且哈希函数会产生TypeError。

  通常,键k的哈希码不适合立即用于桶数组,因为整数哈希码可能是负或可能超过桶数组的容量。一个很好的压缩函数或使给定一组哈希码的冲突数达到最小。

  有一个更为复杂的压缩函数可以帮助一组整数键消除重复模式,即Multiply-Add-and-Divid(MAD)方法,是通过:

  [(ai+b) mod p] mod N.对i进行映射,这里N是桶数组的大小,p是比N大的素数,a和b是从区间[0,p-1]任意选择的整数,并且a0.选择这个压缩函数是为了消除在哈希码集合中的重复模式,并且得到更好的哈希函数,因为该函数使得任意两个键冲突的概率是1/N.

  虽然上面的方法能够在一定程度上减少冲突,但是冲突仍然是有可能发生,不可避免的。下面将介绍几种处理冲突的方法:

  处理冲突的一个简单且有效的方式是使每个桶A[j]存储其自身的二级容器,容器存储元组(k,v),如果h(k)=j。用一个很小的list容器来实现map实例是实现二级容器很自然的选择。

  分离链表遇到复杂的桶内数组时,时间效率和空间大小较为复杂。开放寻址需要负载因子总是最大不超过1,并且元组直接存储在桶数组自身的单元中。

  使用开放寻址处理冲突的一个简单的方法是线性探测。使用这种方法时,如果我们想要将一个元祖(k,v)插入桶A[j]处,在这里j=h(k),但A[j]已经被占用,那么我们将尝试插入A[(j+1) mod N];如果A[(j+1) mod N]也已经被占用了,则我们将尝试A[(j+2) mod N],如此重复操作,直到找到一个可以接受新元组的空桶。

  一种不会引起如线性探测和二次探测所产生的聚集问题的开放寻址策略称为双哈希策略。

  在该部分,我们介绍两种哈希表的实现,一种是分离链表,另一种是使用包含线性探测的开放寻址。HashMapBase类主要的设计元素是:

  2) 维护一个self._n实例变量用来表示当前存储在哈希表中不同数组的个数

  3)如果表格的负载因子增加到超过0.5,我们会将哈希表的大小扩大2倍并且将所有元素重新哈希到新表中

  4)我们定义一个_hash_函数的方法,该方法依靠python内置哈希函数来生成键的哈希码,并用MAD公式生成压缩函数

  在这一部分介绍一个称为有序映射的映射ADT的扩展,它包括标准映射的所有行为:

  我们将映射的元组存储在一个基于数组的序列A中,以键的升序排列,假定键是天然定义的顺序,我们称这个映射实现为排序检索表

  最近看Redis的实现原理,其中讲到Redis中的有序数据结构是通过跳跃表来进行实现的。第一次听说跳跃表的概念,感到比较新奇,所以查了不少资料。其中,网上有部分文章是按照如下方式描述跳跃表的:这种描述...博文来自:python学习者的博客

  前提 有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困惑,它允许快速查询一个有序连续元素的数据链表,它...博文来自:通往架构师的成长学习之路

  同数组相比,链表的插入删除效率是O(1),但是如果想要在链表中查找某个元素,就糟糕了,复杂度会是O(N),为了提高查找效率,就有了跳表的概念。所谓跳表,就是可以跳跃的链表,回想二分查找算法,每次的查找...博文来自:

  实现:原理什么的别人的博客有很多,我这就给个链接。数据结构—–跳表跳表skiplist使用一个类表示跳表的节点#跳跃表节点的类classSNode:def__init__(self,key=None,...博文来自:t_wu的博客

  笔者博客地址:为了大家看整体源码方便,我将加上了完整注释的代码传到了我的github上供大家直接下载:博文来自:zstu_cc的专栏

  哈希表又称散列表,通过把关键字key映射到数组中的一个位置来访问记录。映射过程通过函数实现,而这个函数就叫哈希函数,存放关键字的数组称为散列表。哈希表结构前面说了,关键字是存放在数组中的,所以哈希表的...博文来自:幼儿猿

  (2013)--Data Structures and Algorithms in Python

  基于作者的市场领先数据结构书籍在Java和c++,这本书提供了一个全面的,权威的作者对数据结构的权威的介绍。Python中的数据结构和算法是用于Python数据结构的第一个权威性的面向对象的书籍。本文旨在对数据结构和算法进行全面的介绍,包...

  不使用任何内建的哈希表库设计一个哈希映射具体地说,你的设计应该包含以下的功能put(key,value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。get(key):返回...博文来自:极客

  介绍哈希查找是通过计算数据元素的存储地址进行查找的一种方法。比如”5“是一个要保存的数,然后我丢给哈希函数,哈希函数给我返回一个”2”,那么此时的”5“和“2”就建立一种对应关系,这种关系就是所谓的“...博文来自:根号下的麻辣烫

  参考算法导论引文散列表(hashtable)是实现字典操作的一种有效的数据结构。尽管最坏的情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n)。然而实际应用中,散列的查找的性能是极...博文来自:stevewong的专栏

  散列表散列表(Hashtable,也叫哈希表),通过哈希函数(HashFunction)来计算对应键值,再根据键值将所需查询的数据影射到表中的一个位置而实现数据访问的一种数据结构。类比下Python字...博文来自:JasonYUJX的博客

  通过前面的总结,我们知道红黑树是一种存在于内存中,可以保证在最坏的情况下,对红黑树进行例如search,insert,以及delete等基本的动态集合操作的时间复杂度为O(lgn)。但是显而易见,红黑...博文来自:Ryanqy的专栏

  跳跃表:是一种支持平均O(log(n)),最坏O(N)复杂度的节点查找,可以通过顺序性操作来处理节点的有序数据结构。举例来理解一下跳跃表的情况:跳跃表的效率可以和平衡二叉树相比较,但是实现起来却比平衡...博文来自:always_younger的博客

  不使用任何内建的哈希表库设计一个哈希映射具体地说,你的设计应该包含以下的功能put(key,value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。 get(key):返...博文来自:程序员养成日记

  之前在阅读redis源码的时候了解到跳跃表这个数据结构,当时花了点时间了解了下,并做了记录;如今差不多一年过去了,被人问起,竟然一点印象都没有了。然后回头去看自己的注解,重新梳理下。1跳跃表的原理对于...博文来自:idwtwt的专栏

  WiKiSkiplist是一个用于有序元素序列快速搜索的数据结构,由美国计算机科学家WilliamPugh发明于1989年。它的效率和红黑树以及AVL树不相上下,但实现起来比较容易。作者William...博文来自:BrilliantEagle的专栏

  摘要:跳跃表主要是用来减少查找的代价,作为单向链表,如果搜寻一个数据需要O(N)的时间代价,但是如果采用随机化跳跃表则可以大大减少搜寻代价.(1)注意几个特点:[1]跳跃表m阶指针所连接的元素至少具有...博文来自:pyb的博客

  HashTable简介:散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。...博文来自:蚩尤

  跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随...博文来自:Sun_Ru的博客

  打算把【数据结构】整理成一系列博客,今天写的是【跳跃表】(skiplist)  定义:跳跃链表是一种数据结构,允许快速查询一个有序连续元素的数据链表。快速查询是通过维护一个多层次的链表,且每一层链表中...博文来自:Charles的博客

  在Redis5大数据结构中,跳跃表(skiplist)是比较难理解的,同时却也是使;用比较少的数据结构,只在实现有序集合zset和集群节点内部数据结构中用到了。数据结构代码typedefstructz...博文来自:震华的博客

  跳跃表:我的理解是:多层次的链表查找结构,每层又类似二分法查找过程。应用场景:节点增加和更新比较少,查询频次较多的情况。使用跳跃表的产品:1、Lucene,elasticSearch2、Redis:R...博文来自:xiemingmei的专栏

  转载了参考文章的部分内容,代码自己敲了一遍,记录下来用来自己复习用。参考文章地址:本文内容框架:§1SkipList介绍§2Ski...博文来自:lyztyycode的博客

  在查找过程中不经过关键字的比较.在待查的关键字值和它的存储位置之间建立一个确定的对应关系,则查找时不必再进行关键字值间的比较.根据设定的哈希函数以及处理冲突的方法将查找表中各个数据元素存储在一段有限的...博文来自:Claroja

  1、定义:散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫...博文来自:CF不紫不改名

  跳跃表是一种有序的数据结构,它的平均时间复杂度是O(logN),它通过在一个节点中维护多个指向其他节点的指针,达到快速查找和访问其他节点的目的。在redis中跳跃表只用在实现sortedset和集群节...博文来自:bettyF的博客

  1、基本原理不想好好写字走的freestyle......其实可以直接看代码,我的注释还是很详细的,后面也有说明性的插图。后面关于时间复杂度的分析证明没有贴(总之我们都知道它性能棒棒哒就行了)。2、C...博文来自:lishichengyan的博客

  基础知识:k1和k2映射到同一值域,也叫压缩映射,比如通排序就是一种特殊的哈希表散列函数:直接定址法数字分析法平方折中法折叠法随机数法除留余数法×最好理解冲突解决开放定址法拉链法就是后面写一个...博文来自:h_666666的博客

  问题引入:我们在网站上注册账号时,当填好用户名后,系统都会判断用户名是否已被使用,如果已被使用,系统就会提示该用户名已被注册。充满好奇心的小明想知道系统是如何检测用户名是否被使用的。他能想到的最简单的...博文来自:多反思,多回顾,要坚持。

  这里不介绍跳跃表是什么东西了,如果没有推导过跳跃表或者索性不知道跳跃表是什么东西请看麻省理工大学公开课算法导论跳跃表。代码中有一个容易误解的地方解释一下,randomLevel模拟抛硬币的过程比较不太...博文来自:oujiangping的博客

  动态搜索结构跳跃表(skiplist)树堆(treap)红黑树(redblacktree)B树(Btree)跳跃表一种简单、高效的动态搜索结构,使用了随机化算法。插入删除操作的期望的运行时间为O(lg...博文来自:rye_whiskey的博客

  python中哈希表就是字典啊,还怎么实现呢?存储10位同学,每位同学有姓名、籍贯和成绩直接实现哇,好像也没啥可以写的stu={z1:(sx,96),z2:(sd,97),z3:(...博文来自:woshilsh的博客

  【博文总目录】【代码下载】为什么要有跳跃表我们在实际开发中经常会有在一堆数据中查找一个指定数据的需求,而常用的支持高效查找算法的实现方式有以下几种:有序数组。这种方式的存储结构,优点是支...博文来自:

  /*不使用任何内建的哈希表库设计一个哈希映射具体地说,你的设计应该包含以下的功能put(key,value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。get(key):...博文来自:stylewait的博客

  一、什么是跳跃表?定义:跳跃表是一种有序数据结构,它通过在每个节点中维护多个指向其他节点的指针,从而达到快速访问节点的目的。注意几个关键词:有序:结构是有序的每个节点维护多个指针,本身结构是链表形式,...博文来自:yinn

  我们知道HashMap是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序。由于它内部根据键的hash值取模表容量来得到元素的存储位置,所以整体上说HashMap是无序的一种容器。当然,j...博文来自:Walker_YAM

  Redis底层数据结构之跳跃表1.引言跳跃表由WilliamPugh在1990年发明,是一种有序的数据结构,类似于平衡树、红黑树这样的数据结构,能够维护一个有序的列表,方便查找。跳跃表支持平均为O(l...博文来自:daide2012的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行nsql仅可执行DDL、select、DML等...博文来自:Ape55的博客

  说明n网上关于caffe的安装教程非常多,但是关于每一步是否操作成功,出现了什么样的错误又该如何处理没有给出说明。因为大家的操作系统的环境千差万别,按照博客中的教程一步步的安装,最后可能失败——这是很...博文来自:张学志の博客

  之前在工作中利用postman做了接口测试,发现这个东东其实还挺好用的,我个人喜欢总结于是乎有了下面的东西。方便以后查阅或修改。n1.首先postman的安装参及简单介绍考以下的链接:n       ...博文来自:JOJOY的博客

  话说上次配置PCL开发环境失败;rn估计可能是环境变量没配置好;下面从新搞一...博文来自:bcbobo21cn的专栏

  扫二维码关注,获取更多技术分享nnn 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗!nnDocker的三大核心概念:镜像、容器、仓库n镜像:类似虚拟机的镜像、用俗话说就是安装文件。n容器:类似一个轻量...博文来自:我走小路的博客

  webService学习(二)—— 调用自定义对象参数rn本文主要内容:rn1、如何通过idea进行webService Client的简单实现(不再使用wsimport的方式,其实是ide帮我们做了...博文来自:止水的专栏

  自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。nnn1. 测试集和训练集3、7分组naustralian ...博文来自:Tiaaaaa的博客

  授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周上午根据用户上周的博文发布情况由系统自动颁发。

  第九章 优先级队的基本知识及Python实现(from Goodrich)

  第八章 树的基本概念、二叉树、树的实现、树的遍历算法的基本知识及python实现(from Goodrich)

  a1010026261:麻烦转载我的总结文章的话,请注明下原地址:基于时间序列的异常检测/

http://linkzoo.net/tongliansuanfa/379.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有