Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History
320 lines (276 loc) · 34 KB

File metadata and controls

320 lines (276 loc) · 34 KB

Алгоритмы и структуры данных на JavaScript

CIcodecov

В этом репозитории содержатся базовые JavaScript-примеры многих популярных алгоритмов и структур данных.

Для каждого алгоритма и структуры данных есть свой файл README с соответствующими пояснениями и ссылками на материалы для дальнейшего изучения (в том числе и ссылки на видеоролики в YouTube).

Читать на других языках:English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch

☝ Замечание: этот репозиторий предназначен для учебно-исследовательских целей (не для использования в продакшн-системах).

Структуры данных

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы

Алгоритм — конечная совокупность точно заданных правил решения некоторого класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи.

B - Базовый уровень, A - Продвинутый уровень

Алгоритмы по тематике

Алгоритмы по парадигме программирования

Парадигма программирования — общий метод или подход, лежащий в основе целого класса алгоритмов. Понятие "парадигма программирования" является более абстрактным по отношению к понятию "алгоритм", которое в свою очередь является более абстрактным по отношению к понятию "компьютерная программа".

Как использовать этот репозиторий

Установка всех зависимостей

npm install

Запуск ESLint

Эта команда может потребоваться вам для проверки качества кода.

npm run lint

Запуск всех тестов

npm test

Запуск определённого теста

npm test -- 'LinkedList'

Песочница

Вы можете экспериментировать с алгоритмами и структурами данных в файле ./src/playground/playground.js (файл ./src/playground/__test__/playground.test.js предназначен для написания тестов).

Для проверки работоспособности вашего кода используйте команду:

npm test -- 'playground'

Полезная информация

Ссылки

▶ О структурах данных и алгоритмах

Нотация «О» большое

Нотация «О» большое используется для классификации алгоритмов в соответствии с ростом времени выполнения и затрачиваемой памяти при увеличении размера входных данных. На диаграмме ниже представлены общие порядки роста алгоритмов в соответствии с нотацией «О» большое.

Big O graphs

Источник: Big O Cheat Sheet.

Ниже представлены часто используемые обозначения в нотации «О» большое, а также сравнение их производительностей на различных размерах входных данных.

Нотация «О» большое10 элементов100 элементов1000 элементов
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Сложности операций в структурах данных

Структура данныхПолучениеПоискВставкаУдалениеКомментарии
Массив1nnn
Стекnn11
Очередьnn11
Связный списокnn1n
Хеш-таблица-nnnДля идеальной хеш-функции — O(1)
Двоичное дерево поискаnnnnВ сбалансированном дереве — O(log(n))
B-деревоlog(n)log(n)log(n)log(n)
Красно-чёрное деревоlog(n)log(n)log(n)log(n)
АВЛ-деревоlog(n)log(n)log(n)log(n)
Фильтр Блума-11-Возможно получение ложно-положительного срабатывания

Сложности алгоритмов сортировки

НаименованиеЛучший случайСредний случайХудший случайПамятьУстойчивостьКомментарии
Сортировка пузырькомnn2n21Да
Сортировка вставкамиnn2n21Да
Сортировка выборомn2n2n21Нет
Сортировка кучейn log(n)n log(n)n log(n)1Нет
Сортировка слияниемn log(n)n log(n)n log(n)nДа
Быстрая сортировкаn log(n)n log(n)n2log(n)НетБыстрая сортировка обычно выполняется с использованием O(log(n)) дополнительной памяти
Сортировка Шеллаn log(n)зависит от выбранных шаговn (log(n))21Нет
Сортировка подсчётомn + rn + rn + rn + rДаr — наибольшее число в массиве
Поразрядная сортировкаn * kn * kn * kn + kДаk — длина самого длинного ключа

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev