Co-authored-by: Oleksii Trekhleb <3000285+trekhleb@users.noreply.github.com>
27 KiB
JavaScript algoritmlari va ma'lumotlar tuzilmalari
Bu repozitoriyada JavaScript-ga asoslangan ko'plab mashhur algoritmlar va ma'lumotlar tuzilmalarining namunalari mavjud.
Har bir algoritm va ma'lumotlar tuzilmasining alohida README fayli bo'lib, unda tegishli tushuntirishlar va qo'shimcha o'qish uchun havolalar (shu jumladan YouTube videolariga ham havolalar) mavjud.
Read this in other languages: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türkçe, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch, Uzbek
Yodda tuting, bu loyiha faqat o'quv va tadqiqot maqsadida ishlatilishi uchun mo'ljallangan va ishlab chiqarishda ishlatilishi mumkin emas.
Ma'lumotlar tuzilmalari
Ma'lumotlar tuzilmasi - bu kompyuterda ma'lumotlarni samarali tarzda olish va o'zgartirish uchun ularni tashkil etish va saqlashning ma'lum bir usuli. Ayniqsa, ma'lumotlar tuzilmasi ma'lumot qiymatlarining to'plami, ular orasidagi munosabatlar va ma'lumotlarga qo'llanilishi mumkin bo'lgan funksiyalar yoki operatsiyalardir.
B
- Boshlang'ich, A
- Ilg'or
B
Bog'langan ro'yxatB
Ikki marta bog'langan ro'yxatB
NavbatB
StekB
Hash jadvaliB
Heap - maksimal va minimal heap versiyalariB
Ustuvor navbatA
TrieA
DaraxtA
Ikkilik qidiruv daraxtA
AVL daraxtA
Qizil-qora daraxtA
Segment daraxt - min/max/sum diapazon so'rovlari bilan misollarA
Fenwick daraxt (ikkilik indeksli daraxt)
A
Graf (yo'naltirilgan hamda yo'naltirilmagan)A
Ajratilgan to'plam - union-find ma'lumotlar strukturasi yoki merge-find to'plamiA
Bloom filtriA
LRU keshi - Eng kam ishlatilgan (LRU) keshi
Algoritmlar
Algoritm muammolar sinfini qanday hal qilishning aniq spetsifikatsiyasi. Bu operatsiyalar ketma-ketligini aniqlaydigan qoidalar to'plami.
B
- Boshlang'ich, A
- Ilg'or
Mavzu bo'yicha algoritmlar
- Matematika
B
Bit manipulatsiyasi - bitlarni qo'yish/olish/yangilash/tozalash, ikkilikka ko'paytirish/bo'lish, manfiy qilish va hokazo.B
Ikkilik suzuvchi nuqta - suzuvchi nuqtali sonlarning ikkilik tasviri.B
FaktorialB
Fibonachchi raqam - klassik va yopiq shakldagi versiyalarB
Asosiy omillar - tub omillarni topish va ularni Xardi-Ramanujan teoremasi yordamida sanashB
Birlamchilik testi (sinov bo'linish usuli)B
Evklid algoritmi - eng katta umumiy bo'luvchini (EKUB) hisoblashB
Eng kichik umumiy karrali (EKUK)B
Eratosfen elagi - berilgan chegaragacha barcha tub sonlarni topishB
Ikkining darajasimi - raqamning ikkining darajasi ekanligini tekshirish (sodda va bitli algoritmlar)B
Paskal uchburchagiB
Kompleks sonlar - kompleks sonlar va ular bilan asosiy amallarB
Radian & Daraja - radianlarni darajaga va orqaga aylantirishB
Tez ko'tarishB
Horner metodi - polinomlarni baholashB
Matritsalar - matritsalar va asosiy matritsa operatsiyalari (ko'paytirish, transpozitsiya va boshqalar).B
Evklid masofasi - ikki nuqta/vektor/matritsa orasidagi masofaA
Butun sonlarni bo'lishA
Kvadrat ildiz - Nyuton metodiA
Liu Hui π algoritmi - N-gonlarga asoslangan π ning taxminiy hisoblariA
Diskret Furye transformatsiyasi - vaqt funksiyasini (signalni) uni tashkil etuvchi chastotalarga ajratish
- Sets
B
Karteziya maxsuloti - bir nechta to'plamlarning ko'paytmasiB
Fisher–Yates Shuffle - chekli ketma-ketlikni tasodifiy almashtirishA
Power Set - to'plamning barcha kichik to'plamlari (bitwise, backtracking va kaskadli echimlar)A
Permutatsiyalar (takroriyalash bilan va takroriyalashsiz)A
Kombinatsiyalar (takroriyalash bilan va takroriyalashsiz)A
Eng uzun umumiy ketma-ketlik (LCS)A
Eng uzun ortib boruvchi ketma-ketlikA
Eng qisqa umumiy ketma-ketlik (SCS)A
Knapsack muammosi - "0/1" va "Bir-biriga bog'lanmagan"A
Maksimal kichik massiv - Toʻliq kuch va dinamik dasturlash (Kadane usuli) versiyalariA
Kombinatsiya yig'indisi - ma'lum summani tashkil etuvchi barcha kombinatsiyalarni topish
- Stringlar
B
Hamming masofasi - belgilarning bir-biridan farq qiladigan pozitsiyalar soniB
Palindrom - satrning teskari tomoni ham bir xil ekanligini tekshirishA
Levenshtein masofasi - ikki ketma-ketlik o'rtasidagi minimal tahrirlash masofasiA
Knuth–Morris–Pratt Algoritmi (KMP Algoritmi) - kichik qatorlarni qidirish (mosh keluvchi naqshni qidirish)A
Z Algoritmi - kichik qatorlarni qidirish (mosh keluvchi naqshni qidirish)A
Rabin Karp Algoritmi - kichik qatorlarni qidirishA
Eng uzun umumiy kichik matnA
Regulyar ifoda moslashuvi (RegEx)
- Qidiruvlar
B
Linear qidirishB
Jump qidirish (yoki Blok qidirish) - saralangan qatorda qidirishB
Ikkilik qidirish - saralangan qatorda qidirishB
Interpolatsiya qidirish - bir tekis taqsimlangan saralangan qatorda qidirish
- Tartiblash
B
Pufakcha tartiblashB
Tanlash tartibiB
Kiritish tartibiB
Heap tartibiB
Birlashtirish tartibiB
Tezkor saralash - joyida va joyida bo'lmagan amalga oshirishB
Shell tartiblashB
Sanash tartibiB
Radiksli tartiblashB
Bucket tartiblash
- Bog'langan ro'yhatlar
- Daraxtlar
B
Birinchi-pastga qarab qidirish (Depth-First Search)B
Birinchi-yonga qarab qidirish (Breadth-First Search)
- Grafiklar
B
Birinchi-pastga qarab qidirish (Depth-First Search)B
Birinchi-yonga qarab qidirish (Breadth-First Search)B
Kruskal Algoritmi - og'irlikdagi yo'naltirilmagan grafik uchun Minimal kengayuvchi daraxtni (MST) topishA
Dijkstra Algoritmi - grafikning bir cho'qqisidan qolgan barcha nuqtalarga eng qisqa yo'llarni topishA
Bellman-Ford Algoritmi - grafikning bir cho'qqisidan qolgan barcha nuqtalarga eng qisqa yo'llarni topishA
Floyd-Warshall Algoritmi - grafikning barcha uchlari orasidagi eng qisqa masofalarni topishA
Siklni aniqlash - yo'naltirilgan va yo'naltirilmagan grafiklar uchun (DFS va Disjoint Set-ga asoslangan versiyalar)A
Prim Algoritmi - og'irlikdagi yo'naltirilmagan grafik uchun Minimal kengayuvchi daraxtni (MST) topishA
Topologik saralash - DFS metodiA
Artikulyatsiya nuqtalari - Tarjan algoritmi (DFS asosida)A
Ko'priklar - DFS asosidagi algoritmA
Eyler yo'li va Eyler sxemasi - Fleury algoritmi - Har bir chekkaga bir marta tashrif buyurishA
Gamilton sikli - Har bir cho'qqiga bir marta tashrif buyurishA
Kuchli bog'langan komponentlar - Kosaraju algoritmiA
Sayohatchi sotuvchi muammosi - har bir shaharga tashrif buyuradigan va kelib chiqqan shaharga qaytib keladigan eng qisqa yo'l
- Kriptografiya
B
Polynomial Hash - polinomga asoslangan hash funktsiyasiB
Rail Fence Cipher - xabarlarni kodlash uchun transpozitsiya shifrlash algoritmiB
Caesar Cipher - oddiy almashtirish shifridirB
Hill Cipher - chiziqli algebraga asoslangan almashtirish shifri
- Machine Learning
B
NanoNeuron - Mashinalar aslida qanday o'rganishi mumkinligini ko'rsatadigan 7 ta oddiy JS funksiyasi (forward/backward tarqalish)B
k-NN - eng yaqin qo'shnilarni tasniflash algoritmiB
k-Means - k-Means kalsterlash algoritmi
- Tasvirga ishlov berish
B
Seam Carving - kontentga moslashuvchan rasm o'lchamini o'zgartirish algoritmi
- Statistikalar
B
Weighted Random - elementlarning og'irligi asosida ro'yxatdan tasodifiy elementni tanlash
- Evolyutsion algoritmlar
A
Genetik algoritm - avtoturargohni o'rgatish uchun genetik algoritm qanday qo'llanilishiga misol.
- Kategoriyasiz
B
Xanoy minorasiB
Kvadrat matritsaning aylanishi - joyidagi algoritmB
Sakrash o'yini - orqaga qaytish, dinamik dasturlash (yuqoridan pastga + pastdan yuqoriga) va ochko'z misollarB
Noyob yo'llar - orqaga qaytish, dinamik dasturlash va Paskal uchburchagiga asoslangan misollaB
Yomg'ir teraslari - yomg'ir suvini ushlab turish muammosi (dinamik dasturlash va qo'pol kuch versiyalari)B
Rekursiv zinapoya - yuqoriga chiqish yo'llari sonini hisoblash (4 ta echim)B
Aksiyalarni sotib olish va sotish uchun eng yaxshi vaqt - bo'linib-zabt etish va bir marta o'tish misollariA
N-Queens MuommosiA
Ritsar sayohati
Paradigma bo'yicha algoritmlar
Algorithmic paradigm - bu algoritmlar sinfini loyihalashtirishga asos bo'lib xizmat qiladigan umumiy usul yoki yondashuv. Bu algoritm tushunchasidan yuqori darajadagi abstraktsiya bo'lib, algoritm kompyuter dasturi tushunchasidan yuqori darajadagi abstraktsiya bo'lgani kabi.
-
Brute Force - barcha imkoniyatlarni ko'rib chiqib va eng yaxshi echimni tanlash
B
Chiziqli qidirishB
Yomg'irli teraslar - yomg'ir suvini to'plash muammosiB
Rekursiv zinapoya - cho'qqiga chiqish yo'llari sonini hisoblashA
Maksimal kichik massivA
Sayohatchi sotuvchi muammosi - har bir shaharga tashrif buyuradigan va kelib chiqqan shaharga qaytib keladigan eng qisqa yo'lA
Diskret Furye transformatsiyasi - vaqt funksiyasini (signalni) uni tashkil etuvchi chastotalarga ajratish
-
Greedy - kelajakni o'ylamasdan, hozirgi vaqtda eng yaxshi variantni tanlash
B
Sakrash o'yiniA
Bog'lanmagan yukxalta muammosiA
Dijkstra Algoritmi - grafikning bir cho'qqisidan qolgan barcha nuqtalarga eng qisqa yo'llarni topishA
Prim Algoritmi - og'irlikdagi yo'naltirilmagan grafik uchun Minimal kengayuvchi daraxtni (MST) topishA
Kruskal Algoritmi - og'irlikdagi yo'naltirilmagan grafik uchun Minimal kengayuvchi daraxtni (MST) topish
-
Divide and Conquer - muammoni kichikroq qismlarga bo'lib va keyin bu qismlarni hal qilish
B
Ikkilik qidiruvB
Xanoy minorasiB
Paskal uchburchagiB
Evklid Algoritmi - eng katta umumiy bo'luvchini (EKUB) hisoblashB
Birlashtirish tartibiB
Tezkor saralashB
Birinchi-pastga qarab qidirish daraxti (DFS)B
Birinchi-pastga qarab qidirish grafigi (DFS)B
Matritsalar - turli shakldagi matritsalarni hosil qilish va kesib o'tishB
Sakrash o'yiniB
Tez ko'tarishB
Aksiyalarni sotib olish va sotish uchun eng yaxshi vaqt - bo'linib-zabt etish va bir marta o'tish misollariA
Permutatsiyalar (takroriyalash bilan va takroriyalashsiz)A
Kombinatsiyalar (takroriyalash bilan va takroriyalashsiz)A
Maksimal kichik massiv
-
Dinamik dasturlash - ilgari topilgan kichik yechimlar yordamida yechim yaratish
B
Fibonachchi raqamB
Sakrash o'yiniB
Noyob yo'llarB
Yomg'ir teraslari - yomg'ir suvini to'plash muammosiB
Recursive Staircase - count the number of ways to reach to the topB
Seam Carving - kontentga moslashuvchan rasm o'lchamini o'zgartirish algoritmiA
Levenshtein masofasi - ikki ketma-ketlik o'rtasidagi minimal tahrirlash masofasiA
Eng uzun umumiy ketma-ketlik (LCS)A
Eng uzun umumiy kichik matnA
Eng uzun ortib boruvchi ketma-ketlikA
Eng qisqa umumiy ketma-ketlikA
0/1 Knapsak muommosiA
Butun sonlarni bo'lishA
Maksimal kichik massivA
Bellman-Ford Algoritmi - grafikning bir cho'qqisidan qolgan barcha nuqtalarga eng qisqa yo'llarni topishA
Floyd-Warshall Algoritmi -grafikning barcha uchlari orasidagi eng qisqa masofalarni topishA
Regulyar ifoda moslashuvi
-
Backtracking - brute forcega o'xshab, barcha mumkin bo'lgan yechimlarni generatsiya qilishga harakat qiladi, lekin har safar keyingi yechimni yaratganingizda, yechim barcha shartlarga javob beradimi yoki yo'qligini tekshirasiz va shundan keyingina keyingi yechimlarni ishlab chiqarishni davom ettirasiz. Aks holda, orqaga qaytib, yechim topishning boshqa yo'liga o'tasiz. Odatda state-space ning DFS-qidiruvi ishlatiladi.
B
Sakrash o'yiniB
Noyob yo'llarB
Power Set - to'plamning barcha kichik to'plamlariA
Gamilton sikli - Har bir cho'qqiga bir marta tashrif buyurishA
N-Queens muommosiA
Ritsar sayohatiA
Kombinatsiya yig'indisi - ma'lum summani tashkil etuvchi barcha kombinatsiyalarni topish
-
Branch & Bound - shu paytgacha topilgan eng arzon echimdan kattaroq xarajatlarga ega qisman echimlarni bekor qilish uchun, backtracking qidiruvining har bir bosqichida topilgan eng arzon echimni eslab qoling va shu paytgacha topilgan eng arzon yechim narxidan muammoni eng kam xarajatli yechim narxining past chegarasi sifatida foydalaning. Odatda state-space daraxtining DFS o'tishi bilan birgalikda BFS traversal qo'llaniladi.
Ushbu repozitoriyadan qanday foydalanish kerak
Barcha dependensiylarni o'rnating
npm install
ESLint ni ishga tushiring
Kod sifatini tekshirish uchun ESLint ni ishga tushirishingiz mumkin.
npm run lint
Barcha testlarni ishga tushuring
npm test
Testlarni nom bo'yicha ishga tushirish
npm test -- 'LinkedList'
Muammolarni bartaraf qilish (Troubleshooting)
Agar linting yoki sinov muvaffaqiyatsiz bo'lsa, node_modules
papkasini o'chirib, npm paketlarini qayta o'rnatishga harakat qiling:
rm -rf ./node_modules
npm i
Shuningdek, to'g'ri Node versiyasidan foydalanayotganingizga ishonch hosil qiling (>=16
). Agar Node versiyasini boshqarish uchun nvm dan foydalanayotgan bo'lsangiz, loyihaning ildiz papkasidan nvm use
ni ishga tushiring va to'g'ri versiya tanlanadi.
O'yin maydoni (Playground)
./src/playground/playground.js
faylida ma'lumotlar strukturalari va algoritmlar bilan o'ynashingiz, ./src/playground/test/playground.test.js
faylida esa ular uchun testlar yozishingiz mumkin.
Shundan so'ng, playground kodingiz kutilgandek ishlashini tekshirish uchun quyidagi buyruqni ishga tushirishingiz kifoya:
npm test -- 'playground'
Foydali ma'lumotlar
Manbalar
Big O Notation
Big O notation algoritmlarni kirish hajmi oshgani sayin ularning ishlash vaqti yoki bo'sh joy talablari qanday o'sishiga qarab tasniflash uchun ishlatiladi. Quyidagi jadvalda siz Big O notatsiyasida ko'rsatilgan algoritmlarning o'sishining eng keng tarqalgan tartiblarini topishingiz mumkin.
Manba: Big O Cheat Sheet.
Quyida eng ko'p qo'llaniladigan Big O notatsiyalarining ro'yxati va ularning kirish ma'lumotlarining turli o'lchamlariga nisbatan ishlashini taqqoslash keltirilgan.
Big O Notatsiya | Turi | 10 ta element uchun hisob-kitoblar | 100 ta element uchun hisob-kitoblar | 1000 ta element uchun hisob-kitoblar |
---|---|---|---|---|
O(1) | O'zgarmas | 1 | 1 | 1 |
O(log N) | Logarifmik | 3 | 6 | 9 |
O(N) | Chiziqli | 10 | 100 | 1000 |
O(N log N) | n log(n) | 30 | 600 | 9000 |
O(N^2) | Kvadrat | 100 | 10000 | 1000000 |
O(2^N) | Eksponensial | 1024 | 1.26e+29 | 1.07e+301 |
O(N!) | Faktorial | 3628800 | 9.3e+157 | 4.02e+2567 |
Ma'lumotlar tuzilmalarining operatsiyalari murakkabligi
Ma'lumotlar tuzilmalari | Kirish | Qidirish | Kiritish | O'chirish | Izohlar |
---|---|---|---|---|---|
Massiv | 1 | n | n | n | |
Stak | n | n | 1 | 1 | |
Navbat | n | n | 1 | 1 | |
Bog'langan ro'yhat | n | n | 1 | n | |
Hash jadval | - | n | n | n | Mukammal xash funksiyasi bo'lsa, xarajatlar O (1) bo'ladi. |
Ikkilik qidiruv daraxti | n | n | n | n | Balanslangan daraxt narxida O(log(n)) bo'ladi. |
B-daraxti | log(n) | log(n) | log(n) | log(n) | |
Qizil-qora daraxt | log(n) | log(n) | log(n) | log(n) | |
AVL Daraxt | log(n) | log(n) | log(n) | log(n) | |
Bloom filtri | - | 1 | 1 | - | Qidiruv paytida noto'g'ri pozitivlar bo'lishi mumkin |
Massivlarni saralash algoritmlarining murakkabligi
Nomi | Eng yaxshi | O'rta | Eng yomon | Xotira | Barqaror | Izohlar |
---|---|---|---|---|---|---|
Pufakcha tartiblash | n | n2 | n2 | 1 | Ha | |
Kiritish tartibi | n | n2 | n2 | 1 | Ha | |
Tanlash tartibi | n2 | n2 | n2 | 1 | Yo'q | |
Heap tartibi | n log(n) | n log(n) | n log(n) | 1 | Yo'q | |
Birlashtirish tartibi | n log(n) | n log(n) | n log(n) | n | Ha | |
Tezkor saralash | n log(n) | n log(n) | n2 | log(n) | Yo'q | Tezkor saralash odatda O(log(n)) stek maydoni bilan joyida amalga oshiriladi |
Shell tartiblash | n log(n) | depends on gap sequence | n (log(n))2 | 1 | Yo'q | |
Sanash tartibi | n + r | n + r | n + r | n + r | Ha | r - massivdagi eng katta raqam |
Radiksli tartiblash | n * k | n * k | n * k | n + k | Ha | k - eng uzun kalitning uzunligi |
Loyihani qo'llab-quvvatlovchilar
Siz ushbu loyihani ❤️️ GitHub yoki ❤️️ Patreon orqali qo'llab-quvvatlashingiz mumkin.
Ushbu loyihani qo'llab-quvvatlagan odamlar ∑ = 1
Muallif
A few more projects and articles about JavaScript and algorithms on trekhleb.dev