This commit is contained in:
Ilya Kantor 2016-03-04 19:06:22 +03:00
parent e78e527866
commit 05a93ced80
212 changed files with 3213 additions and 3968 deletions

View file

@ -1,11 +1,10 @@
# Решение перебором (медленное)
Пройдём по массиву вложенным циклом.
Пройдём по массиву вложенным циклом.
Для каждого элемента мы будем искать, был ли такой уже. Если был -- игнорировать:
```js
//+ run
```js run
function unique(arr) {
var result = [];
@ -36,12 +35,10 @@ alert( unique(strings) ); // кришна, харе, 8-()
В этом случае для каждого элемента понадобится обойти весь текущий массив результатов, после чего -- добавить в этот массив.
<ol>
<li>Для первого элемента -- это обойдётся в `0` операций доступа к элементам `result` (он пока пустой).</li>
<li>Для второго элемента -- это обойдётся в `1` операцию доступа к элементам `result`.</li>
<li>Для третьего элемента -- это обойдётся в `2` операции доступа к элементам `result`.</li>
<li>...Для n-го элемента -- это обойдётся в `n-1` операций доступа к элементам `result`.</li>
</ol>
1. Для первого элемента -- это обойдётся в `0` операций доступа к элементам `result` (он пока пустой).
2. Для второго элемента -- это обойдётся в `1` операцию доступа к элементам `result`.
3. Для третьего элемента -- это обойдётся в `2` операции доступа к элементам `result`.
4. ...Для n-го элемента -- это обойдётся в `n-1` операций доступа к элементам `result`.
Всего <code>0 + 1 + 2 + ... + n-1 = (n-1)*n/2 = n<sup>2</sup>/2 - n/2</code> (как сумма арифметической прогрессии), то есть количество операций растёт примерно как квадрат от `n`.
@ -53,12 +50,11 @@ alert( unique(strings) ); // кришна, харе, 8-()
Наилучшая техника для выбора уникальных строк -- использование вспомогательного объекта `obj`. Ведь название свойства в объекте, с одной стороны -- строка, а с другой -- всегда уникально. Повторная запись в свойство с тем же именем перезапишет его.
Например, если `"харе"` попало в объект один раз (`obj["харе"] = true`), то второе такое же присваивание ничего не изменит.
Например, если `"харе"` попало в объект один раз (`obj["харе"] = true`), то второе такое же присваивание ничего не изменит.
Решение ниже создаёт объект `obj = {}` и записывает в него все строки как имена свойств. А затем собирает свойства из объекта в массив через `for..in`. Дубликатов уже не будет.
```js
//+ run
```js run
function unique(arr) {
var obj = {};