内存
数据是怎样存储在计算机中的?
举个例子:
假如你带了3样物品,你需要将他们放进储物柜里,这时你需要3个储物柜把物品放进去。
计算机大致就是这样存储数据的。
计算机存储数据的基本方式有两种——数组和链表。
数组
数组就是将所有的元素放在一起。
假如有1,2,3,4四个数字你要将它们写在纸上
| 1 | 2 | 3 | 4 | 这就是数组。
当这样的情况呢?
| | | x | | |
这里虽然有4个位置但它们不是连在一起的,所以无法建立数组。
如果在添加元素时遇到这种麻烦,那就要将所有元素全部换一个位置来存储(因为数组必须是在一起的)。这就太麻烦了。
有一种解决方法是预留位置,即预留出一定数量的空位以便于添加元素。这样的方法有两个缺点:
1.预留的空位别人不能使用,这就意味着如果你用不上就浪费了预留的位置。
2.当添加数量大于预留位置时,还是需要切换位置。
很显然这种解决方法显得捉襟见肘。
对于这种情况可以用链表解决。
链表
链表的元素可以储存在内存的任何位置上,链表的每个元素都储存了下一个元素的地址。从而使一系列的随机地址串联在一起。
这就类似与剧情类游戏,你需要先到达当前任务的目的地才能获得下一个任务。
所以链表的插入非常简单。
事物都有两面性。链表与一样插入非常方便相反的,查找却非常困难。
因为每个元素都存储着下一个元素的地址。说以当你想要访问第2个元素时就必须先访问第一个元素。同样的道理当你想访问第一百个元素时你需要访问前99个元素,这样你才能获得第100个元素的地址。
运行时间(大O表示法)
先说一说数组的优点:
数组中元素的编号是从0开始的。
应为数组是连在一起的说以要查找起来就十分的简单。
当你知道第一个元素的位置是0时,第二个元素的位置就是1,同样的第一百个元素的位置是99.这样查找起来就非常简单。
他们的读取和插入的大O表示法分别为:
删除
删除时链表也是很好的选择,只需要将上一元素的地址修改即可。
对数组而言,插入虽麻烦但删除不同。删除肯定会成功,而且不需更改全部的位置,但需要将删除后的元素全部前移。
这是其操作的运行时间:
需要说的是仅当能立即访问要删除的元素时,删除的运行时间才为O(1).通常链表都记录了第一个和最后一个元素,因此删除这些元素的时间是O(1)