常用数据结构(待续)

253 阅读2分钟

需要做到

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)

优点


缺点


优点


缺点


原因