2011-gre-cs-practice-book.pdf/Q35 — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
(Новая страница: « == Вопрос: Q35-08c765 == <i>Тут вставьте перевод вопроса. Используйте [https://wiki.4intra.net/Help:%D0%A4%D0%BE%D1%80…»)
 
 
(не показаны 3 промежуточные версии 1 участника)
Строка 1: Строка 1:
 
 
== Вопрос: Q35-08c765 ==
 
== Вопрос: Q35-08c765 ==
  
<i>Тут вставьте перевод вопроса.
+
Рассмотрим следующий алгоритм, сортирующий массив из n ≥ 2 целых чисел:
Используйте [https://wiki.4intra.net/Help:%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 возможности разметки],  
+
# Если в массиве всего 2 элемента, сравнить их и поменять местами если они в неправильном порядке
включая формулы и т.п, если будут графы — посмотрите как задать их текстом https://wiki.4intra.net/Graphviz .
+
# Иначе, делать следующие шаги по порядку:
Если код — теги «code-pascal», «code-c» или «code-python».
+
## Рекурсивно отсортировать первые n-1 элементов массива
 +
## Рекурсивно отсортировать последние n-1 элементов массива
 +
## Рекурсивно отсортировать первые 2 элемента массива
  
Старайтесь нетривиальные понятия, особенно незнакомые вам, найти ссылку на википедию и вставить (нейросети лажают!).
+
Какова асимптотическая временная сложность этого алгоритма, измеряемая количеством проведенных сравнений?
Это важно, чтобы найти корректный перевод (то, что в википедии, или на худой конец — точно массово гуглится).
+
 
+
Потом конечно сотрите инструкции, которые тут курсивом.</i>
+
  
 
=== Ответы ===
 
=== Ответы ===
<i>Если ответы простые, однострочные, используйте простой способ задания ответов списком, типа так
 
(префикс «Правильный ответ:» — это дословно, для правильного ответа, неважно, какой он будет в списке)</i>
 
  
* Правильный ответ: тут реально правильный ответ
+
* <m>\Theta(n\log{n})</m>
* неправильный ответ
+
* <m>\Theta(n^2)</m>
* еще какой-то неправильный ответ
+
* <m>\Theta(n^3)</m>
* еще какой-то неправильный ответ
+
* Правильный ответ: <m>\Theta(2^n)</m>
* еще какой-то неправильный ответ
+
* <m>\Theta(3^n)</m>
  
<i>Если ответы длинные, многострочные, или там графы, используйте
+
=== Объяснение ===
[https://wiki.4intra.net/MediawikiQuizzer/ru#.D0.9E.D1.82.D0.B2.D0.B5.D1.82.D1.8B способ задания ответов разделами],
+
{{cstest-source|2011-gre-cs-practice-book.pdf|31|35}}
Но такое очень редко встречается. </i>
+
  
 +
Напишем реализацию алгоритма на C:
 +
<code-c>
 +
void sort(int* ar, int sz)
 +
{
 +
  if (sz == 2)
 +
  {
 +
    // сравнить и свапнуть если надо
 +
    return;
 +
  }
  
=== Объяснение ===
+
  sort(ar, sz-1);
<i>Сначала заполните номер страницы с этим вопросом
+
  sort(ar+1, sz-1);
{{cstest-source|2011-gre-cs-practice-book.pdf|тут-номер-страницы-с-вопросом-35|35}}
+
  sort(ar, 2);
 
+
}
Если все сделаете правильно, по ссылке выше будет открываться правильная страница в правильном PDFе.
+
</code-c>
  
Ну и наконец, вики-разметкой напишите ваше понимание, почему правильный ответ — правильный, а [[2004-gre-cs-practice-book.pdf/Q16|неправильные варианты — неправильны]].
+
Заметим, что каждый вызов функции sort (за исключением случая когда sz == 2) создает еще 2 вызова той же функции sort всегда с одинаковым sz. При этом каждый вызов функции sort в конце концов приводит к вызову операции сравнения. Следовательно получаем следующую цепочку вызовов функции: f(n) - 2*f(n-1) - 4*f(n-2) - ... - 2^n-2*f(2), следовательно в итоге получается 2^n вызовов операции сравнения и правильный ответ -- <m>\Theta(2^n)</m>.
Тут тоже могут быть полезны [[2004-gre-cs-practice-book.pdf/Q03|ссылки на википедию]],  
+
решение вами [[2004-gre-cs-practice-book.pdf/Q12|рекуррентных уравнений в sympy]].
+
  
</i>
+
{{question-ok|[[Участник:StasFomin|StasFomin]] 12:49, 21 декабря 2024 (UTC)}}
  
{{question-ok|}}
+
[[Категория:Решить через sympy]]
 +
[[Категория:Sorting]]

Текущая версия на 12:49, 21 декабря 2024

Вопрос: Q35-08c765

Рассмотрим следующий алгоритм, сортирующий массив из n ≥ 2 целых чисел:

  1. Если в массиве всего 2 элемента, сравнить их и поменять местами если они в неправильном порядке
  2. Иначе, делать следующие шаги по порядку:
    1. Рекурсивно отсортировать первые n-1 элементов массива
    2. Рекурсивно отсортировать последние n-1 элементов массива
    3. Рекурсивно отсортировать первые 2 элемента массива

Какова асимптотическая временная сложность этого алгоритма, измеряемая количеством проведенных сравнений?

Ответы

  • Правильный ответ:

Объяснение

Исходники — вопрос 35 на 31 странице книги «2011-gre-cs-practice-book.pdf»

Напишем реализацию алгоритма на C:

void sort(int* ar, int sz)
{
  if (sz == 2)
  {
    // сравнить и свапнуть если надо
    return;
  }
 
  sort(ar, sz-1);
  sort(ar+1, sz-1);
  sort(ar, 2);
}

Заметим, что каждый вызов функции sort (за исключением случая когда sz == 2) создает еще 2 вызова той же функции sort всегда с одинаковым sz. При этом каждый вызов функции sort в конце концов приводит к вызову операции сравнения. Следовательно получаем следующую цепочку вызовов функции: f(n) - 2*f(n-1) - 4*f(n-2) - ... - 2^n-2*f(2), следовательно в итоге получается 2^n вызовов операции сравнения и правильный ответ -- .