使用分而治之搜索字符串中'xy'的第一个索引
Search for first index of 'xy' in string using divide and conquer
我必须在字符数组中找到子字符串"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;
}
编辑:现在程序首先检查左侧,然后右侧检查
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- 将参数初始化为构造函数,而不是第一个
- 无法在硬件模式下创建 SGX 安全区 - "invalid launch token"即使文档将无效的启动令牌指定为第一个