iOS 平常工作用不到算法?

谁说算法iOS平常工作用不到,下面代码是我们项目的某个函数精简

- (void)configChannelSelectedArray {
    NSArray *channelsSelectedArray = [self.channelsSelectedArray copy];
    
    for (NSInteger i = 0; i < channelsSelectedArray.count; i++) {
        LiveClassifyItemData *itemData = [self.channelsSelectedArray safe_objectAtIndex:i];
        BOOL isHave = NO;
        
        for (LiveClassifyItemData *channelItemData in self.channelsArray) {
            if ([channelItemData.name isEqualToString:itemData.name]) {
                isHave = YES;
                break;
            }
        }
        
        if (!isHave) {
            [self.channelsSelectedArray safe_removeObjectAtIndex:i];
            self.selectedChannelsChanges = YES;
        }
    }
    
    if (self.channelsSelectedArray.count) {
        [self configOtherChannels];
        return;
    }
    
}

是不是有改进的地方

看看上面的函数,目前项目中存在的代码,时间复杂度毋庸置疑 O平方。

仔细看就会发现,可以精简成这样子的算法题目:两个数组a,b.如果a中的元素E在b中没有,a就删除E..

优化策略一

使用字典NSDictionary,比如 以 LiveClassifyItemData 中的某个字段为key,把b映射一下,然后遍历a,看看字典中有没有。

如下:

NSMutableDictionary *table = @{}.mutableCopy;
    for (LiveClassifyItemData *itemData in self.channelsArray) {
        table[itemData.name] = @"1";
    }
    
    for (LiveClassifyItemData *itemData in channelsSelectedArray) {
        if (!table[itemData.name]) {
            ///删除动作
        }
    }

如果要求效率更高点,可以使用 CFDictionaryC语言级别去处理。

现在时间复杂度就降低了,空间复杂度多了一个字典。

优化策略二:
使用NSSet,但是set内在的复杂度没测试过。

还有优化策略吗?

突然发现这里面还有一个遍历的时候删除数组元素的问题!上面那个代码做法是弄一个临时的数组,遍历临时数组,发现要删除的目标从原始数组删除,也没什么问题,其实不用这么麻烦的!稍后给出oc版本遍历删除的多种方案

删除数组中等于2的元素

如下正向删除,记得下标移动,防止漏删

NSMutableArray *arr = @[@1,@2,@2,@3,@4,@2].mutableCopy;
    for (int i = 0; i < arr.count; ++i) {
        if ([arr[i] integerValue] == 2) {
            [arr removeObjectAtIndex:i];
            --i;
        }
    }

如下倒删,不用移动下标

NSMutableArray *arr = @[@1,@2,@2,@3,@4,@2].mutableCopy;
    for (int i = arr.count - 1; i >= 0; --i) {
        if ([arr[i] integerValue] == 2) {
            [arr removeObjectAtIndex:i];
        }
    }
    

你可能感兴趣的:(iOS 平常工作用不到算法?)