前言
NSArray
获取指定 元素 的位置 或者 判断是否存在指定的 元素 的时间复杂度是 O(n/2)
(如果不包含,耗时是 O(n)
)。
当我们需要频繁进行该操作时,可能会存在较大的性能问题。
该问题背后的原因很简单:官方文档明确指出 NSArray
从第 0
位开始依次判断是否相等,所以平均的判断次数是 n/2
(n
等于数组长度)
本文会介绍一个特别的方案:通过将数组转为字典,我们可以将时间复杂度降低到 O(1)
级别。
php 中的数组
首先,我们先对 php
的数组进行一些了解
在 php
中,数组提供了一种特殊的用法:关联键的数组。
关联键的数组 非常类似于其它语言的 map 或者 字典
|
|
通过 var_dump
,我们可以发现:普通数组会自动分配 ID 键(ID 键总是从 0 开始)。所以,普通数组转为 关联键的数组 的写法
通过类似的思想,我们同样可以将普通的 NSArray 转换为 NSDictionary
将普通的 NSArray 转换为 NSDictionary
下面,我们按照以下规则设计两个转换方法:
-
字典的
键
是数组存储的 元素该设计方式可以保证后续通过
objectForKey:
判断是否存在指定的 元素 -
字典的
值
是 数组的 索引值该规则保证字典可以恢复为数组
|
|
通过数组的 containsObject:
和字典的 objectForKey:
进行性能测试:
|
|
测试日志:
总结
通过测试日志,我们可以证明该方案可以成功将时间复杂度降低到 O(1)
级别