茶艺师学算法打卡2:数组
写在前面的话
许多有趣的算法问题共有着两个特征:
1.存在许多候选解,但绝大多数候选解都没解决手头的问题
2.存在实际应用
学习笔记
-
数组,是这样的线性表数据结构:连续的内存空间,存一组类型相同的数据。
-
这里想像一排塞得满满当当的书架,当想从中抽掉一本书,这本书后面的书要补上来填掉空位,不然一排书架中间空着一个位很别扭;反过来要在中间插入一本书,那么要把插入位置后面的书往后挪出一个位。这比喻了体现了在数组中插入与删除数据的“麻烦”。
-
因此出现关于插入与删除的便捷操作,继续拿这“书架”做比方:插入时,插入位置的“书”抽出来直接放到最后,空出的位置插入新书;删除时,就把那本书给标记起来,等多了再一起拿走与归整书架
-
在这样的“书架”上,想按照“书名”来找一本“书”,基本上得一本本书看过来,最坏的情况就是得看完整个“书架”。但是如果知道了这本“书”是“第几本书”,就可以从开始数下来,一下就找到。这也就是为什么说 数组根据下标随机访问的时间复杂度是 。
-
数组的开头为什么是从“0”开始?
- “0”就表示开始
- 从“0”开始,在按照下标寻找数据时,其操作是:
0 + 下标(偏移量);如果真的要从“1”开始,那么寻找时的操作就会是:1 + 下标(偏移量) - 1,一比较就会发现后者还多了个减法操作 - “前辈、大佬们设计(编程)语言时,就是设置的从0开始,那我就跟着继续使用这设定呗...”就是所谓的路径依赖
这三种说法,你更喜欢哪个?
结语
数组,可以说是学习算法时入门级别的数据结构,我这茶艺师看着数组都觉得倍感亲切(虽然现在我更钟情 go 的 slice 切片)。
而且与别的东西结合,数组也能玩出不少的花活,例如跟一个作为下标的 int 结合,数组就能模拟出栈,甚至是队列的能力,是不是很神奇?
————————————
①:出自《算法导论(原书第三版)》第一章