使用二进制搜索在列表中查找子列表

时间:2014-03-14 23:39:04

标签: c++ algorithm binary-search

我必须通过检查smallList的值在bigList中以相同的顺序出现来查看smallList是否是bigList的子列表。元素也必须按顺序匹配

int bigList[] = {1,2,3,4,5,6,7,8,9};
int smallList[] = {3,4,5,6};

Binary Algortithm:

bool binarySearch(int x[],int list[],int first, int last)
{
    bool yes=true;
    bool no=false;
    int mid=(first+last)/2;
    if(x[last]>list[mid])
    {            
        binarySearch(x,list,mid,last);
    }
    else if (x[last]<list[mid])
    {
        binarySearch(x,list,first,mid);
    }
    else if (x[last]==list[mid])
    {
        return true;
    }
    else 
    {
        return false;
    }
}

我需要知道如何使用/修改上述算法来检查smallList是否是bigList的子列表。我必须使用算法来解决这个问题。 问题链接:https://docs.google.com/document/d/12pWWQo66-P-CMWoFH0HPWy09ws4LccGay2pKsv0XWlo/edit?usp=sharing

1 个答案:

答案 0 :(得分:3)

标准库包含std::includesstd::search算法用于此目的:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <ios>

int main()
{
    int bigList[] = {1,2,3,4,5,6,7,8,9};
    int smallList[] = {3,4,5,6};

    std::cout << std::boolalpha;
    std::cout << std::includes(
        std::begin(bigList), std::end(bigList), 
        std::begin(smallList), std::end(smallList)
    );

    std::cout << (std::search(
        std::begin(bigList), std::end(bigList), 
        std::begin(smallList), std::end(smallList)
    ) != std::end(bigList));
}
打印truetrue

Live Example

std::includes检查来自smallList的所有元素是否都包含在bigList中,std::search检查smallList是否是bigList的正确子序列(如果不是,则返回结束迭代器)。