Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

АиСД / АиСД

.DOCX
Скачиваний:
9
Добавлен:
31.05.2018
Размер:
33.1 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

НАБЕРЕЖНОЧЕЛНИНСКИЙ ИНСТИТУТ (ФИЛИАЛ)

КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ

ЛАБОРАТОРНАЯ РАБОТА № 4

«Поиск»

По дисциплине

«Алгоритмы и структуры данных»

Выполнил:

Студент группы 2161121

Золотых С.В.

Проверил:

Каримов Т.Н.

Набережные Челны

2018

Цель

Приобретение навыков реализации алгоритмов программного поиска в информационных массивах.

Задание

Написать программу, реализующую один из алгоритмов программного поиска данных в информационном массиве, расположенном в оперативной памяти (по желанию, можно считывать данные из файла):

  1. Двоичный поиск;

  2. Ускоренный поиск, основанный на использовании единого справочника.

Листинг программы

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace АиСД

{

class Program

{

static void Main(string[] args)

{

int[] a = { -9,-1,0,1, 3, 5, 7, 9,11,13,18,19,20,27,33,36 };

Console.WriteLine("Массив: ");

Console.WriteLine("-9, -1, 0, 1, 3, 5, 7, 9, 11, 13, 18, 19, 20, 27, 33, 36");

Console.WriteLine("Бинарный поиск: ");

Console.WriteLine("Позиция -1: {0}", BinarySearch(a, -1));

Console.WriteLine("Позиция 3: {0}", BinarySearch(a, 3));

Console.WriteLine("Позиция 6: {0}", BinarySearch(a, 6));

Console.WriteLine("Ускоренный поиск, основанный на едином справочнике: ");

Console.WriteLine("Позиция 9: {0}", FlashSearch(a, 9));

Console.WriteLine("Позиция 20: {0}", FlashSearch(a, 20));

Console.WriteLine("Позиция 38: {0}", FlashSearch(a, 38));

Console.ReadLine();

}

//Двоичный поиск

private static int? BinarySearch(int[] a, int x)

{

//проверка на наличие/отсутсвие принадлежности x к массиву

if ((a.Length == 0) || (x < a[0]) || (x > a[a.Length - 1]))

return null;

int first = 0;//границы для бинарного поиска

int last = a.Length;

while (first < last)

{

int mid = first + (last - first) / 2;

if (x <= a[mid])

last = mid;

else

first = mid + 1;

}

if (a[last] == x)

return last;

else

return null ;

}

//метод бинарного поиска для справочника

private static int? Binary(int[] a, int x, int first, int last)

{

while (first < last)

{

int mid = first + (last - first) / 2;

if (x <= a[mid])

last = mid;

else

first = mid + 1;

}

if (a[last] == x)

return last;

else return null;

}

//ускоренный поиск

private static int? FlashSearch(int[] a, int x)

{

int g = Convert.ToInt16(Math.Sqrt(a.Length));//размер блоков массива

int? last1=null;

//границы блоков основного массива

int k=0;

int k1 = g;

int k2 = g * 2;

int k3 = g * 3;

//Ускоренный поиск в справочнике

if (x >= a[k] && x < a[k1])

{

last1 = Binary(a, x, k, k1);

}

if (x >= a[k1] && x < a[k2])

{

last1 = Binary(a, x, k1, k2);

}

if (x >= a[k2] && x < a[k3])

{

last1= Binary(a, x, k2, k3);

}

if (x >= a[k3] && x <= a[a.Length - 1])

{

last1 = Binary(a, x, k3, a.Length);

}

return last1;

}

}

}

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

Вывод

Результатов выполнения данной лабораторной работы стала программа, реализующая поиск в конкретном массиве, состоящем из 16 числовых значений. Были реализованы два алгоритма поиска: двоичные и ускоренный поиск, основанный на едином справочнике.

Соседние файлы в папке АиСД