[{"data":1,"prerenderedAt":1351},["ShallowReactive",2],{"$fultY_2lgS-m_5F7ldfwiixI8hUW0ZpwhPDkBsumKqwg":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":68,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":71,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":76,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":421,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":643,"mdc-i0tdcc-key":663,"mdc-svfyep-key":675,"mdc--vul1ir-key":693,"mdc-o2ztsq-key":717,"mdc--pj4c6y-key":732,"mdc-gcp3y-key":755,"mdc--dt49m3-key":808,"mdc-x6igc7-key":912,"mdc-93axk6-key":961,"mdc-dq194f-key":1110,"mdc-m9ju36-key":1118,"mdc-jqhs5w-key":1312,"mdc--nqgvh-key":1328},{"content":4,"quizQuestionContent":40,"type":59,"pageMeta":60},[5,9,13,16,20,23,27,31,34,37],{"id":6,"value":7,"isTypeH1":8},"1897","Алгоритмическая сложность быстрой сортировки: теория и практика",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4341","Теория: как работает quicksort","theory-how-quicksort-works",{"id":14,"value":15,"isTypeParagraph":8},"9976","Quicksort — алгоритм «разделяй и властвуй»: выбирается опорный элемент (pivot), массив переставляется так, чтобы элементы меньше pivot оказались слева, а больше — справа, после чего обе части сортируются рекурсивно.\nКлючевое свойство: одна операция разбиения (partition) за один проход просматривает элементы подмассива, поэтому стоимость разбиения порядка `O(n)` для подмассива длины `n`.\n\nВременная сложность определяется тем, насколько «ровно» pivot делит массив на две части.\nЕсли pivot каждый раз близок к медиане, дерево рекурсии имеет глубину порядка `log n`, и на каждом уровне суммарно обрабатывается около `n` элементов, что даёт `O(n log n)`.",{"id":17,"value":18,"anchor":19,"isTypeH2":8},"4342","Разбор сложностей по случаям","time-complexity-cases",{"id":21,"value":22,"isTypeParagraph":8},"9977","Удобная модель анализа задаётся рекуррентным соотношением (для массива из `n` элементов):\n`T(n) = T(k) + T(n - k - 1) + O(n)` — где `k` это размер левой части после разбиения, а `O(n)` это стоимость partition.\n\n1) Лучший (сбалансированный) случай  \nЕсли каждый раз `k ≈ n/2`, то получается:\n`T(n) ≈ 2*T(n/2) + O(n)` ⇒ `T(n) = O(n log n)` (стандартный результат для divide-and-conquer).\nИменно поэтому утверждение «в лучшем случае `O(n)`» не подходит для классического quicksort.\n\n2) Средний / ожидаемый случай  \nМатематический анализ показывает, что в среднем quicksort делает `O(n log n)` сравнений.\nЕсли pivot выбирается случайно (равновероятно из элементов подмассива), та же оценка ожидаемого времени применяется к любому входному массиву, а ожидание берётся по случайному выбору pivot.\n\n3) Худший случай  \nСамое «косое» разбиение — когда одна часть имеет размер `n-1`, а другая `0`, и это повторяется на каждом шаге; тогда суммарная работа становится квадратичной, `O(n²)`.\nВ учебных реализациях худший случай часто возникает на уже отсортированном массиве при выборе pivot как первого или последнего элемента.\n\nНебольшая схема дерева рекурсии (идея):\n```\nСбалансировано (≈ n/2 и n/2):          Несбалансировано (0 и n-1):\nуровень 0:     n                         уровень 0:     n\nуровень 1:  n/2  n/2                     уровень 1:     n-1\nуровень 2: n/4 n/4 n/4 n/4               уровень 2:     n-2\n...\nглубина: ~log n                          глубина: ~n\nработа/уровень: ~n                       суммарно: n+(n-1)+...+1 ≈ n²/2\n```",{"id":24,"description":25,"titleAlert":26,"isTypeAlertWarning":8},"684","На практике quicksort остаётся быстрым «в среднем», но без мер против худшего случая (удачный выбор pivot, гибридные подходы) возможны редкие, но очень медленные запуски на «неудачных» данных.",null,{"id":28,"value":29,"anchor":30,"isTypeH2":8},"4343","Пример кода (JS/TS) и комментарии","code-example-js-ts",{"id":32,"value":33,"isTypeParagraph":8},"9978","Ниже приведён простой учебный вариант quicksort (не in-place), чтобы увидеть идею разбиения; асимптотика по времени остаётся такой же, а по памяти появляется дополнительное выделение массивов.\n\n```\n// TypeScript / JavaScript (учебная реализация, не in-place)\nexport function quickSort(arr: number[]): number[] {\n  if (arr.length \u003C= 1) return arr;\n\n  const pivot = arr[arr.length - 1];\n  const left: number[] = [];\n  const right: number[] = [];\n  const equal: number[] = [];\n\n  for (const x of arr) {\n    if (x \u003C pivot) left.push(x);\n    else if (x > pivot) right.push(x);\n    else equal.push(x);\n  }\n\n  return [...quickSort(left), ...equal, ...quickSort(right)];\n}\n```\n\nЧто важно заметить в этом коде:\n- Цикл `for` делает один линейный проход по `arr`, то есть разбиение стоит `O(n)` для текущего `n`.\n- Далее выполняются два рекурсивных вызова для частей массива, поэтому итог зависит от баланса размеров этих частей (сводится к формуле `T(n) = T(k) + T(n-k-1) + O(n)`).\n\nМини-таблица оценок (для «классического» quicksort по времени):\n| Случай | Временная сложность | Интуитивная причина |\n|---|---|---|\n| Лучший | `O(n log n)` | Почти равные разбиения на каждом шаге. |\n| Средний | `O(n log n)` | В среднем число сравнений порядка `n log n`. |\n| Худший | `O(n²)` | Постоянно получается разбиение `0` и `n-1`. |",{"id":35,"description":36,"titleAlert":26,"isTypeAlertInfo":8},"628","Нестабильность quicksort означает, что равные элементы могут поменять относительный порядок, но это не «превращает» алгоритм в `O(n²)` всегда; нестабильность — отдельная характеристика, не равная времени работы.",{"id":38,"value":39,"isTypeParagraph":8},"9979","Итогоо: quicksort имеет среднюю (и ожидаемую при случайном выборе pivot) временную сложность `O(n log n)`, но в худшем случае может деградировать до `O(n²)` из‑за крайне неравномерных разбиений; правильный вариант ответа — 2.",{"id":41,"options":42,"hint":56,"solution":57,"description":58},"1136",[43,47,50,53],{"id":44,"label":45,"isCorrect":46},"4676","Всегда `O(n log n)`, независимо от входных данных.",false,{"id":48,"label":49,"isCorrect":8},"4677","Средняя временная сложность — `O(n log n)`, худшая — `O(n²)`.",{"id":51,"label":52,"isCorrect":46},"4678","Всегда `O(n²)`, так как это нестабильный алгоритм.",{"id":54,"label":55,"isCorrect":46},"4679","В лучшем случае `O(n)`, в худшем — `O(n log n)`.","Необходимо вспомнить, что разбиение (partition) работает за `O(n)`, а общая сложность определяется рекурсией: при сбалансированных разбиениях глубина `~log n` даёт `O(n log n)`, при разбиениях `n-1` и `0` сумма превращается в `O(n²)`.","Правильный вариант: 2 - средняя временная сложность — `O(n log n)`, худшая — `O(n²)`.\n\nПочему остальные варианты неверны:\n1) «Всегда `O(n log n)`» — неверно, так как при крайне неудачном разбиении (например, когда каждый раз выбирается минимальный/максимальный элемент как опорный) число сравнений деградирует до `O(n²)`.\n3) «Всегда `O(n²)`, так как нестабильный» — неверно, потому что нестабильность (сохранение порядка равных элементов) не определяет временную сложность; quicksort обычно действительно нестабилен, но его средняя сложность при этом `O(n log n)`.\n4) «В лучшем случае `O(n)`» — неверно для классического quicksort: при удачных (почти равных) разбиениях получается `O(n log n)`, а не линейное время.\n\nТермин «быстрая сортировка» обычно означает семейство алгоритмов quicksort: детали (схема разбиения, выбор pivot) могут различаться, но базовые оценки `O(n log n)` в среднем и `O(n²)` в худшем сохраняются.","Какая алгоритмическая сложность у \"быстрой сортировки\"?","quizQuestion",{"title":58,"description":7,"ogTitle":58,"ogDescription":7,"ogImageUrl":61,"canonical":26,"ogLocale":62,"ogSiteName":63,"ogImageType":64,"ogImageWidth":65,"ogImageHeight":66,"ogType":67,"ogUrl":26},"/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":69,"siteUrl":70},"GOOD WEB JOB!","https://goodwebjob.ru",[72],{"label":73,"slug":74,"to":75},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":77,"navigationSublist":85},[78,81],{"path":75,"isActive":46,"name":79,"icon":80,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":82,"isActive":8,"name":83,"icon":84,"isNavbarMobileDisabled":46},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[86,95,122,134,140,281,305,313,319,382,403,409],{"title":87,"list":88,"isOpened":46},"Bash",[89,92],{"name":90,"path":91,"isActive":46},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":93,"path":94,"isActive":46},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":96,"list":97,"isOpened":46},"CSS",[98,101,104,107,110,113,116,119],{"name":99,"path":100,"isActive":46},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":102,"path":103,"isActive":46},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":105,"path":106,"isActive":46},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":108,"path":109,"isActive":46},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":111,"path":112,"isActive":46},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":114,"path":115,"isActive":46},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":117,"path":118,"isActive":46},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":120,"path":121,"isActive":46},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":123,"list":124,"isOpened":46},"Git",[125,128,131],{"name":126,"path":127,"isActive":46},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":129,"path":130,"isActive":46},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":132,"path":133,"isActive":46},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":135,"list":136,"isOpened":46},"HTML",[137],{"name":138,"path":139,"isActive":46},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":141,"list":142,"isOpened":46},"JavaScript",[143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278],{"name":144,"path":145,"isActive":46},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":147,"path":148,"isActive":46},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":150,"path":151,"isActive":46},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":153,"path":154,"isActive":46},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":156,"path":157,"isActive":46},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":159,"path":160,"isActive":46},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":162,"path":163,"isActive":46},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":165,"path":166,"isActive":46},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":168,"path":169,"isActive":46},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":171,"path":172,"isActive":46},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":174,"path":175,"isActive":46},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":177,"path":178,"isActive":46},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":180,"path":181,"isActive":46},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":183,"path":184,"isActive":46},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":186,"path":187,"isActive":46},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":189,"path":190,"isActive":46},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":192,"path":193,"isActive":46},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":195,"path":196,"isActive":46},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":198,"path":199,"isActive":46},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":201,"path":202,"isActive":46},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":204,"path":205,"isActive":46},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":207,"path":208,"isActive":46},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":210,"path":211,"isActive":46},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":213,"path":214,"isActive":46},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":216,"path":217,"isActive":46},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":219,"path":220,"isActive":46},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":222,"path":223,"isActive":46},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":225,"path":226,"isActive":46},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":228,"path":229,"isActive":46},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":231,"path":232,"isActive":46},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":234,"path":235,"isActive":46},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":237,"path":238,"isActive":46},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":240,"path":241,"isActive":46},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":243,"path":244,"isActive":46},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":246,"path":247,"isActive":46},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":249,"path":250,"isActive":46},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":252,"path":253,"isActive":46}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":255,"path":256,"isActive":46},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":258,"path":259,"isActive":46},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":261,"path":262,"isActive":46},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":264,"path":265,"isActive":46},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":267,"path":268,"isActive":46},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":270,"path":271,"isActive":46},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":273,"path":274,"isActive":46},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":276,"path":277,"isActive":46},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":279,"path":280,"isActive":46},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":282,"list":283,"isOpened":46},"React",[284,287,290,293,296,299,302],{"name":285,"path":286,"isActive":46},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":288,"path":289,"isActive":46},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":291,"path":292,"isActive":46},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":294,"path":295,"isActive":46},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":297,"path":298,"isActive":46},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":300,"path":301,"isActive":46},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":303,"path":304,"isActive":46},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":306,"list":307,"isOpened":46},"Алгоритмы",[308,311],{"name":309,"path":310,"isActive":46},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":58,"path":312,"isActive":46},"/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":314,"list":315,"isOpened":46},"Дебаггинг",[316],{"name":317,"path":318,"isActive":46},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":320,"list":321,"isOpened":46},"Компьютерные сети",[322,325,328,331,334,337,340,343,346,349,352,355,358,361,364,367,370,373,376,379],{"name":323,"path":324,"isActive":46},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":326,"path":327,"isActive":46},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":329,"path":330,"isActive":46},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":332,"path":333,"isActive":46},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":335,"path":336,"isActive":46},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":338,"path":339,"isActive":46},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":341,"path":342,"isActive":46},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":344,"path":345,"isActive":46},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":347,"path":348,"isActive":46},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":350,"path":351,"isActive":46},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":353,"path":354,"isActive":46},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":356,"path":357,"isActive":46},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":359,"path":360,"isActive":46},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":362,"path":363,"isActive":46},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":365,"path":366,"isActive":46},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":368,"path":369,"isActive":46},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":371,"path":372,"isActive":46},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":374,"path":375,"isActive":46},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":377,"path":378,"isActive":46},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":380,"path":381,"isActive":46},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":383,"list":384,"isOpened":46},"Отрисовка в браузере",[385,388,391,394,397,400],{"name":386,"path":387,"isActive":46},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":389,"path":390,"isActive":46},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":392,"path":393,"isActive":46},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":395,"path":396,"isActive":46},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":398,"path":399,"isActive":46},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":401,"path":402,"isActive":46},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":404,"list":405,"isOpened":46},"Ревью кода",[406],{"name":407,"path":408,"isActive":46},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":410,"list":411,"isOpened":46},"Теория вероятности",[412,415,418],{"name":413,"path":414,"isActive":46},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":416,"path":417,"isActive":46},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":419,"path":420,"isActive":46},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":422},[423,426,428,430,432,435,438,440,442,444,446,448,451,453,455,457,459,461,463,465,467,469,471,473,475,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,633,635,637,639,641],{"name":424,"value":425},"Теоретические задания","theoretical-tasks",{"name":180,"value":427},"what-this-code-will-return-typeof-function",{"name":79,"value":429},"where-to-begin",{"name":147,"value":431},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":433,"value":434},"Backend","backend",{"name":436,"value":437},"Frontend","frontend",{"name":144,"value":439},"prototype-what-logical-values-will-be-received-in-console-log",{"name":261,"value":441},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":252,"value":443},"find-non-repeating-numbers-in-an-array",{"name":225,"value":445},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":231,"value":447},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":449,"value":450},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":237,"value":452},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":153,"value":454},"what-value-will-the-console-output-with-object-property",{"name":156,"value":456},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":228,"value":458},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":258,"value":460},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":264,"value":462},"determines-whether-a-word-is-a-palindrome",{"name":243,"value":464},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":270,"value":466},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":234,"value":468},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":240,"value":470},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":246,"value":472},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":279,"value":474},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":249,"value":476},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":255,"value":478},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":159,"value":480},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":162,"value":482},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":174,"value":484},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":177,"value":486},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":276,"value":488},"unifying-values-in-an-array",{"name":267,"value":490},"flattening-the-array",{"name":165,"value":492},"what-will-the-book-get-upper-name-method-return",{"name":273,"value":494},"string-compression",{"name":171,"value":496},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":183,"value":498},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":323,"value":500},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":329,"value":502},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":332,"value":504},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":335,"value":506},"key-differences-between-tcp-and-udp",{"name":338,"value":508},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":341,"value":510},"what-is-http-and-what-does-it-consist-of",{"name":344,"value":512},"what-are-http-headers-and-why-do-we-need-them",{"name":347,"value":514},"what-are-http-parameters",{"name":350,"value":516},"where-is-the-html-code-located-in-the-http-response-structure",{"name":138,"value":518},"what-is-html",{"name":353,"value":520},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":356,"value":522},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":359,"value":524},"what-is-a-cookie",{"name":362,"value":526},"who-initiates-the-cookie-recording-in-the-browser",{"name":365,"value":528},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":530,"value":531},"Лайвкодинг","livecoding",{"name":150,"value":533},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":371,"value":535},"is-everything-that-goes-through-https-secure",{"name":374,"value":537},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":377,"value":539},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":389,"value":541},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":386,"value":543},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":392,"value":545},"what-is-blocking-the-page-rendering-in-the-browser",{"name":395,"value":547},"what-is-dom-in-a-browser-what-is-cssom",{"name":398,"value":549},"what-are-nodes-in-the-dom",{"name":401,"value":551},"what-does-cssom-consist-of",{"name":99,"value":553},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":102,"value":555},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":105,"value":557},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":108,"value":559},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":111,"value":561},"there-is-an-html-code-will-font-weight-affect-span",{"name":114,"value":563},"what-are-the-differences-between-flexbox-and-grid",{"name":117,"value":565},"do-flexbox-and-grid-replace-each-other",{"name":120,"value":567},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":83,"value":569},"tasks",{"name":186,"value":571},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":189,"value":573},"what-is-this-in-javascript",{"name":192,"value":575},"what-is-an-event-loop-and-how-does-it-work",{"name":195,"value":577},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":198,"value":579},"what-does-the-typeof-operator-show-in-javascript",{"name":201,"value":581},"what-types-of-data-exist-in-javascript",{"name":204,"value":583},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":207,"value":585},"what-will-typeof-return-for-an-array",{"name":210,"value":587},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":213,"value":589},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":216,"value":591},"what-does-typeof-return-for-new-set-in-javascript",{"name":285,"value":593},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":291,"value":595},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":294,"value":597},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":297,"value":599},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":300,"value":601},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":317,"value":603},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":126,"value":605},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":129,"value":607},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":132,"value":609},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":407,"value":611},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":90,"value":613},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":93,"value":615},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":309,"value":617},"what-is-algorithmic-complexity",{"name":58,"value":619},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":219,"value":621},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":380,"value":623},"how-can-a-user-be-authorized-on-a-website",{"name":222,"value":625},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":413,"value":627},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":416,"value":629},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":419,"value":631},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":73,"value":74},{"name":368,"value":634},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":326,"value":636},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":168,"value":638},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":288,"value":640},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":303,"value":642},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":644,"copyright":647,"reportError":648,"socialNetwork":650},{"link":645,"title":646},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":649,"link":645},"Сообщить об ошибке",{"label":651,"socialNetworkList":652},"Мы в соцсетях:",[653,656,659],{"icon":26,"link":654,"title":655},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":657,"link":645,"title":658},"ic:baseline-telegram","Telegram",{"icon":660,"link":661,"title":662},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":664,"body":665},{},{"type":666,"children":667},"root",[668],{"type":669,"tag":670,"props":671,"children":672},"element","p",{},[673],{"type":674,"value":58},"text",{"data":676,"body":677},{},{"type":666,"children":678},[679],{"type":669,"tag":670,"props":680,"children":681},{},[682,684,691],{"type":674,"value":683},"Всегда ",{"type":669,"tag":685,"props":686,"children":688},"code",{"className":687},[],[689],{"type":674,"value":690},"O(n log n)",{"type":674,"value":692},", независимо от входных данных.",{"data":694,"body":695},{},{"type":666,"children":696},[697],{"type":669,"tag":670,"props":698,"children":699},{},[700,702,707,709,715],{"type":674,"value":701},"Средняя временная сложность — ",{"type":669,"tag":685,"props":703,"children":705},{"className":704},[],[706],{"type":674,"value":690},{"type":674,"value":708},", худшая — ",{"type":669,"tag":685,"props":710,"children":712},{"className":711},[],[713],{"type":674,"value":714},"O(n²)",{"type":674,"value":716},".",{"data":718,"body":719},{},{"type":666,"children":720},[721],{"type":669,"tag":670,"props":722,"children":723},{},[724,725,730],{"type":674,"value":683},{"type":669,"tag":685,"props":726,"children":728},{"className":727},[],[729],{"type":674,"value":714},{"type":674,"value":731},", так как это нестабильный алгоритм.",{"data":733,"body":734},{},{"type":666,"children":735},[736],{"type":669,"tag":670,"props":737,"children":738},{},[739,741,747,749,754],{"type":674,"value":740},"В лучшем случае ",{"type":669,"tag":685,"props":742,"children":744},{"className":743},[],[745],{"type":674,"value":746},"O(n)",{"type":674,"value":748},", в худшем — ",{"type":669,"tag":685,"props":750,"children":752},{"className":751},[],[753],{"type":674,"value":690},{"type":674,"value":716},{"data":756,"body":757},{},{"type":666,"children":758},[759],{"type":669,"tag":670,"props":760,"children":761},{},[762,764,769,771,777,779,784,786,792,794,800,802,807],{"type":674,"value":763},"Необходимо вспомнить, что разбиение (partition) работает за ",{"type":669,"tag":685,"props":765,"children":767},{"className":766},[],[768],{"type":674,"value":746},{"type":674,"value":770},", а общая сложность определяется рекурсией: при сбалансированных разбиениях глубина ",{"type":669,"tag":685,"props":772,"children":774},{"className":773},[],[775],{"type":674,"value":776},"~log n",{"type":674,"value":778}," даёт ",{"type":669,"tag":685,"props":780,"children":782},{"className":781},[],[783],{"type":674,"value":690},{"type":674,"value":785},", при разбиениях ",{"type":669,"tag":685,"props":787,"children":789},{"className":788},[],[790],{"type":674,"value":791},"n-1",{"type":674,"value":793}," и ",{"type":669,"tag":685,"props":795,"children":797},{"className":796},[],[798],{"type":674,"value":799},"0",{"type":674,"value":801}," сумма превращается в ",{"type":669,"tag":685,"props":803,"children":805},{"className":804},[],[806],{"type":674,"value":714},{"type":674,"value":716},{"data":809,"body":810},{},{"type":666,"children":811},[812,829,834,893],{"type":669,"tag":670,"props":813,"children":814},{},[815,817,822,823,828],{"type":674,"value":816},"Правильный вариант: 2 - средняя временная сложность — ",{"type":669,"tag":685,"props":818,"children":820},{"className":819},[],[821],{"type":674,"value":690},{"type":674,"value":708},{"type":669,"tag":685,"props":824,"children":826},{"className":825},[],[827],{"type":674,"value":714},{"type":674,"value":716},{"type":669,"tag":670,"props":830,"children":831},{},[832],{"type":674,"value":833},"Почему остальные варианты неверны:",{"type":669,"tag":835,"props":836,"children":837},"ol",{},[838,857,874],{"type":669,"tag":839,"props":840,"children":841},"li",{},[842,844,849,851,856],{"type":674,"value":843},"«Всегда ",{"type":669,"tag":685,"props":845,"children":847},{"className":846},[],[848],{"type":674,"value":690},{"type":674,"value":850},"» — неверно, так как при крайне неудачном разбиении (например, когда каждый раз выбирается минимальный/максимальный элемент как опорный) число сравнений деградирует до ",{"type":669,"tag":685,"props":852,"children":854},{"className":853},[],[855],{"type":674,"value":714},{"type":674,"value":716},{"type":669,"tag":839,"props":858,"children":859},{},[860,861,866,868,873],{"type":674,"value":843},{"type":669,"tag":685,"props":862,"children":864},{"className":863},[],[865],{"type":674,"value":714},{"type":674,"value":867},", так как нестабильный» — неверно, потому что нестабильность (сохранение порядка равных элементов) не определяет временную сложность; quicksort обычно действительно нестабилен, но его средняя сложность при этом ",{"type":669,"tag":685,"props":869,"children":871},{"className":870},[],[872],{"type":674,"value":690},{"type":674,"value":716},{"type":669,"tag":839,"props":875,"children":876},{},[877,879,884,886,891],{"type":674,"value":878},"«В лучшем случае ",{"type":669,"tag":685,"props":880,"children":882},{"className":881},[],[883],{"type":674,"value":746},{"type":674,"value":885},"» — неверно для классического quicksort: при удачных (почти равных) разбиениях получается ",{"type":669,"tag":685,"props":887,"children":889},{"className":888},[],[890],{"type":674,"value":690},{"type":674,"value":892},", а не линейное время.",{"type":669,"tag":670,"props":894,"children":895},{},[896,898,903,905,910],{"type":674,"value":897},"Термин «быстрая сортировка» обычно означает семейство алгоритмов quicksort: детали (схема разбиения, выбор pivot) могут различаться, но базовые оценки ",{"type":669,"tag":685,"props":899,"children":901},{"className":900},[],[902],{"type":674,"value":690},{"type":674,"value":904}," в среднем и ",{"type":669,"tag":685,"props":906,"children":908},{"className":907},[],[909],{"type":674,"value":714},{"type":674,"value":911}," в худшем сохраняются.",{"data":913,"body":914},{},{"type":666,"children":915},[916,935],{"type":669,"tag":670,"props":917,"children":918},{},[919,921,926,928,934],{"type":674,"value":920},"Quicksort — алгоритм «разделяй и властвуй»: выбирается опорный элемент (pivot), массив переставляется так, чтобы элементы меньше pivot оказались слева, а больше — справа, после чего обе части сортируются рекурсивно.\nКлючевое свойство: одна операция разбиения (partition) за один проход просматривает элементы подмассива, поэтому стоимость разбиения порядка ",{"type":669,"tag":685,"props":922,"children":924},{"className":923},[],[925],{"type":674,"value":746},{"type":674,"value":927}," для подмассива длины ",{"type":669,"tag":685,"props":929,"children":931},{"className":930},[],[932],{"type":674,"value":933},"n",{"type":674,"value":716},{"type":669,"tag":670,"props":936,"children":937},{},[938,940,946,948,953,955,960],{"type":674,"value":939},"Временная сложность определяется тем, насколько «ровно» pivot делит массив на две части.\nЕсли pivot каждый раз близок к медиане, дерево рекурсии имеет глубину порядка ",{"type":669,"tag":685,"props":941,"children":943},{"className":942},[],[944],{"type":674,"value":945},"log n",{"type":674,"value":947},", и на каждом уровне суммарно обрабатывается около ",{"type":669,"tag":685,"props":949,"children":951},{"className":950},[],[952],{"type":674,"value":933},{"type":674,"value":954}," элементов, что даёт ",{"type":669,"tag":685,"props":956,"children":958},{"className":957},[],[959],{"type":674,"value":690},{"type":674,"value":716},{"data":962,"body":963},{},{"type":666,"children":964},[965,1000,1093,1098],{"type":669,"tag":670,"props":966,"children":967},{},[968,970,975,977,983,985,991,993,998],{"type":674,"value":969},"Удобная модель анализа задаётся рекуррентным соотношением (для массива из ",{"type":669,"tag":685,"props":971,"children":973},{"className":972},[],[974],{"type":674,"value":933},{"type":674,"value":976}," элементов):\n",{"type":669,"tag":685,"props":978,"children":980},{"className":979},[],[981],{"type":674,"value":982},"T(n) = T(k) + T(n - k - 1) + O(n)",{"type":674,"value":984}," — где ",{"type":669,"tag":685,"props":986,"children":988},{"className":987},[],[989],{"type":674,"value":990},"k",{"type":674,"value":992}," это размер левой части после разбиения, а ",{"type":669,"tag":685,"props":994,"children":996},{"className":995},[],[997],{"type":674,"value":746},{"type":674,"value":999}," это стоимость partition.",{"type":669,"tag":835,"props":1001,"children":1002},{},[1003,1045,1062],{"type":669,"tag":839,"props":1004,"children":1005},{},[1006,1008,1012,1014,1020,1022,1028,1030,1036,1038,1043],{"type":674,"value":1007},"Лучший (сбалансированный) случай",{"type":669,"tag":1009,"props":1010,"children":1011},"br",{},[],{"type":674,"value":1013},"\nЕсли каждый раз ",{"type":669,"tag":685,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":674,"value":1019},"k ≈ n/2",{"type":674,"value":1021},", то получается:\n",{"type":669,"tag":685,"props":1023,"children":1025},{"className":1024},[],[1026],{"type":674,"value":1027},"T(n) ≈ 2*T(n/2) + O(n)",{"type":674,"value":1029}," ⇒ ",{"type":669,"tag":685,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":674,"value":1035},"T(n) = O(n log n)",{"type":674,"value":1037}," (стандартный результат для divide-and-conquer).\nИменно поэтому утверждение «в лучшем случае ",{"type":669,"tag":685,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":674,"value":746},{"type":674,"value":1044},"» не подходит для классического quicksort.",{"type":669,"tag":839,"props":1046,"children":1047},{},[1048,1050,1053,1055,1060],{"type":674,"value":1049},"Средний / ожидаемый случай",{"type":669,"tag":1009,"props":1051,"children":1052},{},[],{"type":674,"value":1054},"\nМатематический анализ показывает, что в среднем quicksort делает ",{"type":669,"tag":685,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":674,"value":690},{"type":674,"value":1061}," сравнений.\nЕсли pivot выбирается случайно (равновероятно из элементов подмассива), та же оценка ожидаемого времени применяется к любому входному массиву, а ожидание берётся по случайному выбору pivot.",{"type":669,"tag":839,"props":1063,"children":1064},{},[1065,1067,1070,1072,1077,1079,1084,1086,1091],{"type":674,"value":1066},"Худший случай",{"type":669,"tag":1009,"props":1068,"children":1069},{},[],{"type":674,"value":1071},"\nСамое «косое» разбиение — когда одна часть имеет размер ",{"type":669,"tag":685,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":674,"value":791},{"type":674,"value":1078},", а другая ",{"type":669,"tag":685,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":674,"value":799},{"type":674,"value":1085},", и это повторяется на каждом шаге; тогда суммарная работа становится квадратичной, ",{"type":669,"tag":685,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":674,"value":714},{"type":674,"value":1092},".\nВ учебных реализациях худший случай часто возникает на уже отсортированном массиве при выборе pivot как первого или последнего элемента.",{"type":669,"tag":670,"props":1094,"children":1095},{},[1096],{"type":674,"value":1097},"Небольшая схема дерева рекурсии (идея):",{"type":669,"tag":1099,"props":1100,"children":1104},"pre",{"className":1101,"code":1103,"language":674},[1102],"language-text","Сбалансировано (≈ n/2 и n/2):          Несбалансировано (0 и n-1):\nуровень 0:     n                         уровень 0:     n\nуровень 1:  n/2  n/2                     уровень 1:     n-1\nуровень 2: n/4 n/4 n/4 n/4               уровень 2:     n-2\n...\nглубина: ~log n                          глубина: ~n\nработа/уровень: ~n                       суммарно: n+(n-1)+...+1 ≈ n²/2\n",[1105],{"type":669,"tag":685,"props":1106,"children":1108},{"__ignoreMap":1107},"",[1109],{"type":674,"value":1103},{"data":1111,"body":1112},{},{"type":666,"children":1113},[1114],{"type":669,"tag":670,"props":1115,"children":1116},{},[1117],{"type":674,"value":25},{"data":1119,"body":1120},{},{"type":666,"children":1121},[1122,1127,1136,1141,1192,1197],{"type":669,"tag":670,"props":1123,"children":1124},{},[1125],{"type":674,"value":1126},"Ниже приведён простой учебный вариант quicksort (не in-place), чтобы увидеть идею разбиения; асимптотика по времени остаётся такой же, а по памяти появляется дополнительное выделение массивов.",{"type":669,"tag":1099,"props":1128,"children":1131},{"className":1129,"code":1130,"language":674},[1102],"// TypeScript / JavaScript (учебная реализация, не in-place)\nexport function quickSort(arr: number[]): number[] {\n  if (arr.length \u003C= 1) return arr;\n\n  const pivot = arr[arr.length - 1];\n  const left: number[] = [];\n  const right: number[] = [];\n  const equal: number[] = [];\n\n  for (const x of arr) {\n    if (x \u003C pivot) left.push(x);\n    else if (x > pivot) right.push(x);\n    else equal.push(x);\n  }\n\n  return [...quickSort(left), ...equal, ...quickSort(right)];\n}\n",[1132],{"type":669,"tag":685,"props":1133,"children":1134},{"__ignoreMap":1107},[1135],{"type":674,"value":1130},{"type":669,"tag":670,"props":1137,"children":1138},{},[1139],{"type":674,"value":1140},"Что важно заметить в этом коде:",{"type":669,"tag":1142,"props":1143,"children":1144},"ul",{},[1145,1179],{"type":669,"tag":839,"props":1146,"children":1147},{},[1148,1150,1156,1158,1164,1166,1171,1173,1178],{"type":674,"value":1149},"Цикл ",{"type":669,"tag":685,"props":1151,"children":1153},{"className":1152},[],[1154],{"type":674,"value":1155},"for",{"type":674,"value":1157}," делает один линейный проход по ",{"type":669,"tag":685,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":674,"value":1163},"arr",{"type":674,"value":1165},", то есть разбиение стоит ",{"type":669,"tag":685,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":674,"value":746},{"type":674,"value":1172}," для текущего ",{"type":669,"tag":685,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":674,"value":933},{"type":674,"value":716},{"type":669,"tag":839,"props":1180,"children":1181},{},[1182,1184,1190],{"type":674,"value":1183},"Далее выполняются два рекурсивных вызова для частей массива, поэтому итог зависит от баланса размеров этих частей (сводится к формуле ",{"type":669,"tag":685,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":674,"value":1189},"T(n) = T(k) + T(n-k-1) + O(n)",{"type":674,"value":1191},").",{"type":669,"tag":670,"props":1193,"children":1194},{},[1195],{"type":674,"value":1196},"Мини-таблица оценок (для «классического» quicksort по времени):",{"type":669,"tag":1198,"props":1199,"children":1200},"table",{},[1201,1225],{"type":669,"tag":1202,"props":1203,"children":1204},"thead",{},[1205],{"type":669,"tag":1206,"props":1207,"children":1208},"tr",{},[1209,1215,1220],{"type":669,"tag":1210,"props":1211,"children":1212},"th",{},[1213],{"type":674,"value":1214},"Случай",{"type":669,"tag":1210,"props":1216,"children":1217},{},[1218],{"type":674,"value":1219},"Временная сложность",{"type":669,"tag":1210,"props":1221,"children":1222},{},[1223],{"type":674,"value":1224},"Интуитивная причина",{"type":669,"tag":1226,"props":1227,"children":1228},"tbody",{},[1229,1251,1279],{"type":669,"tag":1206,"props":1230,"children":1231},{},[1232,1238,1246],{"type":669,"tag":1233,"props":1234,"children":1235},"td",{},[1236],{"type":674,"value":1237},"Лучший",{"type":669,"tag":1233,"props":1239,"children":1240},{},[1241],{"type":669,"tag":685,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":674,"value":690},{"type":669,"tag":1233,"props":1247,"children":1248},{},[1249],{"type":674,"value":1250},"Почти равные разбиения на каждом шаге.",{"type":669,"tag":1206,"props":1252,"children":1253},{},[1254,1259,1267],{"type":669,"tag":1233,"props":1255,"children":1256},{},[1257],{"type":674,"value":1258},"Средний",{"type":669,"tag":1233,"props":1260,"children":1261},{},[1262],{"type":669,"tag":685,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":674,"value":690},{"type":669,"tag":1233,"props":1268,"children":1269},{},[1270,1272,1278],{"type":674,"value":1271},"В среднем число сравнений порядка ",{"type":669,"tag":685,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":674,"value":1277},"n log n",{"type":674,"value":716},{"type":669,"tag":1206,"props":1280,"children":1281},{},[1282,1287,1295],{"type":669,"tag":1233,"props":1283,"children":1284},{},[1285],{"type":674,"value":1286},"Худший",{"type":669,"tag":1233,"props":1288,"children":1289},{},[1290],{"type":669,"tag":685,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":674,"value":714},{"type":669,"tag":1233,"props":1296,"children":1297},{},[1298,1300,1305,1306,1311],{"type":674,"value":1299},"Постоянно получается разбиение ",{"type":669,"tag":685,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":674,"value":799},{"type":674,"value":793},{"type":669,"tag":685,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":674,"value":791},{"type":674,"value":716},{"data":1313,"body":1314},{},{"type":666,"children":1315},[1316],{"type":669,"tag":670,"props":1317,"children":1318},{},[1319,1321,1326],{"type":674,"value":1320},"Нестабильность quicksort означает, что равные элементы могут поменять относительный порядок, но это не «превращает» алгоритм в ",{"type":669,"tag":685,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":674,"value":714},{"type":674,"value":1327}," всегда; нестабильность — отдельная характеристика, не равная времени работы.",{"data":1329,"body":1330},{},{"type":666,"children":1331},[1332],{"type":669,"tag":670,"props":1333,"children":1334},{},[1335,1337,1342,1344,1349],{"type":674,"value":1336},"Итогоо: quicksort имеет среднюю (и ожидаемую при случайном выборе pivot) временную сложность ",{"type":669,"tag":685,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":674,"value":690},{"type":674,"value":1343},", но в худшем случае может деградировать до ",{"type":669,"tag":685,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":674,"value":714},{"type":674,"value":1350}," из‑за крайне неравномерных разбиений; правильный вариант ответа — 2.",1775735658886]