Последовательный поиск

Последовательный поиск

https://t.me/bookflow

Последовательный поиск предполагает последовательный просмотр всех записей множества, организованного как массив.

Пример на Си: Найти в массиве элемент со значением, равным 3.

#define _CRT_SECURE_NO_WARNINGS // для корректной работы scanf в Visual Studio последних версий
#include <stdio.h>
#include <stdlib.h> // для переключения на русский язык - функция system()
// Функция поиска в массиве k размерности n
// элемента со значением key
int search(int *k, int n, int key)
{
 for (int i = 0; i < n; i++) // просматриваем все элементы в цикле
 {
  if (k[i] == key)   // если находим элемент со значением key,
   return i;   // возвращаем его индекс
 }
 return -1; // возвращаем -1 - элемент не найден
}
int main() 
{
 int k[8];  // описываем массив из 8 элементов
 int point;  // индекс элемента, равного указанному значению (3)
 system("chcp 1251"); // переходим на страницу 1251 для поддержки русского языка
 system("cls");    // очищаем окно консоли
 // В цикле вводим элементы массива
 for (int i = 0; i<8; i++) 
 {
  printf("Введите k[%d]: ", i);
  scanf("%d", &k[i]);
 }
 // Вызываем функцию поиска в массиве элемента, равного 3
 point = search(k, 8, 3);
 if (point == -1) // если функция вернула -1, такого элемента в массиве нет
  printf("Элементов равных 3 в массиве нет!\n");
 else // иначе выводим полученный индекс элемента
  printf("Элемент с индексом %d равен 3", point);
 getchar(); getchar();
 return 0;
}


Результат выполнения

Метод транспозиции

Улучшением рассмотренного метода является метод транспозиции: каждый запрос к записи сопровождается сменой мест этой и предшествующий записи; в итоге наиболее часто используемые записи постепенно перемещаются в начало таблицы; и при последующем обращении к ним, эти записи находятся почти сразу.

#define _CRT_SECURE_NO_WARNINGS // для корректной работы scanf()
#include <stdio.h>
#include <stdlib.h>  // для переключения на русский язык - функция system()
// Функция поиска в массиве k размерности n
// элемента со значением key с использованием транспозиции
int search(int *k, int n, int key)
{
 int temp;     // вспомогательная переменная для обмена
 for (int i = 0; i<n; i++) // просматриваем все элементы в цикле
 {
  if (k[i] == key)  // если находим элемент со значением key,
  {
   if (i == 0)   // если индекс равен нулю, возвращаем его,
    return i;   // потому что смещаться ближе к началу массива невозможно
   temp = k[i];   // меняем местами найденный элемент с предыдущим
   k[i] = k[i - 1];
   k[i - 1] = temp;
   return i;     // возвращаем найденный индекс элемента
  }
 }
 return -1; // если элемент не найден, возвращаем -1
}
int main() 
{
 int k[8];  // описываем массив из 8 элементов
 int point;  // индекс элемента, равного указанному значению (3)
 system("chcp 1251"); // переходим на страницу 1251 для поддержки русского языка
 system("cls");    // очищаем окно консоли
 // В цикле вводим элементы массива
 for (int i = 0; i<8; i++)
 {
  printf("Введите k[%d]: ", i);
  scanf("%d", &k[i]);
 }
 // Повторяем процедуру поиска 6 раз (с учетом транспозиции)
 for (int j = 0; j < 6; j++) 
 {
  point = search(k, 8, 3); // вызов функции поиска
  // Вывод индекса элемента, равного 3
  if (point == -1)
   printf("Элементов равных 3 в массиве нет!\n");
  else
   printf("Элемент с индексом %d равен 3\n", point);
 }
 getchar(); getchar();
 return 0;
}


Результат выполнения

Метод перемещения в начало

В этом методе каждый запрос к записи сопровождается её перемещением в начало таблицы. В итоге в начале таблицы оказывается запись, используемая в последний раз.

#define _CRT_SECURE_NO_WARNINGS // для корректной работы scanf()
#include <stdio.h>
#include <stdlib.h>  // для переключения на русский язык - функция system()
// Функция поиска в массиве k размерности n
// элемента со значением key с использованием транспозиции
int search(int *k, int n, int key)
{
 int temp;     // вспомогательная переменная для обмена
 for (int i = 0; i<n; i++) // просматриваем все элементы в цикле
 {
  if (k[i] == key)  // если находим элемент со значением key,
  {
   temp = k[i];   // меняем местами найденный элемент с начальным
   k[i] = k[0];
   k[0] = temp;
   return i;     // возвращаем найденный индекс элемента
  }
 }
 return -1; // если элемент не найден, возвращаем -1
}

int main() 
{
 int k[8];  // описываем массив из 8 элементов
 int point;  // индекс элемента, равного указанному значению (3)
 system("chcp 1251"); // переходим на страницу 1251 для поддержки русского языка
 system("cls");    // очищаем окно консоли
 // В цикле вводим элементы массива
 for (int i = 0; i<8; i++)
 {
  printf("Введите k[%d]: ", i);
  scanf("%d", &k[i]);
 }
 // Повторяем процедуру поиска 6 раз (с учетом транспозиции)
 for (int j = 0; j < 6; j++) 
 {
  point = search(k, 8, 3); // вызов функции поиска
  // Вывод индекса элемента, равного 3
  if (point == -1)
   printf("Элементов равных 3 в массиве нет!\n");
  else
   printf("Элемент с индексом %d равен 3\n", point);
 }
 getchar(); getchar();
 return 0;
}


Результат выполнения

Такой вариант поиска может быть полезен если чаще всего производится обращение к одной и той же записи таблицы.

Report Page