突然看微信公众号中iOS Peak杂货铺的一篇文章,就“iOS程序员对算法的要求”,里面有一个例子:“检查通讯录的变化并上传服务器”。具体内容下图
上面代码的问题是两层循环嵌套,这样时间复杂度是O(N^2), 这样当N非常大的时候,非常可怕。
按照peak的提示,如果我们用哈希表要做,时间复杂度会降低。iOS用哈希表就是字典与Set了。我们这里用字典。先把原来数组放到字典中,以其中id作为key,内容作为value。然后在让另一个数组到字典中查找有没有这个key,有这个key表示在原来数组中存在,没有的表示的话原来数组中没有这个key。
具体代码可以这样写
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
for (Model *content in _dataArray) {
dic[content.contentId] = content;
}
for (Model *content in array) {
if (![dic objectForKey:content.contentId]) {
[_dataArray addObject:content];
}
}
这样虽然还是两个循环,但是不是嵌套了。时间复杂度是O(N)+O(N)=O(N),嗯,最终是O(N)。
算法这个是一个程序员的内功,平时都是写业务代码。想要第一个方法就写,以后写代码还要想想其他更优解。这样才能成长更快。