java-数组、链表、散列表

 

1、数组、链表、散列表

--数组

(1)数组在内存中都是相连的,
(2)当数组进行查询操作的时候,可以根据索引直接定位到需要查询的元素。
(3)进行插入操作的时候,则需要考虑具体情况,如果数组后面的内存被占了,则数组需要整体移动,重新寻找一块连续的可以放下该数组的内存,如果符合要求的内存找不到的话,插入会报错。
(4)删除操作始终都会成功,但是删除中间元素的时候,后面的元素会整体向前移动。

总结:
数组优点:因为数组在内存中是连续的,并且有对应的索引,所以查询很快
缺点:插入和删除会移动元素,所以速度慢。
补充:
针对插入因为没有连续内存,会造成数组整体移动的问题,通常数组会在分配出数组长度的基础上,预留出一些内存,这样当数组添加超出设置大小的时候,可以直接在预留位置插入。
这样做的缺点是,如果数组没有过多元素的插入,会造成内存的浪费。

--链表
(1)链表在内存的位置可以不连续,链表通常会在当前元素里记录下一个元素的内存地址。
(2)当数组进行查询时,如果所在的查询元素比较靠后,则需要从头开始一级级往下查到该元素,速度慢
(3)当进行删除和插入操作的时候,只需要改变存储的下一个元素的内存地址即可,速度很快

--散列表

散列表是一种很有用的基本数据结构,他是通过散列函数实现的。

散列函数可以将输入映射成一个数字,可以对应指出该元素对应的存储位置。

散列表的查找、插入和删除速度都非常快。

散列函数需要满足的要求:

(1)散列函数总是将同样的输入映射到相同的索引
(2)散列函数将不同的输入映射到不同的索引
(3)散列函数知道数组有多大,只返回有效的索引。

举个通俗例子:

超市的商品名单:Apple 4元   banana 6元  orange 8元

使用散列表,首先会建出一个数组,然后通过散列函数将apple、banana、orange分别映射成数组内合理的索引,然后将对应的价格存进去,这样当你每次输入商品名称的时候,根据散列函数的返回值,则可以一次就查到对应的商品价格。

冲突:
有些散列函数如果写的不好,会造成两个不同的输入映射到同一个位置,解决冲突的的办法是在该位置存储一个链表然后进行追加操作。
这样查别的元素的时候会很快,但是查询的位置如果出现了列表,速度会慢下来。因此对于散列表来说,一个好的散列函数尤其重要。

如何减少冲突:

❑ 较低的填装因子;

❑ 良好的散列函数。

填装因子:

假设你要在散列表中存储100种商品的价格,而该散列表包含100个位置。那么在最佳情况下,每个商品都将有自己的位置。
这个散列表的填装因子为1。如果这个散列表只有50个位置呢?填充因子将为2。不可能让每种商品都有自己的位置,因为没有足够的位置!
填装因子大于1意味着商品数量超过了数组的位置数。一旦填装因子开始增大,你就需要在散列表中添加位置,这被称为调整长度(resizing)。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值