mirror of
https://github.com/bpmbpm/doc.git
synced 2026-04-29 20:10:48 +00:00
330 lines
18 KiB
Markdown
330 lines
18 KiB
Markdown
## array
|
||
## 1
|
||
### habr
|
||
- [Алгоритм моделирования многомерного массива данных, распределенных по нормальному закону](https://habr.com/ru/articles/145315/)
|
||
### excel
|
||
- https://www.excel-vba.ru/chto-umeet-excel/dinamicheskie-massivy-v-excel/ Начнем с того, что динамические массивы будут доступны пользователям следующих версий Excel:
|
||
- 365 офис (по подписке)
|
||
- офис 2021 (для MAC и для Windows)
|
||
### js
|
||
- https://selectel.ru/blog/array-methods-part-1/
|
||
|
||
## 2
|
||
### tuples_or_sets
|
||
- https://www.reddit.com/r/learnpython/comments/ve6fe5/why_use_tuples_or_sets_instead_of_lists/?tl=ru Список
|
||
Очень похож на кортеж в использовании, но очень отличается по концепции. Техническое объяснение состоит в том, что список - это изменяемая упорядоченная коллекция, то есть ее состояние может меняться, но порядок элементов гарантирован.
|
||
- https://informatics.msk.ru/mod/book/view.php?id=49881
|
||
|
||
## 3 AI
|
||
### array
|
||
В функции есть несколько массивов - как входящие данные и несколько массивов - как результат функции. Как записать математически?
|
||
|
||
Понял, вы хотите, чтобы математическая запись функции с несколькими массивами на входе и выходе была оформлена только с помощью `$` (инлайн) и `$$` (дисплей) — так формулы гарантированно корректно отображаются на GitHub (через MathJax). Ниже привожу варианты, используя только эти конструкции.
|
||
|
||
---
|
||
|
||
## 1. Математическая нотация
|
||
В математике массивы обычно рассматриваются как элементы множеств
|
||
|
||
### Вариант 1: Декартово произведение (дисплейная формула)
|
||
|
||
$$
|
||
f: A_1 \times A_2 \times \dots \times A_k \;\longrightarrow\; B_1 \times B_2 \times \dots \times B_m
|
||
$$
|
||
|
||
### Вариант 2: Значение функции — кортеж (дисплейная формула)
|
||
|
||
$$
|
||
f(a_1, a_2, \dots, a_k) = (b_1, b_2, \dots, b_m)
|
||
$$
|
||
|
||
где $a_i \in A_i$, $b_j \in B_j$.
|
||
|
||
### Вариант 3: Векторная форма (если все массивы одного типа)
|
||
|
||
$$
|
||
f: A^k \to B^m,\qquad f(\mathbf{a}) = \mathbf{b}
|
||
$$
|
||
|
||
с $\mathbf{a} \in A^k$, $\mathbf{b} \in B^m$.
|
||
|
||
### Вариант 4: Теоретико-множественное определение (с использованием $\subseteq$)
|
||
|
||
$$
|
||
f \subseteq (A_1 \times \dots \times A_k) \times (B_1 \times \dots \times B_m)
|
||
$$
|
||
|
||
и для каждого входа существует ровно один выход.
|
||
|
||
---
|
||
|
||
## 2. Программирование (кратко, с акцентом на сигнатуры)
|
||
|
||
На GitHub в блоках кода формулы не нужны, поэтому просто приведу примеры сигнатур.
|
||
|
||
**Python (кортеж):**
|
||
```python
|
||
def process(arr1: list, arr2: list) -> tuple[list, list]:
|
||
...
|
||
```
|
||
|
||
**C (выходные параметры):**
|
||
```c
|
||
void process(int* in1, int* in2, int* out1, int* out2);
|
||
```
|
||
|
||
**Go (структура):**
|
||
```go
|
||
type Result struct { Out1 []int; Out2 []int }
|
||
func process(in1, in2 []int) Result
|
||
```
|
||
|
||
Если нужно именно математическое описание для GitHub — используйте приведённые выше формулы с `$` и `$$`, они будут отображаться корректно.
|
||
|
||
---
|
||
|
||
## 3. Замечания
|
||
|
||
- В математике часто стремятся объединить несколько выходных массивов в один (например, в виде матрицы, где столбцы — отдельные массивы), чтобы функция возвращала один объект.
|
||
- В программировании предпочтение отдаётся ясности: лучше явно указать типы и имена возвращаемых значений (через кортеж, объект или структуру), чем смешивать их в одном массиве.
|
||
- Если входные массивы имеют одинаковую структуру, их часто передают как один массив массивов (список списков).
|
||
|
||
## 4
|
||
Если вы хотите математически записать функцию, которая принимает два массива (`in1`, `in2`) и возвращает два массива (`out1`, `out2`), используя разделитель (например, `;`), то можно применить несколько подходов. В строгой математике функция обычно отображает входы в выходы, поэтому выходы не указываются в списке аргументов. Однако для наглядности или в неформальных текстах часто используют обозначения, где точка с запятой отделяет входные параметры от выходных. Ниже приведены наиболее близкие варианты, которые работают в математических текстах и на GitHub с использованием только `$` и `$$`.
|
||
|
||
---
|
||
|
||
### 1. Запись с разделителем в определении функции (нестрогая, но понятная)
|
||
Можно просто написать имя функции и перечислить входы и выходы через точку с запятой, пояснив смысл.
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}; \text{out1}, \text{out2})
|
||
$$
|
||
|
||
*Подразумевается, что `in1`, `in2` — аргументы, `out1`, `out2` — результаты.*
|
||
|
||
---
|
||
|
||
### 2. Запись как отношение (математически корректно)
|
||
Функцию можно рассматривать как отношение между входами и выходами. Тогда точка с запятой отделяет входные переменные от выходных.
|
||
|
||
$$
|
||
R(\text{in1}, \text{in2}; \text{out1}, \text{out2})
|
||
$$
|
||
|
||
где $R$ — отношение, связывающее входы с выходами. Если это отношение функционально по входам, то оно фактически задаёт функцию.
|
||
|
||
---
|
||
|
||
### 3. Использование кортежей и стрелки
|
||
Классический способ — показать отображение из декартова произведения множеств входов в декартово произведение множеств выходов. Разделитель `;` можно использовать внутри текста для пояснения.
|
||
|
||
$$
|
||
F: A_1 \times A_2 \;\longrightarrow\; B_1 \times B_2
|
||
$$
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}) = (\text{out1}, \text{out2})
|
||
$$
|
||
|
||
*Точка с запятой может быть добавлена в словесном описании: «где in1, in2 — входные массивы; out1, out2 — выходные».*
|
||
|
||
---
|
||
|
||
### 4. Нотация, имитирующая программирование (с разделителем)
|
||
Если вы хотите в точности повторить стиль `fun(in1, in2 ; out1, out2)`, то в математическом тексте это можно оформить так:
|
||
|
||
$$
|
||
\text{fun}(\text{in1}, \text{in2} \;;\; \text{out1}, \text{out2})
|
||
$$
|
||
|
||
или
|
||
|
||
$$
|
||
\text{fun}(\text{in1}, \text{in2}; \text{out1}, \text{out2})
|
||
$$
|
||
с пояснением, что выходные параметры перечислены после точки с запятой.
|
||
|
||
---
|
||
|
||
### 5. Запись с использованием вертикальной черты (альтернатива)
|
||
Иногда для разделения входов и выходов используют вертикальную черту, но точка с запятой тоже встречается:
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2} \mid \text{out1}, \text{out2})
|
||
$$
|
||
|
||
---
|
||
|
||
### Рекомендация для GitHub
|
||
Для гарантированного отображения используйте только `$` и `$$`. Например:
|
||
|
||
```markdown
|
||
|
||
$$ \text{fun}(\text{in1}, \text{in2}; \text{out1}, \text{out2}) $$
|
||
|
||
```
|
||
Это будет выглядеть как одна формула, а точка с запятой будет просто символом разделения. Если нужна более строгая математическая форма, выберите вариант с отношением или со стрелкой.
|
||
|
||
---
|
||
|
||
### Итог
|
||
Наиболее близкие к вашему запросу варианты:
|
||
- **Неформальный:** $\text{fun}(\text{in1}, \text{in2}; \text{out1}, \text{out2})$
|
||
- **Формальный (отношение):** $R(\text{in1}, \text{in2}; \text{out1}, \text{out2})$
|
||
- **Классический:** $F: A_1 \times A_2 \to B_1 \times B_2$, $F(\text{in1}, \text{in2}) = (\text{out1}, \text{out2})$
|
||
|
||
## 5
|
||
Приведи вариант, когда используется упорядоченная коллекция, т.е. in1 имеет всегда первую позицию и отображается (при применении функции) в out 1. Тоже самое с in2 и out2.
|
||
|
||
Отвечу по пунктам.
|
||
|
||
---
|
||
|
||
## 1. Чем отличается вариант 1 от варианта 2?
|
||
|
||
В предыдущем ответе я привёл два похожих варианта:
|
||
|
||
1. **Неформальная функция с разделителем**
|
||
|
||
$$
|
||
\text{fun}(\text{in1}, \text{in2}; \text{out1}, \text{out2})
|
||
$$
|
||
|
||
Это просто **обозначение**, принятое в некоторых инженерных или алгоритмических текстах: точка с запятой визуально отделяет входные переменные от выходных. Математически такая запись не является стандартной сигнатурой функции — это скорее мнемоническое соглашение.
|
||
|
||
2. **Отношение**
|
||
|
||
$$
|
||
R(\text{in1}, \text{in2}; \text{out1}, \text{out2})
|
||
$$
|
||
|
||
Здесь $R$ — это **бинарное отношение** между кортежами входов и кортежами выходов. Если для каждого набора входов существует **ровно один** набор выходов, то такое отношение эквивалентно функции. Однако в математике отношение — более общее понятие (может допускать несколько выходов для одних входов). Запись с точкой с запятой в данном случае показывает, что переменные слева — это аргументы, справа — значения.
|
||
|
||
**Главное отличие**:
|
||
- В (1) мы просто **обозначаем функцию**, но не уточняем её природу.
|
||
- В (2) мы явно говорим, что имеем дело с **отношением**, что строже, но для детерминированной функции избыточно.
|
||
|
||
Если ваша функция детерминирована и всегда возвращает ровно два массива, то разница лишь в уровне строгости. На практике для описания алгоритмов чаще используют (1) как краткую запись.
|
||
|
||
---
|
||
|
||
## 2. Лучший вариант, когда `in1` отображается в `out1`, а `in2` — в `out2` (упорядоченная коллекция)
|
||
|
||
Если подразумевается, что функция работает **покомпонентно** (первый вход соответствует первому выходу, второй — второму) и при этом сохраняется структура, то лучше использовать **явное указание компонент отображения**. Есть несколько способов сделать это математически корректно и наглядно.
|
||
|
||
### Способ А: Прямое произведение функций
|
||
Записать, что функция $F$ является парой независимых функций $F_1$ и $F_2$:
|
||
|
||
$$
|
||
F: A_1 \times A_2 \;\longrightarrow\; B_1 \times B_2
|
||
$$
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}) = \bigl( f_1(\text{in1}),\; f_2(\text{in2}) \bigr)
|
||
$$
|
||
|
||
где $f_1: A_1 \to B_1$, $f_2: A_2 \to B_2$.
|
||
|
||
Это самый математически строгий вариант. Он чётко показывает, что первый выход зависит только от первого входа, а второй — только от второго.
|
||
|
||
### Способ Б: Запись с индексами
|
||
Если функция не обязательно распадается на независимые подфункции, но результат сохраняет порядок (первый выход соответствует первому входу, но может зависеть от обоих входов), то можно явно указать:
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}) = (\text{out1}, \text{out2})
|
||
$$
|
||
|
||
с дополнительным условием:
|
||
*«Здесь out1 — результат, ассоциированный с in1; out2 — результат, ассоциированный с in2»*.
|
||
|
||
В тексте это можно подчеркнуть словами или введя обозначение $F = (F_1, F_2)$.
|
||
|
||
### Способ В: Использование кортежей и проекций
|
||
Можно определить функцию через проекции:
|
||
|
||
$$
|
||
\text{out1} = \pi_1\bigl( F(\text{in1}, \text{in2}) \bigr), \quad
|
||
\text{out2} = \pi_2\bigl( F(\text{in1}, \text{in2}) \bigr)
|
||
$$
|
||
|
||
где $\pi_i$ — проекция на $i$-ю компоненту. Это показывает, что выходы упорядочены.
|
||
|
||
---
|
||
|
||
## 3. Примеры для наглядности
|
||
|
||
### Пример 1 (независимые преобразования)
|
||
Пусть $in1$ — массив чисел, $in2$ — массив строк. Функция сортирует массив чисел и переводит строки в верхний регистр.
|
||
Математическая запись:
|
||
|
||
$$
|
||
\text{process}: \mathbb{R}^n \times \Sigma^* \;\longrightarrow\; \mathbb{R}^n \times \Sigma^*
|
||
$$
|
||
|
||
$$
|
||
\text{process}(X, S) = \bigl( \text{sort}(X),\; \text{toUpper}(S) \bigr)
|
||
$$
|
||
|
||
Здесь $out1$ зависит только от $in1$, $out2$ — только от $in2$.
|
||
|
||
### Пример 2 (связанные преобразования)
|
||
Пусть $in1$ и $in2$ — два массива одинаковой длины, функция возвращает их сумму и разность.
|
||
Запись с сохранением порядка:
|
||
|
||
$$
|
||
F(X, Y) = (X + Y,\; X - Y)
|
||
$$
|
||
|
||
Здесь $out1$ соответствует паре $(in1, in2)$, $out2$ тоже соответствует паре, но чётко указано, что первый выход — сумма, второй — разность.
|
||
|
||
---
|
||
|
||
## 4. Рекомендуемый вариант для вашего случая
|
||
|
||
Если вы хотите подчеркнуть, что **первый вход отображается в первый выход, а второй вход — во второй выход** (и при этом результаты могут зависеть от обоих входов, но ассоциация сохраняется), то лучше всего использовать **явное определение компонент**:
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}) = \bigl( \text{out1}(\text{in1}, \text{in2}),\; \text{out2}(\text{in1}, \text{in2}) \bigr)
|
||
$$
|
||
|
||
Если же связь **покомпонентная и независимая** (out1 зависит только от in1, out2 — только от in2), то более строго:
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}) = \bigl( f_1(\text{in1}),\; f_2(\text{in2}) \bigr)
|
||
$$
|
||
|
||
Для краткости в тексте можно также использовать разделитель `;`, но обязательно пояснить, что он отделяет входы от выходов, а порядок сохраняется:
|
||
|
||
$$
|
||
\text{fun}(\text{in1}, \text{in2}; \text{out1}, \text{out2}) \quad\text{с условием, что out1 соответствует in1, out2 — in2}.
|
||
$$
|
||
|
||
---
|
||
|
||
## 5. Итоговая рекомендация (для GitHub, только $ и $$)
|
||
|
||
На GitHub используйте дисплейные формулы для наглядности:
|
||
|
||
```markdown
|
||
|
||
$$
|
||
F(\text{in1}, \text{in2}) = \bigl( \text{out1}(\text{in1}, \text{in2}),\; \text{out2}(\text{in1}, \text{in2}) \bigr)
|
||
$$
|
||
|
||
```
|
||
|
||
Или если требуется именно запись с точкой с запятой:
|
||
|
||
```markdown
|
||
|
||
$$
|
||
\text{fun}(\text{in1}, \text{in2}; \text{out1}, \text{out2})
|
||
$$
|
||
|
||
*где out1 — результат, соответствующий in1, out2 — результат, соответствующий in2.*
|
||
```
|
||
|
||
Оба варианта корректно отображаются и не требуют сложных пакетов.
|
||
|
||
|