首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用两段搜索从数组中删除字符串

使用两段搜索从数组中删除字符串
EN

Stack Overflow用户
提问于 2013-07-02 03:54:04
回答 2查看 114关注 0票数 1

我有两个函数。函数Find执行两部分搜索,这意味着它按部分搜索数组,直到找到键并返回其位置。函数removef或(remove fast)获取该位置并将其从字符串数组中删除。我使用的是一个命令行界面,它要求用户输入一个命令和一个字符串(字符串正在被删除),因此没有必要提示用户输入字符串。

下面是我的Find函数

代码语言:javascript
复制
int StringList::Find(string key, int start, int end)
{
    int middle = (end + start)/2;
    if (key > str[middle])
    {
        return Find(key,middle,end);
    }
    else if ( key < str[middle])
    {
        return Find(key,start,middle);
    }
    else if (key == str[middle])
    {
        return middle;
    }
}

Find函数应该确定键是在数组的上半部分还是下半部分(中上或中下),然后继续划分,直到找到需要删除的键或字符串。

下面是removef:

代码语言:javascript
复制
void StringList::removef(string s)
{
    int loc = Find(s,0,10000); //ignore these parameters, i know they are wrong they are just an example


        for(int j=loc; j<(numberOfStrings)-1; j++)
        {
            str[j] = str[j+1];
        }
        numberOfStrings--;

}

我的问题是我的Find函数使用了两段式搜索。有什么我可以修复的建议吗?我真的卡住了。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-02 04:51:17

我能看到的一个问题是,当键大于中间元素时,您将新范围设置为[midde,end],但它应该是[middle+1,end] -没有必要再次考虑中间元素,因为您已经知道它不匹配。

因此,第一个条件应该如下所示:

代码语言:javascript
复制
if (key > str[middle])
{
    return Find(key,middle+1,end);
}

此外,正如其他人所提到的,您需要检查字符串是否不在数组中。我建议在Find方法的开头添加类似下面这样的内容。

代码语言:javascript
复制
if (start == end) return -1;

一旦将数组细分到start等于end的程度,就没有更多的空间可供搜索,字符串wron也找不到了。

除此之外,我认为唯一可能是错误的是您使用错误的范围调用了Find方法。应该是这样命名的:

代码语言:javascript
复制
int loc = Find(s,0,numberOfStrings);
票数 2
EN

Stack Overflow用户

发布于 2013-07-02 04:03:29

首先,我假设您已经对字符串'str‘进行了排序,array...otherwise二进制搜索将不起作用。

在你的'Find‘函数中,你可以访问'str’数组,我假设它就是你的字符串数组,但是你没有把这个数组作为参数传递。因此,除非它是一个试图访问它的全局数组,否则它将无法工作。

最后,由于要递归调用此函数,因此需要有一个case来处理根本不包含在数组中的字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17412599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档