【问题标题】:What's wrong with this Binary Search function?这个二分搜索功能有什么问题?
【发布时间】:2015-09-07 00:46:13
【问题描述】:

我正在尝试解决二进制搜索的 Spoj 问题,但我不断收到“错误答案”,我看不到我的问题。 这是我的搜索功能:

int binarySearch(int numbers[], int size, int key)
{
    int start = 0;
    int end = size - 1;
    int middle;

    while(start <= end)
    {
        middle = start + (end - start)/2;

        if(key < numbers[middle])
            end = middle - 1;
        else if(key > numbers[middle])
            start = middle + 1;
        else
            return middle;
    }

    return -1;
}

这是我的主要功能

int main()
{
    int *numbers;
    int n_numbers, n_queries, key, i, found;

    scanf("%d %d", &n_numbers, &n_queries);
    numbers = (int*)malloc(n_numbers * sizeof(int));

    for(i = 0; i<n_numbers; i++)
        scanf("%d", &numbers[i]);

    for(i = 0; i<n_queries; i++)
    {
        scanf("%d", &key);
        found = binarySearch(numbers, n_numbers, key);
        printf("%d\n", found);
    }

    return 0;
}

这里是 SPOJ 问题: http://www.spoj.com/problems/BSEARCH1/

【问题讨论】:

  • 似乎正确。你能举个例子输入/输出吗?
  • 为了让它工作,你必须对你正在二进制搜索的数组进行排序
  • Spoj 没有给出测试用例,所以不知道为什么说错了
  • @J0rge:您至少可以在 SPOJ 问题中添加一个 lin。
  • 这是错误的,因为您传入的数据没有排序。您必须对 Spoj / 客户端提供的数据进行排序。然后运行二分查找。

标签: c binary-search


【解决方案1】:

问题是您需要返回第一次出现的位置(从零开始),并且在找到密钥后立即返回。

但数组可能是: 0 1 1 1 1 1 1 1 1 1 1 1 2

键是 1。您应该返回 1(第一次出现的位置),而不是返回 6。

【讨论】:

  • 只是对您下一个问题的快速说明:如果您询问 SPOJ,请添加问题的链接,并且无论如何至少复制完整的描述。我必须按照 Zeta 提供的链接找出您应该返回第一次出现(而不是任何出现)。
  • 好的,对不起。我将为可能需要帮助的人编辑我的问题
【解决方案2】:

你的算法是正确的。数据未排序,因此您的二进制搜索算法无法正确归零解决方案。

【讨论】:

  • 可能是这个问题:spoj.com/problems/BSEARCH1。如果调用者不提供排序后的数据,那么 bsearch 就毫无用处了。
  • @Zeta 是的,绝对是。
【解决方案3】:

不完全清楚您使用的是哪种基于 C 的语言,但表达式 (end - start)/2 可能会返回一个浮点值,然后在您实际希望该值四舍五入时将其截断为整数?

【讨论】:

  • 是缺少排序的数据。请注意 OP 假设数据将如何排序,这不是保证。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多