Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Поиск в числовых массивах

Цель поиска: определить, содержит ли массив значение, которое соответствует определенному ключевому значению (ключу). Процесс нахождения какого-то элемента массива называется поиском.

Линейный или последовательный поиск применяется к неотсортированным массивам, когда каждый элемент массива сравнивается с ключом поиска. Лучший случай – искомый элемент – первый, худший – последний, или его нет в массиве. В среднем – с ключом сравнивается половина элементов массива. Следовательно, вычислительная сложность линейного поиска - .

//--------------------------------------------------------------------------------------

int linpoisk(const int a[], const int n, const int key)

{ for(int i=0; i<n; i++)

if(a[i]==key) return i;

return -1;

}

//---------------------------------------------------------------------------------------

Линейный поиск применяется для небольших неотсортированных массивов.

Бинарный поиск высокоэффективен при отсортированных массивах.

Алгоритм быстрого поиска исключает половину ещё непроверенных элементов массива после каждого сравнения. Средний элемент сравнивается с ключом. Поиск продолжается до тех пор, пока средний элемент не станет равным ключу или пока оставшийся подмассив не станет одноэлементным, где элемент не равен ключу.

//-----------------------------------------------------------------------------------------

int binpoisk(const int a[], const int n, const int key, int l, int h)

{

int m;

while(l<=h) {

m=(l+h)/2;

if(key==a[m]) return m; //элемент есть!

else if(key<a[m]) h=m-1;

else l=m+1;

}

return -1; //элемента нет!

}

Вычислительная сложность бинарного поиска

В наихудшем случае в массиве из 1024 ( ) элементов потребуется 10 сравнений: повторяющееся деление 1024 на 2 дает 512, 256, 128, 64, 32, 16, 8, 4, 2, 1. Массив из элементов потребует самое большее 20 сравнений, а (1 миллиард) – 30 сравнений. (Для линейного поиска потребуется в среднем 500 миллионов сравнений.) В наихудшем случае бинарного поиска требуется .

Наилучший случай – элемент находится в середине, - требуется только одно сравнение.

Структуры

Структура – это набор взаимосвязанных данных, объединенных в единое целое, под общим именем. В С++ допускается включать в качестве элементов структур функции. Фактически структуры в С++ являются классами, все элементы которых имеют открытый доступ.

Форматы определения структурных типов

1) struct имя_структурного_типа

{определения элементов};

Пример:

struct goods {

char* name;

long price;

float percent;

int vol;

char date[9];

};

2) typedef struct

{определения элементов} имя_структурного_типа;

Пример:

typedef struct

{double re;

double im;

} complex;

3) typedef struct имя_структурного_типа_1

{определения элементов} имя_структурного_типа_2;

Пример:

typedef struct dr

{int n, d;} fr;

4) #define STUD struct {char f[10]; int nz; float stip;}

При определении структурного типа его элементам (полям, компонентам) память не выделяется. Чтобы задать значения, нужно выделить память. Это происходит при объявлении объектов (переменных) структурного типа.