АиСД / АиСД
.DOCXМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
НАБЕРЕЖНОЧЕЛНИНСКИЙ ИНСТИТУТ (ФИЛИАЛ)
КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ
ЛАБОРАТОРНАЯ РАБОТА № 4
«Поиск»
По дисциплине
«Алгоритмы и структуры данных»
Выполнил:
Студент группы 2161121
Золотых С.В.
Проверил:
Каримов Т.Н.
Набережные Челны
2018
Цель
Приобретение навыков реализации алгоритмов программного поиска в информационных массивах.
Задание
Написать программу, реализующую один из алгоритмов программного поиска данных в информационном массиве, расположенном в оперативной памяти (по желанию, можно считывать данные из файла):
-
Двоичный поиск;
-
Ускоренный поиск, основанный на использовании единого справочника.
Листинг программы
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 числовых значений. Были реализованы два алгоритма поиска: двоичные и ускоренный поиск, основанный на едином справочнике.