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

Алгоритмы сортировки и поиска / Последовательный поиск

 

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

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
#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;
}


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

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

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

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
#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;
}

Результат выполнения
Метод транспозиции: результат выполнения

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

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

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
#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;
}

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


Назад: Алгоритмы сортировки и поиска

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *