Compare commits

...

10 Commits

Author SHA1 Message Date
Abdul Shaik
c03624681e
Merge 7264dcd802 into ca3d16dcce 2024-07-17 10:43:09 +09:00
Vlad Sosnov
ca3d16dcce
Update README.uk-UA.md (#991)
Co-authored-by: Oleksii Trekhleb <3000285+trekhleb@users.noreply.github.com>
2024-07-13 21:28:34 +02:00
Vicente Gutiérrez
e7f30a7bf7
Fix typos README.es-ES for linked list (#850) 2024-07-13 21:28:02 +02:00
Enzo
471e6d0791
Add es-ES translation to search/binary-search (#893) 2024-07-13 21:27:09 +02:00
Alaz Tetik
351a63a59f
Update README.md by correcting Turkish lang name (#904)
Co-authored-by: Oleksii Trekhleb <3000285+trekhleb@users.noreply.github.com>
2024-07-13 21:25:58 +02:00
Nikita Gurskiy
0e2b2574f8
update the ES README a lenguage correction (#952) 2024-07-13 21:23:02 +02:00
Youssef Rabei
0c054f782a
Update README.ar-AR.md (#959)
Co-authored-by: Oleksii Trekhleb <3000285+trekhleb@users.noreply.github.com>
2024-07-13 21:22:10 +02:00
JungHyunLah
6509304ff6
update LRU Cache translation for ko-KR (#987)
* feat: LRU cache translation in ko-KR

* chore: add readInAnotherLan for ko-KR

---------

Co-authored-by: Oleksii Trekhleb <3000285+trekhleb@users.noreply.github.com>
2024-07-13 21:20:23 +02:00
Stanislav Dolgachov
09afeb58d8
Update .eslintrc, improve UK translation for LinkedList (#1128)
* Add ignore patterns to eslint config

* Improve UK translation for LinkedList

---------

Co-authored-by: Oleksii Trekhleb <3000285+trekhleb@users.noreply.github.com>
2024-07-13 21:13:11 +02:00
Abdul Shaik
7264dcd802 Implement Binary Search algorithm for finding Longest Increasing Subsequence 2023-07-06 13:17:38 +05:30
12 changed files with 158 additions and 37 deletions

View File

@ -12,6 +12,7 @@
"arrow-body-style": "off",
"no-loop-func": "off"
},
"ignorePatterns": ["*.md", "*.png", "*.jpeg", "*.jpg"],
"settings": {
"react": {
"version": "18.2.0"

View File

@ -3,7 +3,7 @@
[![Build Status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms)
[![codecov](https://codecov.io/gh/trekhleb/javascript-algorithms/branch/master/graph/badge.svg)](https://codecov.io/gh/trekhleb/javascript-algorithms)
تحتوي هذا مقالة على أمثلة عديدة تستند إلى الخوارزميات الشائعة وهياكل البيانات في الجافا سكريبت.
تحتوي هذه المقالة على أمثلة عديدة تستند إلى الخوارزميات الشائعة وهياكل البيانات في الجافا سكريبت.
كل خوارزمية وهياكل البيانات لها برنامج README منفصل خاص بها
مع التفسيرات والروابط ذات الصلة لمزيد من القراءة (بما في ذلك تلك

View File

@ -70,7 +70,7 @@ definen con precisión una secuencia de operaciones.
* **Matemáticas**
* `P` [Manipulación de bits](src/algorithms/math/bits) - asignar/obtener/actualizar/limpiar bits, multiplicación/división por dos, hacer negativo, etc.
* `P` [Factorial](src/algorithms/math/factorial)
* `P` [Número de Fibonacci](src/algorithms/math/fibonacci)
* `P` [Sucesión de Fibonacci](src/algorithms/math/fibonacci)
* `P` [Prueba de primalidad](src/algorithms/math/primality-test) (método de división de prueba)
* `P` [Algoritmo de Euclides](src/algorithms/math/euclidean-algorithm) - calcular el Máximo común divisor (MCD)
* `P` [Mínimo común múltiplo](src/algorithms/math/least-common-multiple) (MCM)

View File

@ -0,0 +1,27 @@
# Búsqueda binaria
_Lea esto en otros idiomas:_
[English](README.md)
[Português brasileiro](README.pt-BR.md).
En informática, la búsqueda binaria, también conocida como búsqueda de medio intervalo
búsqueda, búsqueda logarítmica, o corte binario, es un algoritmo de búsqueda
que encuentra la posición de un valor objetivo dentro de una matriz
ordenada. La búsqueda binaria compara el valor objetivo con el elemento central
de la matriz; si son desiguales, se elimina la mitad en la que
la mitad en la que no puede estar el objetivo se elimina y la búsqueda continúa
en la mitad restante hasta que tenga éxito. Si la búsqueda
termina con la mitad restante vacía, el objetivo no está
en la matriz.
![Búsqueda binaria](https://upload.wikimedia.org/wikipedia/commons/8/83/Binary_Search_Depiction.svg)
## Complejidad
**Complejidad de tiempo**: `O(log(n))` - ya que dividimos el área de búsqueda en dos para cada
siguiente iteración.
## Referencias
- [Wikipedia](https://en.wikipedia.org/wiki/Binary_search_algorithm)
- [YouTube](https://www.youtube.com/watch?v=P3YID7liBug&index=29&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)

View File

@ -2,15 +2,16 @@
_Read this in other languages:_
[Português brasileiro](README.pt-BR.md).
[Español](README.es-ES.md).
In computer science, binary search, also known as half-interval
search, logarithmic search, or binary chop, is a search algorithm
that finds the position of a target value within a sorted
array. Binary search compares the target value to the middle
element of the array; if they are unequal, the half in which
the target cannot lie is eliminated and the search continues
on the remaining half until it is successful. If the search
ends with the remaining half being empty, the target is not
In computer science, binary search, also known as half-interval
search, logarithmic search, or binary chop, is a search algorithm
that finds the position of a target value within a sorted
array. Binary search compares the target value to the middle
element of the array; if they are unequal, the half in which
the target cannot lie is eliminated and the search continues
on the remaining half until it is successful. If the search
ends with the remaining half being empty, the target is not
in the array.
![Binary Search](https://upload.wikimedia.org/wikipedia/commons/8/83/Binary_Search_Depiction.svg)

View File

@ -2,6 +2,7 @@
_Leia isso em outras línguas:_
[english](README.md).
[Español](README.es-ES.md).
Em ciência da computação, busca binária, também conhecida como busca de meio-intervalo, busca logarítmica ou corte binário, é um algoritmo de pesquisa
que encontra a posição de um elemento alvo dentro de um

View File

@ -0,0 +1,37 @@
/**
* Binary search-based approach to find longest increasing subsequence.
* Complexity: O(n log n)
*
* @param {number[]} sequence
* @return {number}
*/
export default function binarySearchLongestIncreasingSubsequence(sequence) {
const tails = []; // Array to store the smallest tail elements of increasing subsequences
// Iterate over the input sequence
for (let i = 0; i < sequence.length; i++) {
let left = 0;
let right = tails.length - 1;
// Perform binary search to find the largest index `j` where tails[j] <= sequence[i]
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (tails[mid] <= sequence[i]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// Update tails[j + 1] to sequence[i]
if (left === tails.length) {
tails.push(sequence[i]);
} else {
tails[left] = sequence[i];
}
}
// The length of the longest increasing subsequence is the index of the rightmost non-zero element in tails
return tails.length;
}

View File

@ -7,9 +7,9 @@ _Lee este artículo en otros idiomas:_
[_Português_](README.pt-BR.md)
[_English_](README.md)
En ciencias de la computaciòn una **lista enlazada** es una coleccion linear
de elementos de datos, en los cuales el orden linear no es dado por
su posciòn fisica en memoria. En cambio, cada
En ciencias de la computación una **lista enlazada** es una colección lineal
de elementos, en los cuales el orden lineal no es dado por
su posición física en memoria. En cambio, cada
elemento señala al siguiente. Es una estructura de datos
que consiste en un grupo de nodos los cuales juntos representan
una secuencia. En su forma más sencilla, cada nodo está
@ -19,10 +19,10 @@ permite la inserción o eliminación de elementos
desde cualquier posición en la secuencia durante la iteración.
Las variantes más complejas agregan enlaces adicionales, permitiendo
una eficiente inserción o eliminación desde referencias arbitrarias
del elemento. Una desventaja de las listas lazadas es que el tiempo de
del elemento. Una desventaja de las listas enlazadas es que el tiempo de
acceso es lineal (y difícil de canalizar). Un acceso
más rápido, como un acceso aleatorio, no es factible. Los arreglos
tienen una mejor locazion en caché comparados con las listas lazadas.
tienen una mejor localización en caché comparados con las listas enlazadas.
![Linked List](./images/linked-list.jpeg)
@ -112,7 +112,7 @@ Remove(head, value)
end Remove
```
### Atrevesar
### Atravesar
```text
Traverse(head)

View File

@ -1,10 +1,10 @@
# Зв'язаний список
Зв'язаний список — базова динамічна структура даних в інформатиці, що складається з вузлів, кожен з яких містить як дані, так посилання («зв'язку») на наступний вузол списку. Дана структура дозволяє ефективно додавати та видаляти елементи на довільній позиції у послідовності у процесі ітерації. Більш складні варіанти включають додаткові посилання, що дозволяють ефективно додавати та видаляти довільні елементи.
Зв'язаний список — базова динамічна структура даних в інформатиці, що складається з вузлів, кожен з яких містить як дані, так і посилання («зв'язку») на наступний вузол списку. Ця структура даних дозволяє ефективно додавати та видаляти елементи на довільній позиції у послідовності у процесі ітерації. Більш складні варіанти включають додаткові посилання, що дозволяють ефективно додавати та видаляти довільні елементи.
Принциповою перевагою перед масивом є структурна гнучкість: порядок елементів зв'язкового списку може збігатися з порядком розташування елементів даних у пам'яті комп'ютера, а порядок обходу списку завжди явно задається його внутрішніми зв'язками. Суть переваги у тому, що у багатьох мовах створення масиву вимагає вказати його заздалегідь. Зв'язковий список дозволяє обійти це обмеження.
Принциповою перевагою перед масивом є структурна гнучкість: порядок елементів зв'язаного списку може збігатися з порядком розташування елементів даних у пам'яті комп'ютера, а порядок обходу списку завжди явно задається його внутрішніми зв'язками. Це важливо, бо у багатьох мовах створення масиву вимагає вказати його розмір заздалегідь. Зв'язаний список дозволяє обійти це обмеження.
Недоліком зв'язкових списків є те, що час доступу є лінійним (і важко для реалізації конвеєрів). Неможливий швидкий доступ (випадковий).
Недоліком зв'язаних списків є те, що час доступу є лінійним (і важко для реалізації конвеєрів). Неможливий швидкий доступ (випадковий).
![Linked List](./images/linked-list.jpeg)
@ -17,7 +17,7 @@
```text
Add(value)
Pre: value - значення, що додається
Post: value поміщено в кінець списку
Post: value додано в кінець списку
n ← node(value)
if head = ø
head ← n
@ -32,7 +32,7 @@ end Add
```text
Prepend(value)
Pre: value - значення, що додається
Post: value поміщено на початок списку
Post: value додано на початку списку
n ← node(value)
n.next ← head
head ← n
@ -42,7 +42,7 @@ Prepend(value)
end Prepend
```
### Поиск
### Пошук
```text
Contains(head, value)
@ -60,7 +60,7 @@ Contains(head, value)
end Contains
```
### Вилучення
### Видалення
```text
Remove(head, value)
@ -94,7 +94,7 @@ Remove(head, value)
end Remove
```
### Обход
### Обхід
```text
Traverse(head)
@ -108,12 +108,12 @@ Traverse(head)
end Traverse
```
### Зворотний обхід
### Зворотній обхід
```text
ReverseTraversal(head, tail)
Pre: head и tail відносяться до одного списку
Post: елементи списку пройдено у зворотному порядку
Pre: head і tail відносяться до одного списку
Post: елементи списку пройдено у зворотньому порядку
if tail != ø
curr ← tail
while curr != head
@ -131,7 +131,7 @@ end ReverseTraversal
## Складність
### Тимчасова складність
### Часова складність
| Читання | Пошук | Вставка | Вилучення |
| :--------: | :-------: | :--------: | :-------: |
@ -143,5 +143,5 @@ O(n)
## Посилання
- [Wikipedia](https://uk.wikipedia.org/wiki/%D0%97%D0%B2%27%D1%8F%D0%B7%D0%B0%D0%BD%D0%B8%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)
- [Wikipedia](https://uk.wikipedia.org/wiki/Зв'язаний_список)
- [YouTube](https://www.youtube.com/watch?v=6snsMa4E1Os)

View File

@ -0,0 +1,51 @@
# LRU 캐시 알고리즘
**LRU 캐시 알고리즘** 은 사용된 순서대로 아이템을 정리함으로써, 오랜 시간 동안 사용되지 않은 아이템을 빠르게 찾아낼 수 있도록 한다.
한방향으로만 옷을 걸 수 있는 옷걸이 행거를 생각해봅시다. 가장 오랫동안 입지 않은 옷을 찾기 위해서는, 행거의 반대쪽 끝을 보면 됩니다.
## 문제 정의
LRUCache 클래스를 구현해봅시다:
- `LRUCache(int capacity)` LRU 캐시를 **양수**`capacity` 로 초기화합니다.
- `int get(int key)` `key` 가 존재할 경우 `key` 값을 반환하고, 그렇지 않으면 `undefined` 를 반환합니다.
- `void set(int key, int value)` `key` 가 존재할 경우 `key` 값을 업데이트 하고, 그렇지 않으면 `key-value` 쌍을 캐시에 추가합니다. 만약 이 동작으로 인해 키 개수가 `capacity` 를 넘는 경우, 가장 오래된 키 값을 **제거** 합니다.
`get()``set()` 함수는 무조건 평균 `O(1)` 의 시간 복잡도 내에 실행되어야 합니다.
## 구현
### 버전 1: 더블 링크드 리스트 + 해시맵
[LRUCache.js](./LRUCache.js) 에서 `LRUCache` 구현체 예시를 확인할 수 있습니다. 예시에서는 (평균적으로) 빠른 `O(1)` 캐시 아이템 접근을 위해 `HashMap` 을 사용했고, (평균적으로) 빠른 `O(1)` 캐시 아이템 수정과 제거를 위해 `DoublyLinkedList` 를 사용했습니다. (허용된 최대의 캐시 용량을 유지하기 위해)
![Linked List](./images/lru-cache.jpg)
_[okso.app](https://okso.app) 으로 만듦_
LRU 캐시가 어떻게 작동하는지 더 많은 예시로 확인하고 싶다면 LRUCache.test.js](./**test**/LRUCache.test.js) 파일을 참고하세요.
### 버전 2: 정렬된 맵
더블 링크드 리스트로 구현한 첫번째 예시는 어떻게 평균 `O(1)` 시간 복잡도가 `set()``get()` 으로 나올 수 있는지 학습 목적과 이해를 돕기 위해 좋은 예시입니다.
그러나, 더 쉬운 방법은 자바스크립트의 [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) 객체를 사용하는 것입니다. 이 `Map` 객체는 키-값 쌍과 키를 **추가하는 순서 원본** 을 지닙니다. 우리는 이걸 아이템을 제거하거나 다시 추가하면서 맵의 "가장 마지막" 동작에서 최근에 사용된 아이템을 유지하기 위해 사용할 수 있습니다. `Map` 의 시작점에 있는 아이템은 캐시 용량이 넘칠 경우 가장 먼저 제거되는 대상입니다. 아이템의 순서는 `map.keys()` 와 같은 `IterableIterator` 을 사용해 확인할 수 있습니다.
해당 구현체는 [LRUCacheOnMap.js](./LRUCacheOnMap.js) 의 `LRUCacheOnMap` 예시에서 확인할 수 있습니다.
이 LRU 캐시 방식이 어떻게 작동하는지 더 많은 테스트 케이스를 확인하고 싶다면 [LRUCacheOnMap.test.js](./__test__/LRUCacheOnMap.test.js) 파일을 참고하세요.
## 복잡도
| | 평균 |
| --------------- | ------ |
| 공간 | `O(n)` |
| 아이템 찾기 | `O(1)` |
| 아이템 설정하기 | `O(1)` |
## 참조
- [LRU Cache on LeetCode](https://leetcode.com/problems/lru-cache/solutions/244744/lru-cache/)
- [LRU Cache on InterviewCake](https://www.interviewcake.com/concept/java/lru-cache)
- [LRU Cache on Wiki](https://en.wikipedia.org/wiki/Cache_replacement_policies)

View File

@ -1,5 +1,8 @@
# Least Recently Used (LRU) Cache
_Read this in other languages:_
[한국어](README.ko-KR.md),
A **Least Recently Used (LRU) Cache** organizes items in order of use, allowing you to quickly identify which item hasn't been used for the longest amount of time.
Picture a clothes rack, where clothes are always hung up on one side. To find the least-recently used item, look at the item on the other end of the rack.
@ -22,7 +25,7 @@ See the `LRUCache` implementation example in [LRUCache.js](./LRUCache.js). The s
![Linked List](./images/lru-cache.jpg)
*Made with [okso.app](https://okso.app)*
_Made with [okso.app](https://okso.app)_
You may also find more test-case examples of how the LRU Cache works in [LRUCache.test.js](./__test__/LRUCache.test.js) file.
@ -38,11 +41,11 @@ You may also find more test-case examples of how the LRU Cache works in [LRUCach
## Complexities
| | Average |
|---|---|
| Space |`O(n)`|
| Get item | `O(1)` |
| Set item | `O(1)` |
| | Average |
| -------- | ------- |
| Space | `O(n)` |
| Get item | `O(1)` |
| Set item | `O(1)` |
## References

View File

@ -10,8 +10,8 @@
Додаткова операція для читання головного елемента (peek) дає доступ
до останнього елементу стека без зміни самого стека.
Найчастіше принцип роботи стека порівнюють зі чаркою тарілок: щоб узяти другу
зверху потрібно зняти верхню.
Найчастіше принцип роботи стека порівнюють із стопкою тарілок: щоб узяти другу
зверху потрібно спочатку зняти верхню.
Ілюстрація роботи зі стеком.