Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритми та структури даних ЗПІ-91-20210115T104612Z-001 / Лекція 10. Алгоритми пошуку.docx
Скачиваний:
39
Добавлен:
15.01.2021
Размер:
60.92 Кб
Скачать

Приклад 2. Лінійний пошук на мові с#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Search

{

class Program

{

static void Main(string[] args)

{

int i, n, key, nom;

bool x = false;

Console.WriteLine("Розмір масиву");

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

int [] mas = new int[n]; //визначення масиву

Console.WriteLine("Шуканий елемент");

key = int.Parse(Console.ReadLine());

// Random - клас для генерації випадкових чисел

Random aRand = new Random();

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

{

//формування масиву, заповнення його випадковими числами

mas[i] = aRand.Next(n);

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

}

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

{ //якщо цей елемент дорівнює шуканому

if (mas[i] == key) //то x призначаємо true

{ x = true; nom = i; break; } //і виходимо з циклу

}

if (x == true)

Console.WriteLine("Елемент знайдено");

else Console.WriteLine("\nЕлемент не знайдено");

Console.ReadKey();

}

}

}

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

Приклад 3. Пошук кількості одиниць у масиві

namespace Lab7_Search

{

class Program

{

static void Main(string[] args)

{

//пошук кількості одиниць у масиві

int key=1; // шуканий елемент

int kilkist=0; // кількість знайдених елементів

int[] mas = { 1, 2, 5, 3, 7, 5, 1, 3, 4,1 };

for (int i = 0; i < mas.Length; i++)

{ //якщо цей елемент дорівнює шуканому

if (mas[i] == key)

kilkist ++; //інкремент - збільшення на 1

}

Console.WriteLine("У масиві знайдено одиниць: " + kilkist);

Console.ReadKey();

}

}

}

7.2. Двійковий пошук

Двійковий (бінарний) пошук (також відомий як метод ділення навпіл і дихотомія) — класичний алгоритм пошуку елемента у відсортованому масиві.

Формальний запис алгоритму:

  1. Масив ділитися на дві рівні частини, шляхом визначення першого (a), останнього (b) і середнього (c) елементів;

  2. Середній елемент порівнюється з шуканим (s):

якщо s<c. Останньому елементу призначається значення середнього, тим самим ділянка пошуку зменшується удвічі: b=c;

якщо s>c. Першому елементу призначається значення середнього, і ділянка пошуку зменшується удвічі: a=c;

якщо s=c. Елемент знайдений, і робота алгоритму завершується.

  1. Якщо для перевірки не залишився жодного елементу, то алгоритм завершується, інакше виконується перехід до пункту 2.

У таблиці нижче представлений конкретний масив, і покроковий процес роботи алгоритму бінарного пошуку на ньому. Є послідовність цілих чисел, розташованих в порядку зростання, а також шукане число 16. Спочатку у змінні записуються числа, що знаходяться на різних кінцях масиву (1 і 81). Їх індекси мають значення 1 і 9 відповідно. Далі обчислюється номер середнього елементу, для чого, як правило, використовується формула (a+b)/2, або a+(b - a)/2 (далі в прикладі програми буде використана друга формула, як найбільш стійка до переповнювань). Після порівняння виявляється, що шуканий елемент менший за середній, і тому наступний пошук здійснюється в лівій частині послідовності. Алгоритм продовжує виконуватися так само, до знаходження на 4 кроці шуканого елементу.

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