Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 3

Двоичный (бинарный) поиск элемента в двумерном массиве

17.07.2016, 15:18. Показов 13867. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. есть вот такое задание:
Написать функцию, реализующую алгоритм бинарного поиска заданного ключа в двухмерном массиве.
как для одномерного массива, я понял как использовать поиск. а для 2ух мерного не могу разобраться.
имею такую заготовку:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <windows.h>
#include <iostream>
#include <iomanip>
using namespace std;
template <typename T>
void func1(T ar[][50], int n, int m);
template <typename T>
int search2(T ar[][50], int n, int m);
 
 
void main()
{
 
    setlocale(LC_ALL, "russian");
    setlocale(0, "");
    srand(time(NULL));
 
    int n2, m2;
    const int row = 50; const int col = 50;
    int ar1i[row][col]; 
 
    
    //Написать функцию, реализующую алгоритм бинарного поиска заданного ключа в двухмерном массиве
    cout << "Введите размеры двухмерного массива:" << endl;
    cin >> n2 >> m2;
    func1(ar1i, n2, m2);
    search2(ar1i, n2, m2);
 
 
 
 
}
 
 
template <typename T>
void func1(T ar[][50], int n, int m)
{
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            ar[i][j] = (rand() % 26 + 65) + ((rand() % 100) / 100.0);
            cout << ar[i][j] << "   ";
        }
        cout << endl << endl;;
    }
}
template <typename T>
int search2(T ar[][50], int n, int m)
{
    T key;
    int mid;
    cin >> key;
    while (1)
    {
        mid = (n + m) / 2;
        if (key < ar[mid][50])
        {
            m = mid - 1;
        }
        if (key > ar[mid][50])
        {
            n = mid + 1;
        }
        else return mid;
        if (n > m)
            return -1;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2016, 15:18
Ответы с готовыми решениями:

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

Поиск числа в двумерном массиве (бинарный поиск)
Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и бинарным(двоичным). Первый работает на ура. Второй...

Бинарный поиск элемента в массиве
Суть - программа ищет число по формуле K=(a+b)/2 бинарным поиском, и выводит его порядковый номер (индекс) в отсортированом массиве....

8
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
17.07.2016, 15:37
По моему это только для одномерного упорядоченного
0
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 3
17.07.2016, 15:38  [ТС]
именно, ибо я не могу понял как для двумерного. поэтому прощу помощи/совета
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
17.07.2016, 15:43
everyday_fail, всякий н-мерный массив по своему внутреннему устройству является одномерным массивом.
Для случая двумерного массива можно сказать, что он является массивом массивов.
От смысла этих слов и отталкивайтесь.
Интерпритируйте исходный массив как одномерный и примените к такому искусственному массиву алгоритм бин. поиска.
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
17.07.2016, 15:50
Ferrari F1, тогда массив должен быть упорядочен по возрастанию типа
1 2 3
4 5 6
7 8 9
0
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 3
17.07.2016, 16:40  [ТС]
Как не крути, но не могу и близко понять как записать бин. поиск для двумерного массива.
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
17.07.2016, 16:56
Никак

Добавлено через 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <cstdlib>
#include <iostream>
using namespace std;
 
template <typename vectorT>
void quick_sort(vectorT & v, const int a, const int b) {
   int i = a, j = b;
   
   // Здесь подразумевается что элементы вектора целые числа
   int x = v[ (i+j)/2 ];
   do {
      while (v[i] < x) ++i;
      while (v[j] > x) --j;
 
      if (i <= j) {
         if (i < j) swap(v[i], v[j]);
         ++i, --j;
      }
   } while (i <= j);
 
   if (i < b) quick_sort(v, i, b);
   if (a < j) quick_sort(v, a, j);
}
 
template <typename vectorT>
bool bin_search(vectorT & v, int size, int x) {
   int l = 0, r = size-1;
 
   while (l <= r) {
      int m = (l+r)/2;
      //cout << l << ' ' << m << ' ' << r << endl;
 
      if (x < v[m]) {
         r = m-1;
      } else if (x > v[m]) {
         l = m+1;
      } else {
         return true;
      }
   }
 
   return false;
}
 
// Инкапсуляция матрицы
template <typename T, const int N, const int M>
class matrix {
   public:
      T & operator[](int i) {
         return at(i);
      }
 
      // Обращение к массиву как к одномерному
      T & at(int i) {
         return a[i/M][i%M];
      }
 
      // Обращение к массиву как к двумерному
      T & at(int x, int y) {
         return a[x][y];
      }
 
   private:
      T a[N][M];
};
 
int main() {
   const int m_size = 3;
   matrix<int, m_size, m_size> m;
 
   for (int i = 0; i < m_size*m_size; ++i)
      m.at(i) = rand()%100;
 
   quick_sort(m, 0, m_size*m_size-1);
 
   for (;;) {
      for (int i = 0; i < m_size; ++i) {
         cout << "( ";
         for (int j = 0; j < m_size; ++j)
            cout << m.at(i, j) << " ";
         cout << ")\n";
      }
 
      int n;
      cin >> n;
      if (n == 0) break;
 
      if (bin_search(m, m_size*m_size, n)) {
         cout << "THERE IS" << endl;
      } else {
         cout << "THERE IS NO" << endl; 
      }
   }
 
   return 0;
}
Добавлено через 33 секунды
Чо откопал в рунете
0
63 / 63 / 77
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1
17.07.2016, 17:02
Предположим, что у нас есть такой двумерный массив:
2 4 12
22 22 24
28 100 201
Пронумеруем элементы слева-направо и сверху-вниз, тогда по этому порядку элементы можно выстроить в такой одномерный массив:
2 4 12 22 22 24 28 100 201
А уже в нем производим бинарный поиск. Как уже была сказано выше, элементы такого массива должны идти по неубыванию/невозрастанию.

Добавлено через 1 минуту
Пока я писал свое сообщение, shilko2013 уже нашел код)
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
17.07.2016, 17:27
Как я понял, просто по указателям пройтись можно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2016, 17:27
Помогаю со студенческими работами здесь

Реализовать бинарный поиск заданного элемента в массиве
Доброго времени суток, форумчане! Реализую алгоритмы поиска: линейный и бинарный. Нужно, чтоб они выводили как одно вхождение заданного...

Реализовать бинарный поиск заданного элемента в массиве
Помогите, напишите бинарный поиск элемента в массиве (особенно чтобы он работал, когда все элементы одинаковые)

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

Бинарный поиск в двумерном массиве
Делаю небольшую программу, в которой есть все основные операции над массивами (специально для закрепления темы). Ввод массива...

Реализуйте двоичный поиск элемента X в массиве A
Дан массив A размера N и значение X. Реализуйте двоичный поиск элемента X в массиве A, предварительно отсортировав массив методом выбора...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru