数组与链表

2018-11-26  本文已影响0人  投篮手型差

在学习算法的时候,看书讲到了数据结构,第一次学习,感觉基础还是很重要的,把内容整理如下,方便回顾。

数据结构


数组:
在计算机内存中,数据是相连的,如果空间不够,需要计算机重新分配可以容纳数据的内存空间,或者预留大块内存空间以供数据使用

缺点:

1.预留空间用不上,导致浪费内存。

2.预留内存空间仍然会不足。

链表:


里面每个元素都存储了下一个元素的地址,使得一系列内存地址可以串联在一起。

缺点:读取元素不如数组高效,数组只需要查index,就能推算出相应位置的元素,链表必须从头开始读区,1包含2的地址,2包含3的地址....

运行时间比较:

在中间插入,选链表,因为数组要插入元素,会导致后面元素一系列移动;链表只需要修改内存地址。

对于删除元素,总能成功。而插入会由于内存不足,可能导致操作失败。

数组支持:随机访问和顺序访问,而链表只能顺序访问。对于访问是读取行为,所以数组会更快一些。

链表擅长:插入和删除,数组擅长随机访问。

链表.png 数组链表操作运行时间.png

大O表示法来表示算法的运行时间,而算法的速度并非指时间,而是指操作的增速。也指算法执行的操作数。

关于更细致的理解,可以看这篇介绍博文大O表示法介绍

常见的操作数.png 时间比较.png

散列表(hash table)


散列函数:输入一个内容给你一个数字

应用

冲突
散列函数基本不可能将所有不同键映射到数组不同的位置,也可能是不同键映射到同一个位置,此时产生冲突(collision),解决办法是在这个位置存储一个链表。一个好的散列函数显得尤为重要。

性能
散列表一般情况取一个元素是常量时间O(1),最差的情况是线性时间O(n)。
(图数组、链表、散列表)

避免冲突


数据存储方式--补充

由于数组是顺序存储的,存储数组的内存也是连续的,需要读取数组中的数据时,提供数组索引,就可以从内存中读数据。所以寻址读取容易,而插入和删除困难。

链表存储数据内存有两块区域,一块用来存储数据,另一块来记录下一个数据保存的位置(下个数据的指针)。单向链表最后一个节点指向Null

链表在插入和删除容易,读取数据麻烦,要从头开始找。

先进后出的数据结构,数据和链表都可以组成栈。先放入的被压在最下面,后进入的从最上面先出去。

先进先出的数据结构,数组和链表都可以生成队列。先进入的可以先出列。

将栈和队列想成管子,栈时一头封死的,只能从一个口子,同一个口子出;队列一个口子负责进数据,一个口子负责出数据,先进的数据最后先从出口拿出。


推荐阅读

上一篇下一篇

猜你喜欢

热点阅读