使用分而治之搜索字符串中'xy'的第一个索引

Search for first index of 'xy' in string using divide and conquer

本文关键字:xy 第一个 索引 分而治之 字符串 搜索      更新时间:2023-10-16

我必须在字符数组中找到子字符串"xy"的第一个实例,通过使用divide and conquer 将我的数组分成两半(所以数组 [0...mid] 和数组 [mid+1...size],其中 mid = size+1/2)并在两半递归运行我的算法。子字符串"xy"可以在左半部分,可以在右半部分,也可以位于两半之间。如果找到第一个"xy",则返回"x"的索引,否则返回 -1。我的方法允许两个参数,(指针到)数组和数组的大小。我尝试使用修改后的二进制搜索来执行此操作,代码如下:

(PS.这是类似于C++的伪代码,不必正确,只需逻辑必须良好)

public int xy-search(char* data, int n){ //starts at l=0 and r == n-1
    int l = 0; //left index
    int r = n-1; // right index
    if (n==1)
        return -1;
    if (l>r) // not found
        return -1;
    int mid = l+r/2; //get mid point
    if (data[mid] == ‘x’ && data[mid+1] == ‘y’)
        return mid;
    else if (l==r) // not found
        return -1;
    else {
        int left = xy-search(data, left); //check left
        int right = xy-search(data+left+1, n - left - 1); // check right
        if (left != -1) //if found at left, return index
            return left;
        if (right != -1) //if found at right, return index
            return right;
        else 
            return -1;
    }

}

我需要有人检查我的工作,并告诉我我是否做错了。另外,我觉得应该有一个条件首先检查左侧,如果失败,则检查右侧,因为我们正在寻找"xy"的第一个实例

我不知道

你为什么要使用divide and concur。无论如何。您的数据可能很大,并且您希望使用多线程等。我认为您可以使用这样的东西:

int xy_Find(string str , int start , int end)
{
    int min = (start + end) / 2;
    if (str.substr(start,2) == "xy")
    {
        return start;
    }
    if (end - start <= 2)
    {
        return -1 ;
    }
    else 
    {
        int leftPos = xy_Find(str , start , min + 1);
        if (leftPos != -1)
        {
            return leftPos;
        }
        int rightPos = xy_Find(str , min , end);
        if (rightPos != -1)
        {
            return rightPos;
        }
    }
    return -1;
}

有一件事,我把它分成了拖曳部分。 但是它们有一个共同的字符,所以如果"XY"在中间,它就不会出错。

当数据被排序时,或者如果你可以确定数组的一半不包含你正在搜索的数据,那么,在你的情况下,你的算法的效率将比朴素线性搜索差。

即便如此,如果二叉搜索是你想要的方式,你的代码也有一些问题。对于二分搜索,您需要传递两个索引。起点和终点,使数据被正确划分。

int xysearch(char *data, int start,int end){
    int l=start;
    int r=end;
    if(l>=r){
        return -1;
    }
    int mid=(l+r)/2;
    int left=xysearch(data,l,mid);
    if(left!=-1){
        return left;
    }
    if(mid+1<strlen(data)&&data[mid]=='x'&&data[mid+1]=='y'){
        return mid;
    }
    int right=xysearch(data,mid+1,r);
    if(right!=-1){
        return right;
    }
    return -1;
}

编辑:现在程序首先检查左侧,然后右侧检查