2018/07/26 《轻松学算法》【数组/集合/散列表】学习笔记(一)
读
第一章《数组、集合、散列表》
总结
1:数组
- 什么是数组?
- 把有限个数据类型一样的元素按顺序放在一起,用一个变量命名,通过编号可以访问的一个有序集合。
- 特点:
- 想用就要提前想好。因为数组是 定长 的,多了浪费,少了尴尬。
- 顺序访问,也就是说,虽然在使用中可以通过下标访问,但是在计算机处理当中,也是按照顺序访问的。
- 使用场景
- 因为数组的不变性,所以在不变的业务中,更适合使用数组。
2:集合
- 列表(有序集合[链表、队列、栈 ......]、关联数组......) 等等都是集合,概念比较宽泛......(了解)
- 特点
- 和它实现有关,那就是变长,变长是相对的,内部还是通过数组来实现。知识在数组不够长时候的一种策略,把旧数组复制到新数组使用。
- 使用场景
- 会变得东西基本都会使用。
3:散列表
- 什么是散列表(HashTable)?
- 可以通过给定的关键字直接访问到具体对应值的一个数据结构。
- 就类似一个班上一共500个同学,每次找小明巨麻烦,需要一个一个问你是不是小明,效果很差。
为了可以快速定位,校长掐指一算(Hash计算),给小明(Value)定了一个学号(Key),并记在了一个小本子(散列表)上。
这样我们每次就可以快速找到对应的同学了。
- 什么是碰撞?
- 通过不同的Key可以访问到同一个Value。
- 原因是 不同的 Key 在通过哈希函数计算时候,可能会得到同一个地址(Value)
- 如何解决碰撞问题?(了解)
- 开放地址法 (开放寻址法)
- 在发现该 Key 已经有值之后,可以往后移动一个地址,在检测,如果没有使用。则就是用这个地址。
- 在哈希法
- 再次计算哈希,缺点是增加了计算的时间。
- 链地址法
- 学习链表之后学习
- 散列的特点?
- 访问速度快。快速定位。
- 空间换时间,需要额外的空间。
- 无序。
- 可能产生碰撞。
- 散列的使用场景
- 由于散列的特性我们也知道,散列表适合快速查找等。