2016-09-16 3 views
-4

Я решал учебник по двоичному поиску на хакереарте, но, видимо, что-то не так ... Формат ввода выглядит следующим образом: N = нет элементов в массиве элементов в по возрастанию Q = число тестов элементов можно найти в д тестовыхДвоичный поиск C++ (что является недостатком в этом коде)

#include <iostream> 
using namespace std; 
int main() 
{ 
    int n;cin>>n; 
    int ar[n];for(int y=0;y<n;y++) cin>>ar[y]; 
    int q;cin>>q; 

    for(int u=0;u<q;u++) 
    { 
     int j;cin>>j; 
     int low=0,high=n-1,mid=(low+high)/2; 

     while(low<high) 
     { 
      mid=(low+high)/2; 
      if(ar[mid]<j) low=mid+1; 
      if(ar[mid]>j) high=mid-1; 
     } 

     cout<<mid-1<<endl; 
    } 
    return 0; 
} 

Редактировать:

  1. Почему так много ненависти к объявлению массива переменных размеров. Это гораздо эффективнее писать, чем вектор ... И он совершенно легален в соответствии со стандартом C++ 99. Я использую это в стандарте C++ 11 и все мои программы работают с массивом переменных размеров.

  2. Благодарим за указание недостатка. Случай j == ar [mid] не обрабатывается. После этого код должен работать.

  3. Забудьте о представлении ответа и получать материалы .. совершенно не нужно, как я уже говорил, что это проблема на hackerearth .. это авто проверено .. представление ответа на вызов портит выходной формат

  4. Это было мой первый вопрос здесь, сообщество было очень полезно. :). Кроме того, почему так трудно вставить код .. Я попытался вставить код и скопировать вставить в него .. но он не работает .. Я должен был вручную отступ всех 4 пространств :(

+6

Правильный инструмент для решения таких проблем является ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Помните, что для бинарного поиска требуется сортировка коллекции, которую вы просматриваете. Если это не так, поиск не будет работать. –

+3

Кроме того, C++ не имеет [массивы переменной длины] (https://en.wikipedia.org/wiki/Variable-length_array), вместо этого используйте 'std :: vector'. –

ответ

1

Есть 3 вещи, которые вы должны изменить, чтобы сделать этот код работать.

  1. вы забыли обработать случай, когда ar[mid]==j. в этом случае цикл, пока while(low<high) станет бесконечным.

  2. cout<<mid-1<<endl; Эта линия означает, что ваше время петля что в середине всегда указывается индекс с большим значением, что не так, учитывая то, как вы написали цикл while.

  3. int n; cin>>n; int ar[n]; Это действительно плохая практика, поскольку n не является постоянной. Попробуйте использовать std::vector<int> ar(n) вместо int ar[n]

вы можете редактировать поиск часть, как это:

int low=0,high=n-1,mid; 
while(low<high) 
{ 
    mid=(low+high)/2; 
    if(ar[mid]>j) high=mid-1; 
    else low=mid+1; 
} 
if(high>=1 && high<=n && ar[high-1]==j) cout<<(high-1)<<endl; 
else { // you didnt find the value} 
+1

также, 'int n; int ar [n]; 'никогда не будет компилироваться в C++, поскольку' n' не является 'constexpr' –

+0

Внутри цикла while добавьте этот оператор, если (ar [mid] == j) break. В противном случае это не минимизирует сложность. –

+0

@ForhadHossain,: D yes Я не обрабатывал 'ar [mid] == j' в этом коде. Его не нужно для двоичного поиска здесь. Моя цель - найти максимальный индекс, который меньше j. И это эффективно, без сомнения. –

0

Прежде всего, Вы не можете объявить массив переменного размера.

И сделать бинарный поиск следующим образом,

int j; 
    cin >> j; 

    int low = 0, high = n - 1, mid = (low + high)/2; 

    while (low<=high) 
    { 
     mid = (low + high)/2; 
     if (ar[mid] == j) 
      break; 

     if (ar[mid]<j) low = mid + 1; 
     if (ar[mid]>j) high = mid - 1; 
    } 
    if (ar[mid] == j) 
     cout << j << " is found and index is = " << mid << endl; 
    else 
     cout << j << " is not found" << endl;