Научно-исследовательский университет Томский политехнический университет Институт Кибернетики Кафедра ОСУ Структуры и алгоритмы обработки данных ЛАБОРАТОРНАЯ РАБОТА № 5 «Сравнительный анализ алгоритмов поиска » Выполнил студент группы 8В83 А.Н.Ролдугин Проверил асс. каф. ОСУ А.В. Черний Томск 2010 Цель работы Изучение алгоритмов поиска элемента в массиве и закрепление навыков в проведении сравнительного анализа алгоритмов. Задание (15): 1. Изучить алгоритмы поиска: 1) в неупорядоченном массиве: а) линейный; б) быстрый линейный; 2) в упорядоченном массиве: а) быстрый линейный; б) бинарный; 2. Разработать и программно реализовать средство для проведения экспериментов по определению временных характеристик алгоритмов поиска. 3. Провести эксперименты по определению временных характеристик алгоритмов поиска. Результаты экспериментов представить в виде таблиц 4.1 и 4.2. Клетки таблицы 4.1 содержат максимальное количество операций сравнения при выполнении алгоритма поиска, а клетки таблицы 4.2 – среднее число операций сравнения. 4. Построить графики зависимости количества операций сравнения от количества элементов в массиве. 5. Определить аналитическое выражение функции зависимости количества операций сравнения от количества элементов в массиве. 6. Определить порядок функций временной сложности алгоритмов поиска. Листинг алгоритма(Java) /*LS()-линейный поиск QLS()-быстрый линейный поиск QLSL()-быстрый линейный поиск упорядоченного массива BSL()-бинарный поиск упорядоченного массива */ package saod_lab5; import java.util.Random; public class Main { public static void test(int sz) { } int[] m = new int[sz]; int[] m1 = new int[sz + 1]; Random rnd = new Random(); int max, max1, max2, max3; max = max1 = max2 = max3 = 0; int av, av1, av2, av3; av = av1 = av2 = av3 = 0; for (int t = 0; t < sz; t++) { for (int i = 0; i < sz; i++) { m[i] = m1[i] = rnd.nextInt(sz); } int f = rnd.nextInt(sz); int q = QLS(m1, f); if (q > max) { max = q; } av += q; int q1 = LS(m, f); if (q1 > max1) { max1 = q1; } av1 += q1; m1[sz] = 9999999; m1 = sort(m1); m = sort(m); int q2 = QLSL(m1, f); if (q2 > max2) { max2 = q2; } av2 += q2; int q3 = BSL(m, f); if (q3 > max3) { max3 = q3; } av3 += q3; } av /= sz; av1 /= sz; av2 /= sz; av3 /= sz; System.out.println("Max LS" + " (" + sz + ") :" + max1); System.out.println("Max QLS" + " (" + sz + ") :" + max); System.out.println("Max QLSL" + " (" + sz + ") :" + max2); System.out.println("Max BSL" + " (" + sz + ") :" + max3); System.out.println("Average LS" + " (" + sz + ") :" + av1); System.out.println("Average QLS" + " (" + sz + ") :" + av); System.out.println("Average QLSL" + " (" + sz + ") :" + av2); System.out.println("Average BSL" + " (" + sz + ") :" + av3); public static int LS(int s[], int p) { int sz = s.length; int d = 0; for (int i = 0; i < sz; i++) { d++; d++; if (p == s[i]) { break; } } return d; } public static int QLS(int s[], int p) { int sz = s.length; int d = 0; int i = 0; s[sz - 1] = p; while (true) { d++; if (s[i] == s[sz - 1]) { d++; if (i == sz - 1) { break; } break; } i++; } return d; } public static int QLSL(int s[], int p) { int sz = s.length; int d = 0; int i = 0; s[sz - 1] = p; while (true) { d++; if (s[i] == s[sz - 1]) { d++; if (i == sz - 1) { break; } d = i + 1; break; } d++; if (p < s[i]) { break; } i++; } return d; } public static int BSL(int s[], int p) { int sz = s.length; int d = 0; int r = sz - 1; int l = 0; while (r - l > 0) { d++; if (s[(r + l) / 2] == p) { d++; break; } else { d++; if (s[(r + l) / 2] > p) { d++; r = (r + l) / 2; } else { d++; l = (r + l) / 2; } } if (r - l == 1 && s[l] < p && s[r] > p) { d++; break; } if (r - l == 1) { d++; break; } } return d; } public static int[] sort(int s[]) { for (int i = 0; i < s.length; i++) { int sw = 0; for (int j = 0; j < s.length - 1; j++) { if (s[j] > s[j + 1]) { sw++; int q = s[j]; s[j] = s[j + 1]; s[j + 1] = q; } } if (sw == 0) { break; } } return s; } public static void main(String[] args) { test(50); test(100); test(150); test(200); test(250); test(300); test(350); test(400); test(450); } } Output: Max LS (50) :100 Max QLS (50) :52 Max QLSL (50) :102 Max BSL (50) :19 Average LS (50) :66 Average QLS (50) :34 Average QLSL (50) :38 Average BSL (50) :14 Max LS (100) :200 Max QLS (100) :102 Max QLSL (100) :200 Max BSL (100) :22 Average LS (100) :128 Average QLS (100) :65 Average QLSL (100) :67 Average BSL (100) :17 Max LS (150) :300 Max QLS (150) :152 Max QLSL (150) :302 Max BSL (150) :25 Average LS (150) :184 Average QLS (150) :93 Average QLSL (150) :98 Average BSL (150) :18 Max LS (200) :400 Max QLS (200) :202 Max QLSL (200) :388 Max BSL (200) :25 Average LS (200) :256 Average QLS (200) :129 Average QLSL (200) :142 Average BSL (200) :19 Max LS (250) :500 Max QLS (250) :252 Max QLSL (250) :494 Max BSL (250) :25 Average LS (250) :331 Average QLS (250) :167 Average QLSL (250) :169 Average BSL (250) :21 Max LS (300) :600 Max QLS (300) :302 Max QLSL (300) :602 Max BSL (300) :28 Average LS (300) :380 Average QLS (300) :191 Average QLSL (300) :215 Average BSL (300) :21 Max LS (350) :700 Max QLS (350) :352 Max QLSL (350) :702 Max BSL (350) :28 Average LS (350) :437 Average QLS (350) :219 Average QLSL (350) :230 Average BSL (350) :22 Max LS (400) :800 Max QLS (400) :402 Max QLSL (400) :802 Max BSL (400) :28 Average LS (400) :513 Average QLS (400) :257 Average QLSL (400) :263 Average BSL (400) :23 Max LS (450) :900 Max QLS (450) :452 Max QLSL (450) :892 Max BSL (450) :28 Average LS (450) :558 Average QLS (450) :280 Average QLSL (450) :300 Average BSL (450) :23 Результаты работы программы. Максимальное количество операций сравнения Алгоритм поиска 50 Линейный 100 Быстрый линейный Быстрый линейный в упоряд. массиве Бинарный 100 Количество элементов в массиве 150 200 250 300 350 400 450 200 300 400 500 600 700 800 900 52 102 152 202 252 302 352 402 452 102 200 302 388 494 602 702 802 892 22 25 25 25 28 28 28 28 100 Количество элементов в массиве 150 200 250 300 350 400 450 128 184 256 331 380 437 513 558 34 65 93 129 167 191 219 257 280 38 67 98 142 169 215 230 263 300 17 18 19 21 21 22 23 23 19 Среднее количество операций сравнения Алгоритм поиска 50 Линейный 66 Быстрый линейный Быстрый линейный в упоряд. массиве Бинарный 14 Максимальное количество операций сравнения 1000 900 800 700 600 Линйеный 500 Быстрый Линейный 400 Быстрый Упорядоченный 300 Бинарный 200 100 0 50 100 150 200 250 300 350 400 450 Среднее количество операций сравнения 600 500 Линейный 400 Быстрый Линейный 300 Быстрый Упорядоченный 200 Бинарный 100 0 50 100 150 200 250 300 350 400 450 Вывод В ходе исследования алгоритмов поиска, алгоритмы линейного и быстрого поиска упорядоченного массива, по максимальному количеству операции показали примерно одинаковые результаты, так как в линейном поиске при каждом шаге происходит проверка конца массива, а в быстром поиске в сортированном массиве, на каждом шаге проверяется значение, если значение меньше(больше) искомого то дальнейший поиск не имеет смысла, искомого элемента нет в списке. Быстрый линейный поиск показывает среднее значении по всем показателям, так как в этом алгоритме проверяется конец массива только при совпадении значения со значением конца массива. Алгоритм бинарного поиска показывает значительный прирост скорости выполнения алгоритма что показывают и теоретические расчеты O(log2N), не зависимо от размера массива . Средняя скорость выполнения быстрого поиска не зависит от упорядоченности массива, и примерно совпадает при разных размерностях массива.