在一个数组中避免重复查找的算法---omxcodec

转自 http://blog.sina.com.cn/foreverlovelost

void OMXCodec::findMatchingCodecs(
        const char *mime,
        bool createEncoder, const char*matchComponentName,
        uint32_t flags,
        Vector<String8>*matchingCodecs) {
    matchingCodecs->clear();

    for (int index = 0;;++index) {
        const char *componentName;
            componentName = GetCodec(
                    kDecoderInfo, //可以认为是一个字符串数组
                    sizeof(kDecoderInfo) / sizeof(kDecoderInfo[0]),// 34
                    mime, index); 
    matchingCodecs->push(String8(componentName));
}

static const char *GetCodec(const CodecInfo *info, size_tnumInfos,
                            const char *mime, int index){   //index = 0,1,2,3,4,5
    CHECK(index>= 0);
    for(size_t i = 0; i< numInfos; ++i) { 
        if (!strcasecmp(mime, info[i].mime)) {
            if (index== 0) {
                return info[i].codec;
            }
            --index;
        }
    }
    return NULL;
}

对上面的解释:
1:假如在index = 0的时候就匹配到了一个,此时返回到第一个函数中,index变为1,然后又进入到第二个函数进行匹配,这时候对整个数组进行匹配的过程中肯定又会匹配到第一个已经匹配成功的那个元素,此时如果立即返回,这匹配到的是重复的元素,如果继续下去会构成死循环,而如果此时,将index--后继续寻找,就能够避免前面已经找到了的。

2:而且对于每一种能够解码的mime类型,有几种解码类型(比如说是4),则必然是在
index = 0 匹配到一个  index=0

index = 1 匹配到第一个(放弃),匹配到第二个  index=0;

index = 2匹配到第一、二个(放弃),继续匹配到第三个  index=0;

index = 3  匹配到第一、二、三个(放弃),继续匹配到第四个index=0;

对于后续的index,都能匹配到前四个,但是因为index>0都被放弃,所以最后都不能匹配成功,一切ok了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值