confuse point

1. setValue:forKey & setObject:forKey

- (void)setObject:(ObjectType)anObject forKey:(KeyType )aKey;
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;
  • setObject:forKey: 是NSMutableDictionary 的方法, key 和 Object 都不能为nil
  • setValue:forkey: 是KVC的方法, value可以为nil, key必须为非空字符串

2. 数据结构

  • Hash, 一般翻译为散列. 简单说就是一种将任意长度的消息压缩到某一固定长度(128位 - 16字节)的消息摘要的函数. 也可以说是数据内容和数据存放地址之间的映射关系.

  • 数组的特点: 寻址容易, 插入和删除困难

  • 链表: 插入和删除容易, 寻址困难

  • Hash table

  • 拉链法 - 链表的数组


    image.png

左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

元素特征转变为数组下标的方法就是散列法。散列法当然不止一种,下面列出三种比较常用的:

* 直接定址法,
* 数字分析法,
* 平方取中法,
* 折叠法,
* 随机数法,
* 除留取余法 
  • 适用范围
    快速查找,删除的基本数据结构,通常需要总数据量可以放入内存。

  • 基本原理及要点
    hash函数选择,针对字符串,整数,排列,具体相应的hash方法。

  • 碰撞处理,一种是open hashing,也称为拉链法(链表法);另一种就是closed hashing,也称开地址法,opened addressing。

你可能感兴趣的:(confuse point)