3673

Алгоритми пошуку в одновимірних масивах

Лекция

Информатика, кибернетика и программирование

Алгоритми пошуку в одновимірних масивах Алгоритми пошуку застосовуються для знаходження, наприклад, у масиві елемента з потрібними властивостями. Звичайно розрізняють постановки завдання пошуку для першого й останнього входження елемента. В усіх ниж...

Украинкский

2012-11-05

40.5 KB

46 чел.

Алгоритми пошуку в одновимірних масивах

Алгоритми пошуку застосовуються для знаходження, наприклад, у масиві елемента з потрібними властивостями. Звичайно розрізняють постановки завдання пошуку для першого й останнього входження елемента. В усіх нижче викладених алгоритмах будемо вважати, що виробляється пошук у масиві A з N цілих чисел елемента, рівного X.

Лінійний пошук

Лінійний пошук здійснюється циклом (while ) з подвійною умовою. Перша умова контролює індекс на приналежність масиву, наприклад, (i<=N). Друга умова - це умова пошуку. У нашому випадку в циклі while ця умова продовження пошуку: (A[i]<>X), (A[i]=X). У тілі циклу звичайно пишеться тільки один оператор: зміна індексу в масиві.

Після виходу із циклу необхідно перевірити, по якому з умов ми вийшли. В операторі if звичайно повторюють перша умова циклу. Можна говорити про успішний пошук із циклом while при виконанні цієї умови.

Приклад 23.1. : Лінійний пошук

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n+1];

Random r = new Random();

int i, min, i1;

for (i = 1; i <= n; i++)

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

Console.WriteLine("Введите число ");

int m = Int32.Parse(Console.ReadLine());

i = 1;

while ((i < n) && (a[i] != m)) i++;

{

if (i < n) { Console.WriteLine("Перше входження" + m + "место" + i); }

else { Console.WriteLine("Нет такого елемента"); }

}

Console.ReadLine();

При пошуку останнього входження після уведення повинні йти оператори:

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n+1];

Random r = new Random();

int i, min, i1;

for (i = 1; i <= n; i++)

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

Console.WriteLine("Введите число ");

int m = Int32.Parse(Console.ReadLine());

i = n;

while ((i > 1) && (a[i] != m)) i--;

{

if (i > 1) { Console.WriteLine("Перше входження" + m + "место" + i); }

else { Console.WriteLine("Нет такого елемента"); }

}

Console.ReadLine();

Пошук бар’єром

Ідея пошуку з бар'єром полягає в тому, щоб не перевіряти щораз у циклі умова, пов'язане із границями масиву. Це можна забезпечити, установивши в масив так званий бар'єр: будь-який елемент, що задовольняє умові пошуку. Тим самим буде обмежена зміна індексу.

Вихід із циклу, у якому тепер залишається тільки умова пошуку, може відбутися або на знайденому елементі, або на бар'єрі. Таким чином, після виходу із циклу перевіряється, не чи бар'єр ми знайшли? Обчислювальна складність пошуку з бар'єром менше, ніж у лінійного пошуку, але також є величиною того ж порядку, що й N - кількість елементів масиву.

Існує два способи установки бар'єра: додатковим елементом або замість крайнього елемента масиву.

Приклад 23.2.: Пошук з бар'єром

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n+2];

Random r = new Random();

int i, min, i1;

for (i = 1; i <= n; i++)

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

Console.WriteLine("Введите число ");

int m = Int32.Parse(Console.ReadLine());

a[n + 1] = m;

i = 1;

while (a[i] != m) i++;

{

if (i <=n ) { Console.WriteLine("Перше входження" + m + "место" + i);

else { Console.WriteLine("Нет такого елемента"); }

}

Console.ReadLine();

Двійковий (БІНАРНИЙ) пошук

Алгоритм двійкового пошуку можна використати для пошуку елемента із заданою властивістю тільки в масивах, упорядкованих по цій властивості. Так при пошуку числа із заданим значенням необхідно мати масив, упорядкований по зростанню або по убуванню значень елементів. А, наприклад, при пошуку числа із заданою сумою цифр масив повинен бути впорядкований по зростанню або по убуванню сум цифр елементів.

Ідея алгоритму полягає в тому, що масив щораз ділиться навпіл і вибирається та частина, де може перебувати потрібний елемент. Розподіл триває поки частина масиву для пошуку більше одного елемента, після чого залишається перевірити цей елемент, що залишився, на виконання умови пошуку.

Існують дві модифікації цього алгоритму для пошуку першого й останнього входження. Все залежить від того, як вибирається середній елемент: округленням у меншу або більшу сторону. У першому випадку середній елемент ставиться до лівої частини масиву, а в другому - до правого.

У процесі роботи алгоритму двійкового пошуку розмір фрагмента, де цей пошук повинен тривати, щораз зменшується приблизно у два рази. Це забезпечує обчислювальну складність алгоритму порядку логарифма N по підставі 2, де N - кількість елементів масиву.

Приклад 23.3. : Пошук в упорядкованому по зростанню масиві першого входження числа X.

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n+2];

Random r = new Random();

int i;

for (i = 1; i <= n; i++)

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

for (i=1; i<=n-1;i++)

for (int j = 1; j <= n - 1; j++)

{

if (a[j] > a[j + 1])

{

int b = a[j]; a[j] = a[j + 1]; a[j + 1] = b;

}

}

for (i = 1; i <= n; i++)

{

Console.Write(a[i] + " ");

}

Console.WriteLine();

Console.WriteLine("Введите число ");

int m = Int32.Parse(Console.ReadLine());

int left = 1; int right = n;

while (left < right)

{

int c = (left + right) / 2;

Console.WriteLine(left+ " " + right + " " +c);

if (m > a[c]) { left = c + 1; } else { right = c; }

}

if (m == a[left]) { Console.WriteLine("Перше входження" + m + "место" + left); }

else { Console.WriteLine("Нет такого елемента"); }

 

 

Console.ReadLine();


 

А также другие работы, которые могут Вас заинтересовать

13314. Дослідження характеристик регулюючих органів 1.41 MB
  Лабораторна робота №6 Тема: Дослідження характеристик регулюючих органів Мета: Навчитись вибирати регулюючі органи в залежності від вимог до системи управління 1.Вступ Автоматизація виробничих процесів створює певні технікоекономічні переваги у всіх галу
13315. Використання локальних регуляторів для управління моніторингу, контролю і аварійної сигналізації система при управлінні охолоджувальною технікою 1.9 MB
  Лабораторна робота № 8 Тема: Використання локальних регуляторів для управління моніторингу контролю і аварійної сигналізації система при управлінні охолоджувальною технікою. Мета: Навчитись працювати з локальними регуляторами для управління моніторингу контролю ...
13316. Визначення коефіцієнта лінійного розширення тіл методом Менделєєва 444 KB
  Лабораторна робота № 1 Визначення коефіцієнта лінійного розширення тіл методом Менделєєва. Мета роботи: аВивчення теплового розширення твердих тіл. бВизначення коефіцієнта лінійного розширення різних матеріалів методом Менделєєва. Прилади та матеріали: прил...
13317. ВИЗНАЧЕННЯ КОЕФІЦІЄНТА ПОВЕРХНЕВОГО НАТЯГУ РІДИНИ МЕТОДОМ ВІДРИВУ КРАПЛІ 285 KB
  Лабораторна робота № 2 ВИЗНАЧЕННЯ КОЕФІЦІЄНТА ПОВЕРХНЕВОГО НАТЯГУ РІДИНИ МЕТОДОМ ВІДРИВУ КРАПЛІ. Мета роботи: а вивчення властивостей рідкого стану речовини; б експериментальне визначення коефіцієнта поверхневого натягу рідини та дослідження його залежності від
13318. ВИЗНАЧЕННЯ ТЕМПЕРАТУРНОГО КОЕФІЦЇЄНТА ОБЄМНОГО РОЗШИРЕННЯ РІДИН 341.5 KB
  Лабораторна робота №З ВИЗНАЧЕННЯ ТЕМПЕРАТУРНОГО КОЕФІЦЇЄНТА ОБЄМНОГО РОЗШИРЕННЯ РІДИН Мета роботи: а визначення теплового розширення речовин; 2 дослідне визначення коефіцієнта обємного розширення. Прилади і матеріали: прилад Дюлонга і Пті; нагрівам; лаборат
13319. ВИЗНАЧЕНИМ КОЕФІЦІЄНТА ТЕПЛОПРОВІДНОСТІ МЕТАЛІВ КАЛОРИМЕТРИЧНИМ МЕТОДОМ 242 KB
  Лабораторна робота №4 ВИЗНАЧЕНИМ КОЕФІЦІЄНТА ТЕПЛОПРОВІДНОСТІ МЕТАЛІВ КАЛОРИМЕТРИЧНИМ МЕТОДОМ Мета роботи: а вивчення явища тепло переносу; б експериментальне визначення коефіцієнта теплопровідності. Прилади та матеріали: калориметрична установка ваги з ...
13320. ВИЗНАЧЕННЯ ПИТОМОЇ ТЕПЛОТИ ПАРОУТВОРЕННЯ РІДИНИ 236 KB
  Лабораторна робота № 5 ВИЗНАЧЕННЯ ПИТОМОЇ ТЕПЛОТИ ПАРОУТВОРЕННЯ РІДИНИ Мета роботи: а вивчення процесів пароутворення; б експериментальне визначення питомої теплоти пароутворення води при температурі кипіння. Прилади та матеріали: калориметр з мішалкою ки
13321. ВИЗНАЧЕННЯ КОЕФІЦІЄНТА ПОВЕРХНЕВОГО НАТЯГУ РІДИНИ МЕТОДОМ ВІДРИВУ КІЛЬЦЯ 168.5 KB
  Лабораторна робота № 6 ВИЗНАЧЕННЯ КОЕФІЦІЄНТА ПОВЕРХНЕВОГО НАТЯГУ РІДИНИ МЕТОДОМ ВІДРИВУ КІЛЬЦЯ. Мета роботи: а вивчення властивостей рідкого стану речовини; б визначення коефіцієнта поверхневого натягу рідини від типу речовини; в визначення залежності коефі