Olymp1.ppt
- Количество слайдов: 54
Кружок «Олимпиадное программирование» Григорьева Анастасия Викторовна Nastya 001@mail. ru. Мат-мех 2015
Что будет сегодня? p p p Рекурсия Оценка производительности алгоритмов Сортировки Немного об автоматическом тестировании Разнообразные задачи Мат-мех 2015 2
Ликбез Рекурсия Оценка производительности алгоритмов О(n) Мат-мех 2015 3
Рекурсия Чтобы понять рекурсию, надо понять рекурсию p Не забывайте условие выхода из рекурсии p Не забывайте возвращать значения из рекурсивной функции p Какая самая типичная задача для рекурсии? p Мат-мех 2015 4
Типичные задачи на рекурсию n! p Числа Фибоначчи p Ханойские башни p Сортировки p Множество других p Мат-мех 2015 5
Первый пример. Факториал n! n!=1*2*3*. . . *n. С другой стороны, Мат-мех 2015 6
Еще пример Определим функцию K(n), которая возвращает количество цифр в заданном натуральном числе n: Мат-мех 2015 7
Еще один пример Функция C(m, n), где 0 <= m <= n, для вычисления биномиального коэффициента по следующей формуле является рекурсивной: Мат-мех 2015 8
Оценка производительности алгоритмов Для оценки производительности алгоритмов можно использовать разные подходы. Самый бесхитростный - просто запустить каждый алгоритм на нескольких задачах и сравнить время исполнения. Другой способ - оценить время исполнения через символ O(n) Мат-мех 2015 9
Что означает символ O(n) ? Оценки времени исполнения Мат-мех 2015 10
Что означает символ O(n) ? p Если оба алгоритма, например, O ( n*log n ), то это отнюдь не значит, что они одинаково эффективны. p Символ О не учитывает константу, то есть первый может быть, скажем в 1000 раз эффективнее. Это значит лишь то, что время (или требуемая память или что-либо еще, что надо оценить) возрастает приблизительно c такой же скоростью, как функция n*log n p Если в программе одна функция выполняется O(n) раз - например, умножение, а сложение - O(n^2) раз, то общая сложность - O(n^2), так как n^2 возрастает быстрее. Мат-мех 2015 11
Omega и Theta p Кроме символа O() используются также оценки Omega(g(n)) - нижняя оценка: множество f(n): существуют c, n 0>0: c*g(n) <= f(n) Theta(g(n)) - комбинация O() и Omega(): точная оценка асимптотики. Theta(g(n) - множество f(n): существуют c 1, c 2, n 0>0: 0 <= c 1*g(n) <= f(n) <= c 2*g(n), n>=n 0 Мат-мех 2015 12
Сортировки Список Характеристики Выводы Мат-мех 2015 13
Список Рассмотрим наиболее популярные сортировки Мат-мех 2015 14
Какие бывают сортировки p p p p p Поразрядная Быстрая Пирамидальная Слиянием Пузырьком + модификации Вставками Шелла Выбором Топологическая Быстрая с составными ключами Ссылки кликабельны Мат-мех 2015 15
Характеристики Мат-мех 2015 16
Сравнение времени квадратичных сортировок p p p Мат-мех 2015 коричневая линия: сортировка пузырьком; синяя линия: шейкерсортировка; розовая линия: сортировка выбором; желтая линия: сортировка вставками; голубая линия: сортировка вставками со сторожевым элементом; фиолетовая линия: сортировка Шелла 17
Охарактеризуем сортировки по четырем параметрам: 1. Время сортировки 2. Память - дополнительные затраты памяти, зависящие от размера массива. 3. Устойчивость - устойчивая сортировка не меняет взаимного расположения равных элементов. 4. Естественность поведения - эффективность метода при обработке уже отсортированных, или частично отсортированных данных Мат-мех 2015 18
Кроме того, есть два типа основных сортировок p Распределяющая Основана на том, что число возможных значений ключа конечно p Сортировка сравнениями Пользуется лишь возможностью сравнения ключей и их упорядоченностью (Quicksort, Heapsort, Insertsort. . ) Мат-мех 2015 19
Распределяющая сортировка: Для массивов 1. 2. 3. 4. Общее быстродействие O(k(n+s)) [s иногда не учитывают вовсе] Реализация со временным массивом O(n), [Radix Sort] Реализация без временного массива O(logn) [Radix Exchange Sort] Реализация со временным массивом устойчивая, Реализация без временного массива неустойчивая. Hеестественное поведение Мат-мех 2015 20
Распределяющая сортировка: Для списков 1. 2. 3. 4. Общее быстродействие O(k(n+s)) [s иногда не учитывают] Дополнительной памяти не требуется, так как реорганизовывать список можно просто через указатели Устойчивая сортировка Hеестественное поведение Мат-мех 2015 21
Сортировки сравнениями Select. Sort, Bubble. Sort, Shell. Sort p Tree. Sort - сортировка двоичным деревом p Insertsort - простые вставки. p Quicksort - быстрая сортировка p Heapsort - пирамидальная сортировка. p Mergesort - сортировка слиянием p Мат-мех 2015 22
Select. Sort, Bubble. Sort, Shell. Sort на практике не применяются Мат-мех 2015 23
Tree. Sort - сортировка двоичным деревом 1. 2. 3. 4. Общее быстродействие всегда O(nlogn) Обычное дерево: n элементов (ключ + 2 указателя), выбор с замещением: 2 n-1 элементов Устойчивости нет Поведение неестественно. Мат-мех 2015 24
Insertsort - простые вставки 1. 2. 3. 4. Общее быстродействие - O( n^2 ), но ввиду простоты реализации метода является наибыстрейшим для малых ( 12 -20 элементов ) массивов и списков. Сортировка происходит 'на месте', т. е дополнительных затрат памяти нет Устойчивая. Естественное поведение. Мат-мех 2015 25
Quicksort - быстрая сортировка 1. 2. 3. 4. Общее быстродействие Quicksort O( nlogn ) времени. Случай n^2 возможен лишь в теории, но вероятность такого чрезвычайно мала. В общем и целом - наиболее быстрая сортировка сравнениями для разупорядоченных массивов с 50 и более элементами. Итерационный вариант требует logn памяти, рекурсивный - O(n) Устойчивости нет. Поведение неестественно. Уже практически отсортированный массив будет сортироваться столько же, сколько и полностью разупорядоченный. Мат-мех 2015 26
Heapsort - пирамидальная сортировка 1. 2. 3. 4. В 1. 5 раза медленнее быстрой. Общее быстродействие всегда O(nlogn). Сортировка 'на месте' Устойчивости нет. Поведение неестественно. Мат-мех 2015 27
Mergesort - сортировка слиянием 1. 2. 3. 4. Общее быстродействие - Theta(nlogn) Theta(n) Устойчивая. Зависит от конкретной сортировки, основанной на принципе слияния. Hа практике используются реализации с естественным поведением. Мат-мех 2015 28
Выводы Мат-мех 2015 29
Какие на сегодняшний день самые эффективные методы сортировки ? Быстрая сортировка p Распределяющая сортировка p Соpтиpовка слиянием p Мат-мех 2015 30
Какая самая быстрая сортировка ? В общем случае: Малые массивы/списки - менее 20 элементов => Insert. Sort p Большие массивы => Quick. Sort p Длинные списки/файлы => Merge. Sort p Если количество возможных различных ключей ненамного больше их общего числа - то наибыстрейшей будет распределяющая сортировка p Мат-мех 2015 31
Автоматическое тестирование Мат-мех 2015 32
Плюсы Беспристрастность p Ваше решение будет полноценно проверено p Получить «полный балл» престижно p Скорость проверки p Мат-мех 2015 33
Группы тестов Тесты минимальной размерности (тривиальные) p Тесты на частные случаи p На точность вещественных вычислений p Выявляющие особенности использования конкретных систем программирования p Общие тесты (случайные) p Тесты максимальной размерности p Мат-мех 2015 34
Примечание правильное , но неэффективное решение, должно набирать ориентировочно 30 -70% баллов. p Если в условии задачи выделены отдельные подзадачи, то баллы начисляются только тогда, когда все тесты для этой подзадачи успешно завершились p Источник: Кирюхин В. М. Мат-мех 2015 35
Темы задач комбинаторика p сортировка и поиск p обработка последовательностей p перебор вариантов и методы его сокращения p алгоритмы на графах p динамическое программирование p элементы вычислительной геометрии p задачи на технику программирования p задачи на идею p Мат-мех 2015 36
Задачи Мат-мех 2015 37
Лифт Чтобы поднять на N-й этаж M-этажного дома новый холодильник, Витя вызвал бригаду грузчиков. Оплата работы грузчиков производится так: за подъем холодильника на один этаж требуется заплатить 200 рублей, за спуск на один этаж — 100 рублей. За подъем и спуск на лифте плата не взимается. Несмотря на то, что в Витином доме есть лифт, ему возможно все же придется заплатить грузчикам, поскольку лифт останавливается только на каждом K-м этаже, начиная с первого (то есть на этажах с номерами 1, K+1, 2 K+1, 3 K+1, …). Требуется вычислить, какой минимальной суммы денег достаточно, чтобы грузчики доставили холодильник с первого этажа на N-й. Мат-мех 2015 38
Лифт Формат входных данных Во входном файле записаны три числа: M (2≤M≤ 100), N (2≤N≤M) и K (2≤K≤M– 1), разделенные пробелами. Формат выходных данных В выходной файл выведите одно число — минимальную стоимость подъема холодильника. Примеры 20 7 4 20 7 2 a. in 200 0 a. out Мат-мех 2015 39
Лифт. Несколько тестов a. in a. Out 20 7 4 200 20 7 2 0 100 99 0 96 95 2 0 89 35 17 0 100 2 5 200 99 50 89 4000 76 5 54 800 75 2 25 200 Мат-мех 2015 40
Маршрутное такси В час пик на остановку одновременно подъехали три маршрутных такси, следующие по одному маршруту, в которые тут же набились пассажиры. Водители обнаружили, что количество людей в разных маршрутках разное, и решили пересадить часть пассажиров так, чтобы в каждой маршрутке было поровну пассажиров. Требуется определить, какое наименьшее количество пассажиров придется при этом пересадить. Формат входных данных Во входном файле записано три натуральных числа, не превосходящих 100 — количества пассажиров в первой, второй и третьей маршрутках соответственно. Формат выходных данных В выходной файл выведите одно число — наименьшее количество пассажиров, которое требуется пересадить. Если это невозможно, выведите слово IMPOSSIBLE (заглавными буквами) Мат-мех 2015 41
Маршрутное такси. Несколько тестов b. in b. out 1 2 3 1 99 100 IMPOSSIBLE 1 1 1 0 100 100 0 5 7 6 1 6 9 9 2 9 6 6 2 64 56 89 IMPOSSIBLE 88 99 76 IMPOSSIBLE Мат-мех 2015 42
Такси После затянувшегося совещания директор фирмы решил заказать такси, чтобы развезти сотрудников по домам. Он заказал N машин — ровно столько, сколь у него сотрудников. Однако когда они подъехали, оказалось, что у каждого водителя такси свой тариф за 1 километр. Директор знает, какому сотруднику сколько километров от работы до дома (к сожалению, все сотрудники живут в разных направлениях, поэтому нельзя отправить двух сотрудников на одной машине). Теперь директор хочет определить, какой из сотрудников на каком такси должен поехать домой, чтобы суммарные затраты на такси (а их несет фирма) были минимальны. Формат входных данных Сначала во входном файле записано натуральное число N (1≤N≤ 1000) — количество сотрудников компании (совпадающее с количеством вызванных машин такси). Далее записано N чисел, задающих расстояния в километрах от работы до домов сотрудников компании (первое число — для первого сотрудника, второе — для второго и т. д. ). Все расстояния — положительные целые числа, не превышающие 1000. Далее записано еще N чисел — тарифы за проезд одного километра в такси (первое число — в первой машине такси, второе — во второй и т. д. ). Тарифы выражаются положительными целыми числами, не превышающими 10000. Формат выходных данных В выходной файл выведите N чисел. Первое число — номер такси, в которое должен сесть первый сотрудник, второе число — номер такси, в которое должен сесть второй и т. д. , чтобы суммарные Мат-мех 2015 43 затраты на такси были минимальны. Если вариантов рассадки сотрудников, при которых затраты минимальны, несколько, выведите любой из них.
Такси d. in d. out 3 10 20 30 50 20 30 1 3 2 5 10 20 1 30 30 3 3 3 2 3 5 1 3 2 4 3 1 2 3 3 2 1 5 5 4 3 2 1 1 2 3 4 5 6 999 1000 999 999 10000 9999 10000 5 1 7 3 2 4 6 Мат-мех 2015 44
Такси d. in d. out 1000 634 86 852 731 178 951 13 865 347 919 981 675 792 621 574 648 636 989 511 723 834 585 738 519 726 585 794 950 608 849 782 259 121 956 527 666 404 656 799 363 16 118 507 532 531 854 634 807 974 573 978 763 750 665 631 633 265 516 655 461 196 550 867 126 180 12 67 820 890 607 844 638 688 718 510 585 830 668 957 539 557 861 910 798 723 243 252 916 673 3 325 676 788 199 721 525 572 388 553 730 509 803 669 587 621 693 622 545 619 664 796 960 906 183 517 431 26 744 528 640 123 897 603 44 105 845 938 630 864 522 630 594 577 739 524 750 913 911 854 907 969 524 647 764 546 606 182 55 874 284 155 808 251 193 862 917 656 790 674 930 525 821 883 828 921 531 663 719 390 274 754 51 588 708 337 911 308 946 968 510 940 915 811 848 591 649 703 696 816 825 887 809 955 772 721 791 551 320 367 300 976 639 469 998 322 733 971 677 434 100 793 882 599 796 682 846 514 800 747 515 576 503 890 729 921 279 886 597 537 574 841 790 161 519 571 31 586 905 637 912 745 717 775 876 801 644 569 608 840 715 521 983 768 382 967 361 376 483 624 877 381 97 152 892 709 301 680 819 942 915 843 961 512 973 796 877 529 851 552 766 206 952 238 962 369 406 137 593 436 358 498 616 141 660 780 715 972 861 708 905 588 679 623 909 709 820 831 937 993 580 282 935 227 766 526 502 715 891 482 838 129 700 947 578 829 687 694 790 992 819 826 745 729 688 725 568 278 81 433 994 761 171 889 42 944 19 93 184 737 979 176 517 760 831 644 806 733 960 664 577 870 537 890 551 710 855 658 615 7 319 245 456 219 773 948 132 729 292 975 876 886 558 779 845 984 959 902 517 619 954 526 702 544 455 131 33 413 836 671 661 335 304 581 507 954 54 530 542 522 567 813 725 867 758 627 550 510 759 607 961 958 929 859 825 645 769 804 685 856 538 352 831 332 863 829 899 920 910 720 940 916 982 720 635 519 679 515 943 612 497 299 762 705 168 630 75 69 930 620 60 691 922 419 692 875 781 628 619 826 505 736 567 711 803 665 609 919 602 15 983 734 901 216 226 441 828 753 674 103 712 331 418 823 560 508 774 911 986 906 787 551 911 634 916 953 806 848 248 722 6 362 861 521 832 839 415 651 501 781 876 787 546 636 538 620 919 947 846 537 687 885 729 689 564 847 552 720 140 9 949 240 148 543 62 824 336 10 386 810 733 515 740 915 692 906 553 735 557 825 630 545 727 751 351 881 149 359 785 40 29 324 328 652 532 791 978 585 921 644 733 792 921 513 926 768 870 552 718 986 925 650 843 107 945 566 813 172 966 68 30 991 755 953 590 689 657 772 704 919 822 752 833 575 735 542 948 697 815 819 472 56 738 111 310 506 485 653 555 992 59 106 427 96 880 645 621 552 516 774 740 827 553 726 541 516 589 615 610 387 873 311 46 567 903 925 679 156 379 814 173 583 501 574 750 886 553 638 604 517 607 650 935 856 924 790 536 801 904 253 235 370 837 862 146 112 211 817 225 264 614 706 585 626 867 601 899 895 951 872 551 882 908 918 47 459 356 4 277 884 637 957 127 974 79 194 163 378 662 905 805 761 965 832 869 958 776 671 612 725 587 687 508 449 504 756 104 936 447 973 802 303 595 142 229 534 858 Мат-мех 2015 45 756 766 893 555 980 796 845 569 701 674 775 990 643 689 943 423 657 11 124 698 36 918 1 770 41 89 592 21 491 92 585 728 725 888 657 757 815 781 608 677 621 590 943 999 151 45 520 842 876 256 604 426 37 909 810 190 623 576 602 667 898 600 723 622 690 528 541 781 587 707 688 715 421 663 704 377 192 411 739 115 996 860 693 697 195 584
Переливания Есть три сосуда с водой. В одном из них A миллилитров воды, в другом — B миллилитров, в третьем — C. Разрешается следующая операция. Можно перелить воду из одного сосуда в другой так, чтобы в том сосуде, в который мы переливаем, количество воды после переливания было в два раза больше, чем до переливания. То есть, если до переливания в сосудах было A, B и C миллилитров соответственно, и мы переливаем, например, из второго сосуда в третий, то после переливания в сосудах должно оказаться A, B–C, 2 С миллилитров соответственно (такое переливание можно делать только при условии, когда B≥C). Эту операцию можно повторять не более 10000 раз. Напишите программу, которая определит, можем ли мы в результате освободить один из сосудов. Формат входных данных Во входном файле записаны неотрицательные целые числа A, B, C — количество воды в каждом из сосудов изначально. Числа A, B, C не превышают 1018. Формат выходных данных Если освободить один из сосудов можно, то выведите сначала количество операций, которое для этого понадобится, а дальше — сами операции. Каждая операция описывается двумя числами — номером сосуда, из которого мы переливаем, и номером сосуда, куда переливаем. Минимизировать количество операций переливания не требуется, но их количество не должно превышать 10000. Если освободить сосуд невозможно (или на это требуется больше 10000 операций), выведите в выходной файл одно число – 1 (минус один). Мат-мех 2015 46
Переливания l. in l. out 1 2 10 2 3 1 2 1 0 0 17 15 18 5 1 2 3 1 2 1 3 1 113125531 156312572 243797100 605 2 1 1 2 3 2 Мат-мех 2015 1 2 47
Описания и исходники …некоторых сортировок Мат-мех 2015 48
Сортировка выбором Мат-мех 2015 49
Сортировка пузырьком(Bubble. Sort) Мат-мех 2015 50
Сортировка пузырьком(Bubble. Sort) Мат-мех 2015 51
Сортировка простыми вставками Мат-мех 2015 52
Quick. Sort (быстрая сортировка) Основной алгоритм Выберем случайным образом какой-то элемент х и просмотрим массив, двигаясь слева направо, пока не найдем аi больший x, а затем справа налево, пока не найдем аi меньший х. Поменяем их местами и продолжим процесс просмотра с обменом, пока просмотры не встретятся где-то в середине массива. В результате массив разделится на две части: левую - с ключами, меньшими х и правую - с ключами, большими х. Этот шаг называется разделением. Х - центром. К получившимся частям рекурсивно применяем ту же процедуру. В результате получается очень эффективная сортировка. Среднее быстродействие O(nlogn), но возможен случай таких входных данных, на которых алгоритм будет работать за O(n^2) операций. Мат-мех 2015 53
Литература p p http: //algolist. ru/olimp/sor_prb. php «Московские олимпиады по информатике 2002 -2009» Е. В. Андреевой, В. М. Гуровица, В. А. Матюхина, Москва, 2009 «Методика проведения и подготовки к участию в олимпиадах по информатике» В. М. Кирюхин, Москва, 2011 https: //sites. google. com/site/kssmoks/home/plan-praktikuma -po-kursu-algoritmy-i-struktury-dannyh/rekursia Мат-мех 2015 54


