赞
踩
链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向一下个节点的指针next。
通过节点之间相互连接,最终串联成一个链表。
链式存储结构就是 两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针。
优点:
缺点:
链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值。
)
双向链表的指针域有两个指针,每个数据结点分别指向直接后继和直接前驱。
循环链表就是让链表的最后一个节点指向第一个节点,这样就形成了一个圆环,可以循环遍历。(单向循环链表,双向循环链表)
能够具备 数组的快速查询 的优点又能融合 链表方便快捷的增加删除元素 的优势。
所谓的hash,简单的说就是散列,即将输入的数据通过hash函数得到一个key值,输入的数据存储到数组中下标为key值的数组单元中去,这个映射函数叫做散列函数,存放记录的数组叫做散列表。
· insert(key, value):插入键值对(key,value)
· get(key): 如果存在键为key的键值对则返回其value, 否则返回空值
· delete(key): 删除键为key的键值对
优点: 插入/查询/删除效率非常高
缺点:
不相同的数据通过hash函数得到相同的key值。这时就产生了hash冲突。解决hash冲突的方式有两种:
开放寻址法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
就是说当发生冲突时,就去寻找下一个空的地址把数据存入其中,只要哈希表足够大,就总能找到这样一个空的地址。
线性探查:如果位置i被占用,则探查i+1, i+2,……
二次探查:如果位置i被占用,则探查i+12,i-12,i+22,i-22,……
二度哈希:有n个哈希函数,当使用第1个哈希函数h1发生冲突时,则尝试使用h2,h3,……
拉链法:哈希表每个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后。
在发生冲突的时候再用另外一个哈希函数算出哈希值,直到算出的哈希值不同为止。
在创建哈希表的同时,再额外创建一个公共溢出区,专门用来存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共溢出区查。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。