需要做到
1.数组、链表的结构
2.二叉树的顺序、遍历、反转
3.hash()的设计,解决hash()冲突的方式,看到一些hash()不再陌生
4.弱引用表中的hash()做了什么
数组
优点
1.查询快 index
2.便利方便
缺点
1.增删慢
2.只能存储一种类型__因为这个缺点所以swift中有了tuple(元组)
3.大小固定不方便扩容
增删改需要做元素的对齐,重新绑定index
链表
优点
1.增删改特别快
链表是由指针关联起来的,存储地址不连续,增删操作,直接对指向地址的指针做修改
缺点
1.查询特别慢
需要从头结点开始查询
hash散列表(字典)
hash() 根据数据分析
- 直接地址法
- 平方取中法
- 取余法
为了获取下标,拿到了index可以直接取值
//array为可变数组
[array setObject:object1 atIndexedSubscript:object1.hash];
//重写objecth中的
- (NSUInteger)hash{
return 上文提到的计算方法hash()算出需要的,符合需求的合理的hash
}
keyValue
- 经过内部hash()计算出index
- 什么是hash冲突(平方取中法产生的问题) :一个index上存放了两个值
- 怎么解决?
1.拉链法 :往index中再次存放链表,外层链表为X轴,二次存放的链表为Y轴
2.直接判断 :后移||前移一位取值
3.继续hash()
4.....
weak中的hash实现
static inline uint32_t ptr_hash(uint64_t key)
{
key ^= key >> 4;
key *= 0x8a970be7488fda55;
key ^= __builtin_bswap64(key);
return (uint32_t)key;
}
图
树
- 二叉树(遍历)
- hashMap用红黑树实现
- 二叉树反转
哈希表
栈(先进后出)
优点
缺点
队列(FIFO)
队列中存放任务,任务由线程执行
优点
缺点
双向链表(autoreleasePool)
优点
缺点
优点
缺点
原因