Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Поиск.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
127.88 Кб
Скачать

Int main()

{

int size, point, left, right;

DType key;

cout << "Введите размер массива" << endl;

cin >> size;

DType *k = new DType[size];

//заполняем массив//

cout << "Введите искомый элемент" << endl;

cin >> key;

cout << "Введите левую и правую границы" << endl;

cin >> left >> right;

point = BinSearch(k, left, right, key);

if (point == -1) // если индекс элемента по-прежнему -1, элемент не найден

cout << "Элемент не найден!";

else // иначе выводим элемент, его ключ и значение

cout << "Элемент равный " << key << " имеет индекс " << point;

return 0;

}

int BinSearch(DType *k, int left, int right, DType key) {

while (left <= right) // пока левая граница не "перескочит" правую

{

int mid = (left + right) / 2; // ищем середину отрезка

if (key == k[mid]) { // если ключевое поле равно искомому

return mid;

}

if (key < k[mid]) // если искомое ключевое поле меньше найденной середины

right = mid - 1; // смещаем правую границу, продолжим поиск в левой части

else // иначе

left = mid + 1; // смещаем левую границу, продолжим поиск в правой части

}

return - 1;

}

4. Бинарное дерево поиска.

Двоичное дерево поиска — это двоичное дерево, для которого выполняются следующие дополнительные условия (свойства дерева поиска):

  • Оба поддерева — левое и правое — являются двоичными деревьями поиска.

  • У всех узлов левого поддерева произвольного узла X значения ключей данных меньше, нежели значение ключа данных самого узла X.

  • У всех узлов правого поддерева произвольного узла X значения ключей данных больше, нежели значение ключа данных самого узла X.

Поиск элемента

Дано: дерево Т и ключ K.

Задача: проверить, есть ли узел с ключом K в дереве Т, и если да, то вернуть ссылку на этот узел.

Алгоритм:

  • Если дерево пусто, сообщить, что узел не найден, и остановиться.

  • Иначе сравнить K со значением ключа корневого узла X.

    • Если K=X, выдать ссылку на этот узел и остановиться.

    • Если K>X, рекурсивно искать ключ K в правом поддереве Т.

    • Если K<X, рекурсивно искать ключ K в левом поддереве Т.

template<class T>

int SearchTree<T>::BinSearch(SearchTree<T>* node, int k) {

if (node != NULL) {

//Если ключ искомого элемента равен текущему возвращаем адрес

if (node->key == k) {

return &key;

}

//Если больше узлов нет возвращаем NULL

if (node->left == NULL && node->right == NULL) {

return NULL;

}

//Еси ключ искомого элемента больше текущего ищем в правом поддереве

if (node->key < k) {

BinSearch(node->right, k);

}

//Иначе в левом

else if (node->key > k) {

BinSearch(node->left, k);

}

}

else return NULL;

}

5. Метод ветвей и границ.

Поиск с возвратом, бэктрекинг (англ. backtracking) — общий метод нахождения решений задачи, в которой требуется полный перебор всех возможных вариантов в некотором множестве М. Однако время нахождения решения может быть очень велико даже при небольших размерностях задачи (количестве исходных данных), причём настолько велико (может составлять годы или даже века), что о практическом применении не может быть и речи. Перебор, который осуществляет поиск с возвратом, можно уменьшить, используя идею метода «ветвей и границ». Эта идея состоит в том, что можно не искать точную оценку хода, про который стало известно, что он не может быть лучше, чем один из ходов, рассмотренных ранее.

Итак, методика решения задачи коммивояжера:

1. Построение матрицы с исходными данными 

Сначала необходимо длины дорог соединяющих города представить в виде следующей таблицы:

В нашем примере у нас 4 города и в таблице указано расстояние от каждого города к 3-м другим, в зависимости от направления движения (т.к. некоторые ж/д пути могут быть с односторонним движением и т.д.). Расстояние от города к этому же городу обозначено буквой M. Также используется знак бесконечности. Это сделано для того, чтобы данный отрезок путь был условно принят за бесконечно длинный. Тогда не будет смысла выбрать движение от 1-ого города к 1-му, от 2-ого ко 2-му, и т.п. в качестве отрезка маршрута.

2. Нахождение минимума по строкам 

Находим минимальное значение в каждой строке (di) и выписываем его в отдельный столбец.

3. Редукция строк 

Производим редукцию строк – из каждого элемента в строке вычитаем соответствующее значение найденного минимума (di).

В итоге в каждой строке будет хотя бы одна нулевая клетка.

4. Нахождение минимума по столбцам 

Далее находим минимальные значения в каждом столбце (dj). Эти минимумы выписываем в отдельную строку.

5. Редукция столбцов 

Вычитаем из каждого элемента матрицы соответствующее ему dj. В итоге в каждом столбце будет хотя бы одна нулевая клетка.

6. Вычисление оценок нулевых клеток 

Для каждой нулевой клетки получившейся преобразованной матрицы находим «оценку». Ею будет сумма минимального элемента по строке и минимального элемента по столбцу, в которых размещена данная нулевая клетка. Сама она при этом не учитывается. Найденные ранее di и dj не учитываются. Полученную оценку записываем рядом с нулем, в скобках.

И так по всем нулевым клеткам:

7. Редукция матрицы 

Выбираем нулевую клетку с наибольшей оценкой. Заменяем ее на «М». Мы нашли один из отрезков пути. Выписываем его (от какого города к какому движемся, в нашем примере от 4-ого к 2-му).

Ту строку и тот столбец, где образовалось две «М» полностью вычеркиваем. В клетку соответствующую обратному пути ставим еще одну букву «М» (т.к. мы уже не будем возвращаться обратно).

8. Если полный путь еще не найден, переходим к пункту 2, если найден к пункту 9  Если мы еще не нашли все отрезки пути, то возвращаемся ко 2-му пункту и вновь ищем минимумы по строкам и столбцам, проводим их редукцию, считаем оценки нулевых клеток и т.д. Если все отрезки пути найдены (или найдены еще не все отрезки, но оставшаяся часть пути очевидна) – переходим к пункту 9.

9. Вычисление итоговой длины пути и построение маршрута 

Найдя все отрезки пути, остается только соединить их между собой и рассчитать общую длину пути (стоимость поездки по этому маршруту, затраченное время и т.д.). Длины дорог соединяющих города берем из самой первой таблицы с исходными данными. В нашем примере маршрут получился следующий: 4 → 2 → 3 → 1 → 4. Общая длина пути: L = 30.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]