9 / 9 / 2
Регистрация: 03.04.2016
Сообщений: 89
1

Двоичный поиск в массиве

22.04.2016, 23:24. Показов 1286. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В первой строке даны целое число 1≤n≤10^5 и массив A[1…n] из n различных натуральных чисел, не превышающих 10^9, в порядке возрастания, во второй — целое число 1≤k≤10^5 и k натуральных чисел b1,…,bk, не превышающих 10^9. Для каждого i от 1 до k необходимо вывести индекс 1≤j≤n, для которого A[j]=bi, или −1, если такого j нет.
Sample Input:
5 1 5 8 12 13
5 8 1 23 1 11
Sample Output: 3 1 -1 1 -1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <algorithm>
#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
 
int get_pos(const vector<int> &numbers, int number) {
    vector<int> ::const_iterator it = find(numbers.begin(), numbers.end(), number);
  if (it == numbers.end()) {
    return -1;
  }
  return static_cast<int>(it - numbers.begin()) + 1;
}
 
int main(void) {
  size_t number_count;
  cin >> number_count;
  vector<int> numbers(number_count);
  for (size_t i = 0; i < number_count; i++) {
    cin >> numbers[i];
  }
 
  size_t query_count;
  cin >> query_count;
  while (query_count-- > 0) {
    int number;
    cin >> number;
    cout << get_pos(numbers, number) << " ";
  }
  cout << endl;
}
Failed test #3. Time limit exceeded
Как функцию поправить, чтобы ускорить?

Добавлено через 17 минут
C++
1
2
3
4
5
6
7
int mid = ( low + high ) / 2;
         if ( A[mid] == key )
            return mid;
         if ( A[mid] < key)
            BinSearch(A,key,mid+1,high);
         if ( A[mid] > key )
            BinSearch(A,key,low,mid-1);
как это в код вставить, чтоб все работало путево?

Добавлено через 7 часов 8 минут
А вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <algorithm>
#include <cassert>
#include <iostream>
#include <vector>
 
int get_pos(const std::vector<int> &numbers, int number) {
  // TODO optimize this function 
  size_t l = 0;
  size_t r = numbers.size();
  while (l + 1 < r) {
      size_t m = l + (r-l) / 2;
  if (numbers[m] > number) {
      r = m;
  } else {
      l = m;
    }
  }
if (l == r || numbers[l] != number) {
    return -1;
  }
  return l + 1;
}
 
int main(void) {
   std::vector<int> numbers;
   size_t number_count;
   std::cin >> number_count;
   numbers.resize(number_count);
  for (auto &number:numbers) {
    std::cin >> number;
  }
    assert(std::is_sorted(numbers.begin(), numbers.end()));
    
  size_t query_count;
  std::cin >> query_count;
  while (query_count-- > 0) {
    int number;
    std::cin >> number;
    std::cout << get_pos(numbers, number) << " ";
  }
  std::cout << std::endl;
}
Спасибо. Тема закрыта.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2016, 23:24
Ответы с готовыми решениями:

Сортировка и двоичный поиск в массиве.
Помогите чайнику изменить следующий код: // F_08_L_2.cpp: определяет точку входа для консольного...

Двоичный поиск в упорядоченном массиве
Дан упорядоченный по неубыванию целочисленный массив и набор чисел ki. Требуется для каждого числа...

Двоичный (бинарный) поиск элемента в двумерном массиве
Доброго времени суток. есть вот такое задание: Написать функцию, реализующую алгоритм бинарного...

Бинарный (двоичный) поиск по алфавиту в упорядоченном массиве структур
Приветствую товарищей-программистов! Есть массив структур StructWords massiv. struct...

0
22.04.2016, 23:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2016, 23:24
Помогаю со студенческими работами здесь

Двоичный поиск в массиве выдает один и тот же ответ
выдаёт один и тот же ответ(( #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int...

Используя двоичный поиск определить, сколько чисел, равных X, находится в массиве
Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск,...

Используя двоичный поиск определить, есть ли в массиве число равное заданному
Заполнить массив случайными числами и ввести число и отсортировать его. Ввести число X. Используя...

Двоичный поиск
Требуется найти в массиве элементы которые повторяются и элементы которые присутствуют единожды. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru