《数据结构与算法》总结(四)映射

目录
  • 映射
  • Map的接口设计
  • TreeMap分析
  • 代码实现
一 映射(Map)
  • Map 在有些编程语言中也叫做字典(dictionary,比如 Python、Objective-C、Swift 等)
key(键)- value(值)

  • Map 的每一个 key 是唯一的
二 Map的接口设计
  • Map
@interface Map : NSObject

- (int)size;

- (BOOL)isEmpty;

- (void)put:(id)key value:(id)value;

- (void)get:(id)key;

- (void)remove;

- (BOOL)containsKey:(id)key;

- (BOOL)containsValue:(id)value;

@end

  • 类似 Set,Map 可以直接利用之前学习的链表二叉搜索树(AVL树、红黑树)等数据结构来实现

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

以下资料在群文件可自行下载!

三 TreeMap分析
  • 时间复杂度(平均)
    添加、删除、搜索:O(logn)

  • 特点
    1.Key 必须具备可比较性
    2.元素的分布是有顺序的

  • 在实际应用中,很多时候的需求
    1.Map 中存储的元素不需要讲究顺序
    2.Map 中的 Key 不需要具备可比较性

  • 不考虑顺序、不考虑 Key 的可比较性,Map 有更好的实现方案,平均时间复杂度可以达到 O(1)
    1.那就是采取哈希表来实现 Map

四 代码实现
4.1 定义节点
  • Node
typedef enum : NSUInteger {
    red = 0,
    black = 1,
} ColorType;

@interface Node: NSObject
/** key */
@property(nonatomic,strong)id key;
/** value */
@property(nonatomic,strong)id value;
/** bool */
@property(nonatomic,assign)ColorType color;
/** left */
@property(nonatomic,strong)Node *left;
/** right */
@property(nonatomic,strong)Node *right;
/** parent*/
@property(nonatomic,strong)Node *parent;

- (instancetype)initWithKey:(id)key value:(id)value parent:(Node *)parent;

// 是否是叶子节点
- (BOOL)isLeaf;

- (BOOL)hasTwoChildren;

- (BOOL)isLeftChild;

- (BOOL)isRightChild;

// 返回兄弟节点
- (Node *)sibling;

@end

4.2 映射 TreeMap
  • TreeMap
@interface TreeMap()
/** red*/
@property(nonatomic,assign)BOOL red;
/** black*/
@property(nonatomic,assign)BOOL black;
/** size*/
@property(nonatomic,assign)int size;
/** root */
@property(nonatomic,strong)Node *root;

- (int)size;

- (BOOL)isEmpty;

- (void)clear;

- (void)put:(id)key value:(id)value;

- (id)get:(id)key;

- (BOOL)containsKey:(id)key;

- (BOOL)containsValue:(id)value;

@end

4.3 测试代码
- (void)test1 {
    TreeMap *map = [[TreeMap alloc] init];
    [map put:@"c" value:@2];
    [map put:@"a" value:@5];
    [map put:@"b" value:@6];
    [map put:@"a" value:@8];

    [map traversal];
}

  • 运行结果如下
2020-03-01 14:10:43.294267+0800 14_Map[99580:5046625] c_2
2020-03-01 14:10:43.294447+0800 14_Map[99580:5046625] b_6
2020-03-01 14:10:43.294542+0800 14_Map[99580:5046625] a_5


项目链接地址 - 14_Map


作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

推荐阅读
iOS开发——最新 BAT面试题合集(持续更新中)

作者:路飞_Luck
链接:https://www.jianshu.com/p/1a418de7c0be
来源:简书

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值