【问题标题】:Binary search for insert char string. Where is the bug?二进制搜索插入字符字符串。错误在哪里?
【发布时间】:2013-03-31 06:37:59
【问题描述】:

我有字符串数组。我必须通过二进制搜索算法在字符串数组中找到一个字符字符串。如果存在这个字符串,则函数必须返回位置并返回真,否则该函数必须返回在数组中插入字符串的位置和假。 我在某个地方有错误,但我不知道在哪里((

例子:

bool Binary_search ( char * arr_strings[], int & position, const char * search_string )
{
    int start = 0 ;
    int end = 10 - 1; // arr_strings [10]
    int for_compare;
    int middle;

    while ( start <= end )
    {
        middle = ( start + end ) / 2;
        for_compare = strcmp ( arr_strings[middle], search_string  );

        if ( for_compare > 0 )
        {
            start = middle + 1;
        } 
        else if ( for_compare < 0 )
        {
            end = middle - 1;
        }
        else
        {
            // if search_string is found in array, then function return position in array of strings and return true
            position = middle;
            return true;
        }
    }
    // if search_string is not found in array, then function must return position for insert string and return false 
    position = middle;
    return false;
}

【问题讨论】:

  • 我认为 char * arr_strings[] 应该是 char arr_strings[] 开头,但这也取决于你如何调用 Binary_search。
  • 问题/疑问是什么?
  • @stardust_ 不,不应该。
  • 如果 arr_strings[] 中没有 search_string,则函数返回错误位置以将此字符串插入 arr_strings[]
  • @AlexeyFrunze 啊,我看到说得太快了。

标签: c++ algorithm sorting binary-search


【解决方案1】:

我想也许应该是:

if ( for_compare > 0 )
{
    end = middle - 1;
} 
else if ( for_compare < 0 )
{
    start = middle + 1;
}

【讨论】:

    【解决方案2】:

    问题是你的插入位置不对。

    您应该执行以下操作:

    bool Binary_search ( char * arr_strings[], const char * search_string )
    {           //^^^you are not doing recursive, so you don't need position as parameter 
        int start = 0 ;
        int end = 10 - 1; // arr_strings [10]
        int for_compare;
        int middle;
        int position = -1; 
    
        while ( start <= end )
        {
            middle = ( start + end ) / 2;
            for_compare = strcmp ( arr_strings[middle], search_string  );
    
            if ( for_compare > 0 )
            {   //^^^here should switch the order
                end = middle - 1;
            } 
            else if ( for_compare < 0 )
            {
                start = middle + 1;
            }
            else
            {
                position = middle;
                return true;
            }
        }
    
        if (position == -1)
        {
            if(strcmp(arr_strings[middle],search_string) <0 )
            {
                position = middle + 1;
            }else 
            {
                position = middle;
             }
        }
    
        return position;
    }
    

    【讨论】:

    • 不错,但恐怕算法会很慢。我认为最后必须是一些两个 IF 或其他位置
    • @user1779502 我刚刚更新了帖子,现在它应该可以按您的预期工作了。我只用 3 个字符串进行了测试,效果很好(确保将 end 更改为 2)
    • 感谢您的工作,但我在使用此代码进行排序时仍有一些错误。也许错误在其他地方。我必须使用这个函数来插入字符串。如果在数组中不是字符串,则函数必须返回 false 并且 Im 使用位置进行插入,否则函数返回 true 并通过数组中的引用位置返回以供下一个工作
    • @user1779502 如果你想同时返回“找到与否”和插入位置或索引,你最好不要使用bool作为返回类型。而是返回对,一个指示是否找到,另一个指示插入位置或基于找到的索引。
    猜你喜欢
    • 2021-11-19
    • 2020-09-27
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多