Продолжение тема 3. Одномерные массивы в языке C#. Сортировка и... данных Лекция 11. СОРТИРОВКА ЭЛЕМЕНТОВ МАССИВА

advertisement
Продолжение тема 3. Одномерные массивы в языке C#. Сортировка и поиск
данных
Лекция 11. СОРТИРОВКА ЭЛЕМЕНТОВ МАССИВА
11.1 Алгоритмы и массивы
Существует множество задач, в которых представление данных в виде
массива существенно упрощает их решение. Некоторые задачи Вам известны
из курса «Высшая математика», например, вычисление полинома.
Полиномом n-й степени
называют функцию:
где значения
называются коэффициентами полинома и могут быть
представлены одномерным массивом с n+1 элементами.
Зная массив коэффициентов полинома
, можно вычислить
значение полинома в любой точке x. Обычно задача вычисления полинома в
точке x связана с реализацией некоторых алгоритмов, например, алгоритма
Горнера, метода деления отрезка пополам (если на концах отрезка значение
полинома имеет различные знаки), метод итерации, метод Ньютона,
Лагранжа и т.д. Все эти алгоритмы, так или иначе, связаны с обработкой
массива коэффициентов полинома.
В информатике существуют свои задачи, которые требуют
представления данных в виде массивов. Для этих данных применимы свои
алгоритмы их обработки. Среди множества алгоритмов обработки данных
выделяются алгоритмы сортировки (упорядочения данных по некоторому
признаку) и алгоритмы поиска (алгоритмы определения наличия в данных
элемента с заданными признаками).
Алгоритмы (методы) решения математических задач рассматриваются в
курсе «Высшая математика», поэтому в следующих лекциях будут
рассмотрены некоторые алгоритмы сортировки и поиска данных.
11.2 Сортировка элементов массива
Сортировкой элементов массива называется упорядочение массива по
некоторому признаку его элементов, например, в порядке возрастания или
убывания значений его элементов, если элементами массива являются
переменные целого или вещественного типов. Другим примером
упорядочения массива является расположение его элементов в алфавитном
порядке, если элементами массива являются строковые переменные. В
зависимости от типа элементов массива и признака упорядочения может
существовать множество различных алгоритмов сортировки.
Существует более ста различных алгоритмов сортировок элементов.
Автор семи томов книг «Искусство программирования для ЭВМ» Д.Кнут в
главе «сортировка» на 460 страницах рассматривает только основные
алгоритмы. Мы рассмотрим алгоритмы и программную реализацию только
двух методов сортировок элементов массива: «метод выбора» и
«пузырьковый» метод сортировки.
11.3 Алгоритм сортировки методом выбора
Алгоритм сортировки элементов массива в порядке убывания значений
его элементов методом выбора предполагает выполнения следующих шагов.
Берем первый элемент массива и его значение начинаем поочередно
сравнивать со значениями всех остальных элементов массива (от 2 и до
последнего элемента). Если встретится элемент с большим значением, то он
меняется местами с первым элементом. В результате первого просмотра
массива первый элемент получит максимальное значение.
Затем берем второй элемент и его значение поочередно сравниваем со
значениями остальных элементов массива (от 3 до последнего элемента). В
результате второго просмотра массива мы получим значение второго
элемента отсортированного массива.
И т.д. до предпоследнего элемента массива, который будет сравниваться
только с последним элементом массива.
Полученный массив будет отсортирован в порядке убывания значений
его элементов.
Если количество элементов массива равно N, то количество операций
сравнения (К.О.), выполняемых в данном алгоритме, определяется
следующим образом:
К.О. = (N-1)+(N-2)+(N-3)+ . . . + 2 +1=N*(N-1)/2.
Данное выражение характеризует вычислительную эффективность
алгоритма, которая определяет количество (иногда достаточно порядка)
операций выполняемых в алгоритме.
Рассмотрим программную реализацию данного алгоритма для массива
переменных целого типа.
Задача 11.1 Сформировать массив a из 11 случайных целых чисел в
диапазоне от минус 50 до 50. Напечатать его. Выполнить сортировку
элементов массива в убывающем порядке и напечатать новый массив.
Программная реализация алгоритма сортировки элементов массива в
порядке убывания методом выбора имеет следующий вид:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int i,j,b;
int[] a = new int[11];
Random rnd = new Random();
// формирование и печать массива
Console.Write("Массив до сортировки:
for (i = 0; i <= 10; i++)
{
a[i] = rnd.Next()%101 - 50;
Console.Write(" {0}", a[i]);
}
Console.WriteLine();
");
// сортировка элементов массива методом выбора
for (i = 0; i <= 9; i++)
for (j = i + 1; j <= 10; j++)
if (a[i] < a[j])
{ b = a[i]; a[i] = a[j]; a[j] = b; }
// печать массива после сортировки
Console.Write("Массив после сортировки: ");
for (i=0; i<=10; i++)
Console.Write(" {0}", a[i]);
Console.WriteLine();
Console.ReadLine();
}
}
}
Работа программы:
Массив до сортировки: -15 -24 -28 46 -38 22 -27 -49 -43 22 -27
Массив после сортировки: 46 22 22 -15 -24 -27 -27 -28 -38 -43 -49
11.4 Алгоритм с «пузырьковым» методом сортировки
Алгоритм с «пузырьковым» методом сортировки элементов массива по
возрастанию предполагает выполнения следующих шагов.
Первый элемент массива сравниваем со вторым и если значение первого
больше, то они меняются местами. Затем второй элемент массива сравниваем
с третьим и если значение второго больше, то они меняются местами и т.д. В
результате первого «просмотра» массива элемент с наибольшим значением
будет записан на последнее место в массиве.
Опять берем первый элемент массива и сравниваем его со вторым
элементом – весь процесс повторяем до предпоследнего элемента массива –
формируем его значение.
И т.д. до последней операции сравнения, которая будет выполняться
только между первым и вторым элементами массива.
Полученный массив будет отсортирован в порядке возрастания значений
его элементов.
Значение вычислительной эффективности алгоритма с «пузырьковым»
методом сортировки совпадает со значением вычислительной эффективности
алгоритма методом выбора.
В качестве примера рассмотрим решение предыдущей задачи 11.1.
Рассмотрим программную реализацию алгоритма «пузырьковой»
сортировки элементов массива в порядке убывания.
Исходный код программы:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int i,j,b;
int[] a = new int[11];
Random rnd = new Random();
// формирование и печать массива
Console.Write("Массив до сортировки:
for (i = 0; i <= 10; i++)
{
a[i] = rnd.Next()%101 - 50;
Console.Write(" {0}", a[i]);
}
Console.WriteLine();
");
// сортировка элементов массива «пузырьковым» методом
for (i=0; i<=9; i++)
for (j=0; j<=9-i; j++)
if (a[j]<a[j+1])
{ b=a[j];a[j]=a[j+1];a[j+1]=b;}
// печать массива после сортировки
Console.Write("Массив после сортировки: ");
for (i=0; i<=10; i++)
Console.Write(" {0}", a[i]);
Console.WriteLine();
Console.ReadLine();
}
}
}
Работа программы:
Массив до сортировки: -40 45 -29 30 11 -8 -26 -37 9 23 -41
Массив после сортировки: 45 30 23 11 9 -8 -26 -29 -37 -40 -41
Естественно каждый из рассмотренных алгоритмов может быть
использован для сортировки элементов массива, как по возрастанию, так и
убыванию значений элементов.
Если у Вас возникло желание познакомиться с другими алгоритмами
сортировки,
то
рекомендуем
обратиться
к
книге
«Искусство
программирования для ЭВМ» Д.Кнут, том 3, посвященной вопросам
«сортировки и поиска» общим объемом 843 страницы.
11.5 Вопросы для проверки
11.5.1 Что делает следующей фрагмент программы:
for (I = 0; I < 10; I++)
for (j = I + 1; j <= 10; j++)
if (a[I] > a[j])
{b = a[I]; a[I] = a[j]; a[I] = b;} ?
A) Выполняет сортировку элементов массива в порядке их убывания.
B) Выполняет сортировку элементов массива в порядке их возрастания.
C) Это не сортировка.
D) Это сортировка элементов массива Пузырьковым методом.
E) Это перестановка четных и нечетных элементов массива.
11.5.2 Что делает следующей фрагмент программы:
for (i = 0; I <= 9; i++)
for (j = 0; j <= 9 - i; j++)
if (a[j] < a[j+1])
{ b=a[j]; a[j]=a[j+1]; a[j+1]=b;}?
A) Выполняет сортировку элементов массива в порядке их убывания.
B) Выполняет сортировку элементов массива в порядке их возрастания.
C) Это не сортировка.
D) Это сортировка элементов массива Пузырьковым методом.
E) Это перестановка четных и нечетных элементов массива.
11.5.3 Понятие сортировки элементов массива.
11.5.4 Что определяет вычислительную эффективность алгоритма?
11.5.5 Какую вычислительную эффективность имеет алгоритм сортировки
методом «выбора»?
Продолжение тема 3. Одномерные массивы в языке C#. Сортировка и поиск
данных
Лекция 12. ПОИСК ЭЛЕМЕНТОВ В МАССИВЕ
12.1 Некоторые понятия из теории поиска
Половину книги «Искусство программирования для ЭВМ» Д.Кнут, 3
том, «сортировки и поиска» посвятил вопросам поиска элементов по их
значению в некотором множестве (массиве, файле и т.д.) однотипных
элементов. Это показывает, насколько важным является знание алгоритмов
поиска при изучении программирования.
Из всего многообразия методов поиска рассмотрим алгоритмы и
программную
реализацию
только
трех
основных
–
методы
последовательного, блочного и двоичного поиск элемента в массиве по его
значению. Метод поиска хешированием рассмотрим только на уровне
алгоритма.
Так как нас интересуют алгоритмы поиска, а не содержательная сторона
элементов массива, то будем рассматривать все алгоритмы для элементов,
состоящих только из целых чисел. Т.е. мы будем задавать целое число –
«искомый ключ», которое будем искать в «поисковом массиве» – массиве
целых чисел, сформированных случайным образом.
12.2 Алгоритм последовательного поиска
Алгоритм
последовательного
поиска
элемента
(алгоритм
последовательного сканирования), основан на последовательном сравнении
искомого ключа со всеми элементами поискового массива от первого
элемента, до последнего элемента. Поиск заканчивается, если просмотрен
последний элемент массива.
Для демонстрации этого алгоритма иногда его сравнивают с алгоритмом
поиска нужной страницы книги, например, трехсотой, путем
последовательного перелистывания каждой страницы от первой до
трехсотой.
Недостатком этого алгоритма является значительное время поиска при
большом числе элементов поискового массива. Можно утверждать, что
время поиска пропорционально числу N, где N число элементов массива.
Достоинством алгоритма является то, что он допускает любой порядок
или беспорядок размещения элементов в поисковом массиве.
Задача 12.1 Поисковый массив представлен 20 случайными целыми
числами от 0 до 99. В режиме диалога задается искомый ключ – любое целое
число. Необходимо определить сколько раз (и с какими индексами) это число
представлено
в
поисковом
массиве.
Использовать
алгоритм
последовательного поиска.
Алгоритм известен, поэтому приступаем к разработке исходного кода
программы.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int i,k,n;
int[] a = new int[20];
int[] p = new int[20];
Random rnd = new Random();
string buf;
// формирование и печать массива
Console.WriteLine("Массив поиска: ");
for (i=0;i<10;i++)
Console.Write(" {0}", i);
for (i=10;i<20;i++)
Console.Write(" {0}", i);
Console.WriteLine();
for (i = 0; i < 20; i++)
{
a[i] = rnd.Next()%100;
if (a[i]>9) Console.Write(" {0}", a[i]);
else Console.Write(" {0}", a[i]);
}
Console.WriteLine();
Console.WriteLine("Введите ключ поиска");
buf = Console.ReadLine();
k = Convert.ToInt32(buf);
n=0;
// Поиск элементов массива, соответствующих ключу поиска.
for (i=0;i<20;i++)
if (k == a[i]) {p[n]=i; n++;}
if (n==0)
Console.WriteLine("Элемента, соответствующего
ключу поиска нет!!");
else
{
Console.WriteLine("Количество элементов,
соответствующих ключу поиска = {0}",n);
Console.WriteLine("Найденные индексы: ");
for (i=0;i<n;i++)
Console.Write(" {0}",p[i]);
Console.WriteLine();
}
Console.ReadLine();
}
}
}
Работа программы:
Массив поиска:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
88 19 73 50 91 73 39 63 9 8 32 65 91 38 97 99 17 47 76 44
Введите ключ поиска
91
Количество элементов, соответствующих ключу поиска = 2
Найденные индексы:
4 12
12.2 Алгоритм блочного поиска
Алгоритм блочного поиска требует располагать элементы поискового
массива в упорядоченном порядке, например, по возрастанию или убыванию
ключевого элемента, в алфавитном порядке и т.д. Поиск возможен только по
ключевому элементу поискового массива, т.е. по которому упорядочен
поисковый массив.
Предположим, что элементы поискового массива расположены в
порядке возрастания его элементов.
Весь поисковый массив условно разбивается на блоки, например, по сто
элементов в блоке. Искомый ключ запроса, последовательно, начиная с
первого блока, сравнивается с последними элементами каждого блока. Если
искомый ключ запроса больше очередного последнего элемента блока
поискового массива, то необходимо переходить на последний элемент
следующего блока, иначе в блоке, где выполнялось последнее сравнение
необходимо выполнить последовательный поиск.
Исходный код программы, реализующий данный алгоритм для ста
целых чисел, сформированных случайным образом в диапазоне от 0 до 99,
имеет следующий вид:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int i,j,b,k,n,f,m;
int[] a = new int[101];
int[] p = new int[21];
Random rnd = new Random();
string buf;
f = 0; m = 0;
// формирование и печать поискового массива
Console.WriteLine("Массив поиска: ");
for (i = 0; i < 100; i++)
{
a[i] = rnd.Next() % 100;
if (a[i] < 10) Console.Write(" {0}", a[i]);
else Console.Write(" {0}", a[i]);
if ((i + 1) % 20 == 0) Console.WriteLine();
}
Console.WriteLine();
//Сортировка поискового массива
for (i=0;i<99;i++)
for (j=i+1;j<100;j++)
if (a[i]>a[j])
{b=a[i];a[i]=a[j];a[j]=b;}
Console.WriteLine("Поисковый массив после сортировки
чисел:");
for (i = 0; i < 100; i++)
{
if (a[i] < 10) Console.Write(" {0}", a[i]);
else Console.Write(" {0}", a[i]);
if ((i + 1) % 20 == 0) Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("Введите ключ поиска");
buf = Console.ReadLine();
k = Convert.ToInt32(buf);
Console.WriteLine("Введите размер блока");
buf = Console.ReadLine();
b = Convert.ToInt32(buf);
//Реализация алгоритма блочного поиска
for (i=b-1;i<100;i=i+b)
if(k<=a[i])
{
j=i-b+1;n=i;
while (j<=n || k==a[j])
{
if (k==a[j])
{
f=1;i=100;
Console.WriteLine("Смотрите номер:{0}", j);
}
j++;
}
}
if (f==0)
Console.Write("Элемента, соответствующего ключу
поиска нет!");
Console.ReadLine();
}
}
}
Работа программы:
Массив поиска:
88 69 48 79 90 91 14 88 32 59 42 38 36 72 10 4 74 42 65 53
21 82 66 40 90 92 52 32 67 42 62 83 35 46 12 22 84 74 65 68
65 40 81 14 62 93 31 46 35 60 63 16 90 26 9 53 50 8 89 98
86 29 68 37 44 6 50 37 7 35 20 47 24 97 35 28 1 52 25 97
61 53 44 54 26 93 40 9 37 59 72 76 85 67 29 83 19 44 17 3
Поисковый массив после сортировки чисел:
1 3 4 6 7 8 9 9 10 12 14 14 16 17 19 20 21 22 24 25
26 26 28 29 29 31 32 32 35 35 35 35 36 37 37 37 38 40 40 40
42 42 42 44 44 44 46 46 47 48 50 50 52 52 53 53 53 54 59 59
60 61 62 62 63 65 65 65 66 67 67 68 68 69 72 72 74 74 76 79
81 82 83 83 84 85 86 88 88 89 90 90 90 91 92 93 93 97 97 98
Введите ключ поиска
44
Введите размер блока
20
Смотрите номер:43
Смотрите номер:44
Смотрите номер:45
Достоинством данного алгоритма поиска является меньшее время
поиска по сравнению с предыдущим алгоритмом. Время поиска
пропорционально сумме блоков поискового массива и количества элементов
в одном блоке. Изменяя размер блока можно в некоторых пределах
регулировать скорость поиска.
Недостатками алгоритма является еще большое время поиска и то, что
поисковый массив необходимо готовить – сортировать по ключевому
элементу.
12.3 Алгоритм двоичного поиска
Алгоритм двоичного поиска также требует располагать элементы
поискового массива в упорядоченном порядке. Предположим, что элементы
поискового массива расположены в порядке возрастания его элементов.
Искомый ключ запроса первоначально сравнивается со средним элементом
поискового массива.
Если искомый ключ запроса меньше среднего элемента поискового
массива, то все элементы, начиная от среднего и до конца поискового
массива, исключаются из дальнейшего поиска, а поисковым массивом
считаются элементы от первого до среднего.
Если искомый ключ запроса больше среднего элемента поискового
массива, то все элементы, начиная от первого и до среднего элемента
поискового массива, исключаются из дальнейшего поиска, а поисковым
массивом считается элементы от следующего за средним и до последнего.
Таким образом, после операции сравнения половина поискового массива
исключается из дальнейшего поиска, поэтому этот алгоритм часто называют
метод половинного деления.
Далее процесс повторяется с новым поисковым массивом. Поиск
заканчивается, если найден элемент, соответствующий запросу, или
поисковый массив будет представлен одним несовпадающим с запросом
элементом.
Исходный код программы, реализующий алгоритм двоичного поиска для
60 целых чисел, сформированных случайным образом в возрастающем
порядке, имеет следующий вид:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int i, n, k, x, f, m, c, p;
f = 0; m = 0; c = 0;
int[] a = new int[61];
Random rnd = new Random();
string buf;
// формирование и печать поискового массива
Console.WriteLine("Массив поиска: ");
a[0] = rnd.Next() % 2 + 1;
for (i = 1; i < 60; i++)
{
a[i] = a[i - 1] + rnd.Next() % 2 + 1;
if (a[i-1] < 10) Console.Write(" {0}", a[i-1]);
else Console.Write(" {0}", a[i-1]);
if ((i) % 20 == 0) Console.WriteLine();
}
if (a[i-1] < 10) Console.Write(" {0}", a[i-1]);
else Console.Write(" {0}", a[i-1]);
Console.WriteLine();
Console.WriteLine("Введите ключ поиска");
buf = Console.ReadLine();
p = Convert.ToInt32(buf);
//Реализация алгоритма двоичного поиска
n = 0; k = 59;
while (n <= k)
{
x = (n + k) / 2;
if (p == a[x]) { f = 1; m = x; n = k + 10; }
if (p <= a[x]) k = x - 1; else n = x + 1;
c++;
}
//Вывод результата поиска
if (f == 0)
Console.Write("Элемента, соответствующего ключу
поиска нет!");
else Console.WriteLine("Смотрите номер:{0}", m+1);
Console.ReadLine();
}
}
}
Работа программы запуск 1:
Массив поиска:
1 2 3 5 6 7 9 11 13 14 16 18 20 21 22 24 26 27 29 30
32 34 36 37 39 40 42 43 45 46 48 49 50 51 52 54 56 58 60 62
64 66 67 69 71 72 74 75 77 78 80 82 83 84 85 87 88 90 92 94
Введите ключ поиска
67
Смотрите номер:43
Работа программы запуск 2:
Массив поиска:
1 2 4 5 6 8 9 11 12 14 15 16 17 18 19 21 23 25 27 29
30 32 33 35 36 38 39 40 42 44 45 47 49 50 51 52 53 54 56 58
60 62 64 65 66 67 69 70 72 73 75 76 77 78 80 81 83 85 87 88
Введите ключ поиска
24
Элемента, соответствующего ключу поиска нет!
Достоинством рассмотренного алгоритма является небольшое время
поиска по сравнению с ранее рассмотренными алгоритмами. Время поиска
пропорционально двоичному логарифму от числа элементов поискового
массива. Если поисковый массив насчитывает 1000 элементов, то максимум
за 10 операций сравнения будет получен результат поиска. Для поискового
массива в 65000 элементов понадобятся всего 16 операций сравнения.
Преимущество этого алгоритма особенно заметно при большом числе
элементов поискового массива.
Недостатком алгоритма является требование упорядочения массива.
Алгоритм необходимо «дорабатывать», если в поисковом массиве могут
находиться одинаковые элементы, например, фамилии служащих или
названия товаров.
12.4 Алгоритмы поиска с преобразованием ключа в адрес –
хеширование.
Идеальным способом организации данных, с точки зрения выполнения
поисковых операций, является организация данных в виде массивов, а ключ
поиска - значение индекса. В этом случае для нахождения нужного элемента
достаточно одного обращения к массиву данных.
Естественно в «чистом» виде такие системы встречаются довольно
редко. Обычно это небольшие системы, например, по номеру студента или
коду преподавателя можно найти их записи.
Чаще для получения значения индекса массива данных над ключами
необходимо выполнять некоторые преобразования с помощью специальной
хеш-функции (HF).
Хеш-функция преобразует ключ искомого элемента в числовое значение
(индекс) в диапазоне от 0 до n-1. Естественно необходим массив на n ячеек
(хеш-таблица) для хранения значений элементов.
Если количество возможных ключей меньше или равно n, то система
преобразуется в систему с ключиком эквивалентным адресу.
Если количество возможных ключей больше (много больше) n, то
необходимо использовать хеш-функцию, обеспечивающую равномерное
«рассеивание» ключей в диапазоне от 0 до n-1.
Естественно возможны ситуации, когда разные ключи получат
одинаковые индексы, так как хеш-функция работает по принципу «многие к
одному».
Такие ситуации называются коллизиями.
Существуют
различные
методы
организации
хеш-функций,
позволяющие ограничить количество возможных коллизий на заданном
значении.
При разработке хеш-функций часто используется метод деления,
который на первом этапе преобразует ключ в целое число, а затем (обычно с
помощью функции нахождения остатка) это число включается в диапазон от
0 до n-1.
Один из наиболее распространенных алгоритмов получения числового
значения для строковых ключей основан на добавлении каждого байта
строки к произведению предыдущего значения на некий фиксированный
множитель (хэш). Экспериментально установлено, что значения 31 и 37
являются оптимальными множителями в хэш-функции для строк ASCII.
Необходимо отметить, что хорошо «работающая» хеш-функция для одного
вида данных может «плохо» работать для другого вида. Например, очень
трудно использовать хеш-функцию для ключей связанных с годами
рождений группа людей (например, студентов).
Одним из вариантов устранения коллизий является использование
списочных структур для каждой ячейки хеш-таблицы. Использование хештаблиц и простых списков многие авторы считают величайших изобретений
информатики.
Например, при создании справочной системы «автомобили» можно
использовать хеш-функцию по цифровой части номера автомобиля.
Автомобили с совпадающими цифровыми частями номера (отличаются
буквенной частью) организовать в простой список.
В такой системе поиск будет выполняться в два этапа: на первом этапе
поиск по цифровой части номера с помощью хеш-функции, а на втором этапе
последовательный поиск в существующем простом списке.
12.5 Вопросы для проверки
12.5.1 Алгоритм блочного поиска элементов в массиве.
A) все элементы массива условно разбиваются на блоки по N записей.
Поиск выполняется последовательно в каждом блоке;
B) все элементы массива условно разбиваются на блоки по N записей.
Поиск выполняется от первой до последней записи массива;
C) все элементы массива условно разбиваются на блоки по N записей.
Поиск выполняется по последним записям каждого блока. Если
искомая запись меньше очередной последней записи блока, то
последовательный поиск осуществляется только в этом блоке;
D) все элементы массива условно разбиваются на блоки по N записей.
Поиск выполняется по первым записям каждого блока. Если искомая
запись больше очередной первой записи блока, то последовательный
поиск осуществляется в следующем блоке;
E) все элементы массива условно разбиваются на блоки по N записей.
Поиск выполняется последовательно с последнего блока.
12.5.2 Какой алгоритм поиска имеет наибольшее среднее время поиска?
A) Алгоритм блочного поиска.
B) Алгоритм последовательного поиска.
C) Алгоритм поиска хешированием.
D) Алгоритм двоичного поиска
E) Алгоритм индексно-последовательного поиска
12.5.3 Что представляет собой «ключ» поискового массива?
12.5.4 Назначение Хеш-функции?
12.5.5 Какой вариант устранения коллизий чаше других применяется при
хешировании?
Download