数据结构中四种数据存储结构---顺序存储 链接存储 索引存储 散列存储(hash存储)

-顺序结构-和-链接结构-适用在内存结构中-

-索引结构-和-散列结构-适用在外存与内存交互结构-

顺序存储

在计算机中用一组地址连续的-存储单元-依次存储线性表的各个数据元素,称作线性表的-顺序存储结构-。特点:
随机存取表中元素。
插入和删除操作-需要移动元素。

链接存储

在计算机中用一组任意的--存储单元--存储--线性表--的数据元素(这组存储单元可以是连续的,也可以是不连续的)。它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有-顺序存储结构-所具有的弱点,但也同时失去了-顺序表-可随机存取的优点。特点:
比-顺序存储结构-的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话-顺序比链式存储更多-)。
逻辑上-相邻的节点物理上不必相邻。
插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
查找结点时-链式存储要比顺序存储慢。
每个结点是由数据域和指针域组成。

索引存储

除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。特点:
索引存储结构-是用结点的索引号来确定--结点存储地址,其优点是检索速度快,缺点是增加了附加的-索引表-,会占用较多的存储空间。在-数据表-中,就是用索引键来进行存储与检索的。

散列存储

散列存储:又称--hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。
散列法存储的基本思想是:由节点的关键码值决定节点的存储地址。散列技术-除了可以用于查找外,还可以用于存储。特点:
散列是--数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问,理想的散列访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现,因此时间复杂度可以认为为O(1),而数组遍历的时间复杂度为O(n)。
散列(hashing)----是一种-重要的存储方法-,也是一种常见的查找方法。
基本思想:以结点的关键字k为自变量,通过一个确定的函数关系f,计算出对应的函数值,吧这个函数值解释--为结点的存储地址,将结点存入到f(k)所指示的存储位置上,在查找时再根据要查找的关键字,用同样的函数计算地址,然后到相应的单元中读取。散列法又被成为关键字——地址转换法。
顺序表--的特点是:寻址容易,插入和删除困难; 而-链表-的特点是:寻址困难,插入和删除容易。 这个世界上有没有一种能够综合两者优点的,既寻址容易又插入和删除容易的数据结构--Yes,它就是Hash表。
哈希表:
用散列法存储的线性表被称为哈希表,使用的函数被称为*散列函数或者哈希函数,f(k)被称为散列地址或者哈希地址。通常情况下,散列表的存储空间是一个一维数组,而其哈希地址为数组的下标
哈希函数的选择原则:
若哈希函数是一个一一对应的函数,则在查找时,只需要根据哈希函数对给定关键字的某种运算得到待查找结点的--存储位置-,无需进行比较
一般情况下,散列表的空间--要比结点的集合大,虽然-浪费了一部分空间但是却提高了查找的效率,散列表空间为m,-填入表中结点数为n,则比值n/m成为--哈希表--的装填因子-,一般取0.65~0.9之间
哈希函数应当尽量简单,其值域必须--在表长的-范围之内,尽量不要产生“冲突”(两个关键字得到相同的哈希地址)
Hash表优缺点:
Hash表存在的优点显而易见,能够在-常数级的时间复杂度上进行查找,并且插入数据和删除数据比较容易。但是它也有某些缺点,比如--不支持排序,一般比用线性表存储需要-更多的空间,并且记录的关键字不能重复。
C++的STL中Hashmap和map的区别:
hash_map的用法和map是一样的,提供了 insert,size,count等操作,并且里面的元素也是以pair类型来存贮的。-虽然对外部提供的函数和数据类型是一致的,但是其底层实现是完全不同的,map底层的数据结构是rb_tree(红黑树)而,-hansh_map却是哈希表来实现的。
总体来说,-hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。hash还有-hash函数-的耗时。当有100w条记录的时候,map也只需要20次的比较,200w也只需要21次的比较!所以并不一定常数就比log(n) 小!
hash_map对空间的要求--要-比map高很多,所以是--以空间换时间--的方法,而且,hash_map如果hash函数和hash因子选择不好的话,也许不会达到你要的效果,所以至于用map,还是hash_map,从3个方面来权衡:查找速度,- 数据量, 内存使用,还有一个就是你的经验!没有特别的标准
C++ HashTable和HashMap的区别:
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,-不要使用--HashTable。可能你觉得HashTable很好用,为什么不用呢?--这里简单分析他们的区别。
HashTable--的方法是--同步--的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别--就像Vector和ArrayList一样。
HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
HashTable使用Enumeration,HashMap使用Iterator。
HashTable中hash数组--默认--大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
哈希值的使用不同,HashTable直接使用对象的hashCode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值