Skip to content

Commit

Permalink
Update ru pages (#2988)
Browse files Browse the repository at this point in the history
  • Loading branch information
artemkorsakov authored Mar 4, 2024
1 parent 9ed8c38 commit 5bb982d
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 86 deletions.
93 changes: 46 additions & 47 deletions _ru/overviews/parallel-collections/concrete-parallel-collections.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@ num: 2

[ParRange](https://www.scala-lang.org/api/{{ site.scala-212-version }}/scala/collection/parallel/immutable/ParRange.html) представляет собой упорядоченную последовательность элементов, отстоящих друг от друга на одинаковые промежутки. Параллельный диапазон создается подобно последовательному [Range](https://www.scala-lang.org/api/{{ site.scala-212-version }}/scala/collection/immutable/Range.html):

scala> 1 to 3 par
scala> (1 to 3).par
res0: scala.collection.parallel.immutable.ParRange = ParRange(1, 2, 3)

scala> 15 to 5 by -2 par
scala> (15 to 5 by -2).par
res1: scala.collection.parallel.immutable.ParRange = ParRange(15, 13, 11, 9, 7, 5)

Подобно тому, как последовательные диапазоны не имеют строителей, параллельные диапазоны не имеют [компоновщиков]({{ site.baseurl }}/ru/overviews/parallel-collections/architecture.html). При создании отображения (mapping) элементов параллельного диапазона получается параллельный вектор. Последовательные и параллельные диапазоны могут эффективно преобразовываться друг в друга вызовами методов `seq` и `par`.
Expand All @@ -72,7 +72,7 @@ num: 2
scala> val phs = scala.collection.parallel.immutable.ParHashSet(1 until 1000: _*)
phs: scala.collection.parallel.immutable.ParHashSet[Int] = ParSet(645, 892, 69, 809, 629, 365, 138, 760, 101, 479,...

scala> phs map { x => x * x } sum
scala> phs.map(x => x * x).sum
res0: Int = 332833500

[Компоновщики]({{ site.baseurl }}/overviews/parallel-collections/architecture.html) параллельных хэш-деревьев действуют аналогично компоновщикам хэш-таблиц, а именно предварительно распределяют элементы по блокам, а после этого параллельно составляют результирующее хэш-дерево, назначая обработку различных блоков разным процессорам, каждый из которых независимо собирает свое поддерево.
Expand All @@ -88,19 +88,19 @@ num: 2

scala> while (numbers.nonEmpty) {
| numbers foreach { case (num, sqrt) =>
| val nsqrt = 0.5 * (sqrt + num / sqrt)
| numbers(num) = nsqrt
| if (math.abs(nsqrt - sqrt) < 0.01) {
| println(num, nsqrt)
| numbers.remove(num)
| }
| }
| }
(1.0,1.0)
| val nsqrt = 0.5 * (sqrt + num / sqrt)
| numbers(num) = nsqrt
| if (math.abs(nsqrt - sqrt) < 0.01) {
| println(num, nsqrt)
| numbers.remove(num)
| }
| }
| }
(1.0,1.0)
(2.0,1.4142156862745097)
(7.0,2.64576704419029)
(4.0,2.0000000929222947)
...
...

[Компоновщики]({{ site.baseurl }}/ru/overviews/parallel-collections/architecture.html) реализованы как `TrieMap`-- так как эта структура является многопоточной, при вызове метода трансформации создается только один компоновщик, разделяемый всеми процессорами.

Expand All @@ -110,53 +110,52 @@ num: 2

Характеристики производительности последовательных типов (sequence types):

| | head | tail | apply | update| prepend | append | insert |
| -------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| `ParArray` | C | L | C | C | L | L | L |
| `ParVector` | eC | eC | eC | eC | eC | eC | - |
| `ParRange` | C | C | C | - | - | - | - |
| | head | tail | apply | update | prepend | append | insert |
| ----------- | ---- | ---- | ----- | ------ | ------- | ------ | ------ |
| `ParArray` | C | L | C | C | L | L | L |
| `ParVector` | eC | eC | eC | eC | eC | eC | - |
| `ParRange` | C | C | C | - | - | - | - |

Характеристики производительности множеств (set) и ассоциативных массивов (map):

| | lookup | add | remove |
| -------- | ---- | ---- | ---- |
| **неизменяемые** | | | |
| `ParHashSet`/`ParHashMap`| eC | eC | eC |
| **изменяемые** | | | |
| `ParHashSet`/`ParHashMap`| C | C | C |
| `ParTrieMap` | eC | eC | eC |

| | lookup | add | remove |
| ------------------------- | ------ | --- | ------ |
| **неизменяемые** | | | |
| `ParHashSet`/`ParHashMap` | eC | eC | eC |
| **изменяемые** | | | |
| `ParHashSet`/`ParHashMap` | C | C | C |
| `ParTrieMap` | eC | eC | eC |

### Расшифровка

Обозначения в двух представленных выше таблицах означают следующее:

| | |
| --- | ---- |
| **C** | Операция (быстрая) выполняется за постоянное время. |
| **eC** | Операция выполняется за фактически постоянное время, но только при соблюдении некоторых предположений, например о максимальной длине вектора или распределении хэш-кодов.|
| | |
| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **C** | Операция (быстрая) выполняется за постоянное время. |
| **eC** | Операция выполняется за фактически постоянное время, но только при соблюдении некоторых предположений, например о максимальной длине вектора или распределении хэш-кодов. |
| **aC** | Операция выполняется за амортизированное постоянное время. Некоторые вызовы операции могут выполняться медленнее, но при подсчете времени выполнения большого количества операций выходит, что в среднем на операцию требуется постоянное время. |
| **Log** | Операция занимает время, пропорциональное логарифму размера коллекции. |
| **L** | Операция линейна, то есть занимает время, пропорциональное размеру коллекции. |
| **-** | Операция не поддерживается. |
| **Log** | Операция занимает время, пропорциональное логарифму размера коллекции. |
| **L** | Операция линейна, то есть занимает время, пропорциональное размеру коллекции. |
| **-** | Операция не поддерживается. |

Первая таблица трактует последовательные типы-- изменяемые и неизменяемые-- в контексте выполнения следующих операций:

| | |
| --- | ---- |
| **head** | Получение первого элемента последовательности. |
| **tail** | Получение новой последовательности, состоящей из всех элементов исходной, кроме первого. |
| **apply** | Индексирование. |
| **update** | Функциональное обновление (с помощью `updated`) для неизменяемых последовательностей, обновление с побочными действиями (с помощью `update`) для изменяемых. |
| **prepend**| Добавление элемента в начало последовательности. Для неизменяемых последовательностей создается новая последовательность, для изменяемых-- модифицируется существующая. |
| **append** | Добавление элемента в конец последовательности. Для неизменяемых последовательностей создается новая последовательность, для изменяемых-- модифицируется существующая. |
| **insert** | Вставка элемента в выбранную позицию последовательности. Поддерживается только изменяемыми последовательностями. |
| | |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **head** | Получение первого элемента последовательности. |
| **tail** | Получение новой последовательности, состоящей из всех элементов исходной, кроме первого. |
| **apply** | Индексирование. |
| **update** | Функциональное обновление (с помощью `updated`) для неизменяемых последовательностей, обновление с побочными действиями (с помощью `update`) для изменяемых. |
| **prepend** | Добавление элемента в начало последовательности. Для неизменяемых последовательностей создается новая последовательность, для изменяемых-- модифицируется существующая. |
| **append** | Добавление элемента в конец последовательности. Для неизменяемых последовательностей создается новая последовательность, для изменяемых-- модифицируется существующая. |
| **insert** | Вставка элемента в выбранную позицию последовательности. Поддерживается только изменяемыми последовательностями. |

Вторая таблица рассматривает изменяемые и неизменяемые множества и ассоциативные массивы в контексте следующих операций:

| | |
| --- | ---- |
| | |
| ---------- | ---------------------------------------------------------------------------------------------- |
| **lookup** | Проверка принадлежности элемента множеству, или получение значения, ассоциированного с ключом. |
| **add** | Добавление нового элемента во множество или новой пары ключ/значение в ассоциативный массив. |
| **remove** | Удаление элемента из множества или ключа из ассоциативного массива. |
| **min** | Минимальный элемент множества или минимальный ключ ассоциативного массива. |
| **add** | Добавление нового элемента во множество или новой пары ключ/значение в ассоциативный массив. |
| **remove** | Удаление элемента из множества или ключа из ассоциативного массива. |
| **min** | Минимальный элемент множества или минимальный ключ ассоциативного массива. |
9 changes: 4 additions & 5 deletions _ru/scala3/book/fp-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,15 @@ previous-page: collections-summary
next-page: fp-what-is-fp
---


Scala позволяет писать код в стиле объектно-ориентированного программирования (ООП),
в стиле функционального программирования (ФП), а также в гибридном стиле, используя оба подхода в комбинации.
По словам [Martin Odersky](https://twitter.com/alexelcu/status/996408359514525696),
Scala позволяет писать код в стиле объектно-ориентированного программирования (ООП),
в стиле функционального программирования (ФП), а также в гибридном стиле, используя оба подхода в комбинации.
По словам Martin Odersky,
сущность Scala — это слияние функционального и объектно-ориентированного программирования в типизированной среде:

- Функции для логики
- Объекты для модульности

В этой главе предполагается, что вы знакомы с ООП и менее знакомы с ФП,
В этой главе предполагается, что вы знакомы с ООП и менее знакомы с ФП,
поэтому в ней представлено краткое введение в несколько основных концепций функционального программирования:

- Что такое функциональное программирование?
Expand Down
Loading

0 comments on commit 5bb982d

Please sign in to comment.