What does deterministic mean?

I am reading the Java Hashmap documentation but I don't understand this sentence.

Note that the iteration order for HashMap is non-deterministic. If you want deterministic iteration, use LinkedHashMap.

What does deterministic mean?

34
задан Peter Tillemans 25 August 2010 в 21:38
поделиться

10 ответов

Простейшее определение:

Учитывая те же входные данные, вы always получаете одни и те же выходные данные.

Выше говорится, что итерация через один и тот же HashMap может дать разные результаты в разное время, даже если вы ничего не изменили. Обычно это не имеет значения, но если это так, вы должны использовать LinkedHashMap.

42
ответ дан 27 November 2019 в 16:25
поделиться

В порядке, который можно «определить» заранее.

Из-за того, как работает хеширование, элементы на карте «зашифрованы» в произвольные места. Позиции скремблирования не могут быть легко определены заранее - они не поддаются определению - вы не знаете конечный порядок.

13
ответ дан 27 November 2019 в 16:25
поделиться

детерминированный: можно определить
недетерминированный: невозможно определить

5
ответ дан 27 November 2019 в 16:25
поделиться

Это алгоритм, который при задании определенных входных данных выдает тот же результат.

Хороший пример, который я нашел:

Рассмотрите список покупок: список предметы для покупки.

Это можно интерпретировать двумя способами:

 * Указание купить все эти предметы в любом порядке.
Это недетерминированный алгоритм.
* Инструкция купить все эти предметы в указанном порядке. Это
детерминированный алгоритм.
3
ответ дан 27 November 2019 в 16:25
поделиться

Недетерминированный означает, что нет ни одного единственного результата, который вы могли бы вычислить заранее. Арифметическое выражение, такое как 1 + 2 или log e, является детерминированным. Есть только один правильный ответ, и вы можете понять его заранее. Бросьте горсть песка в воздух, и то, куда упадет каждая песчинка, эффективно недетерминировано для любой большой степени точности.

Возможно, это не совсем правильно, так как вы могли бы посмотреть на исходный код базовой библиотеки и реализации JVM, и вероятно вы могли бы определить порядок, который получится в результате. Возможно, для них правильнее было бы сказать: «Никакой конкретный порядок не гарантируется» или что-то в этом роде.

В данном случае важно то, что вы не можете полагаться на порядок.

2
ответ дан 27 November 2019 в 16:25
поделиться

HashMap не поддерживает порядок того, что вы добавляете, если вы хотите, чтобы ваш вывод был в том порядке, в котором вы добавляете, вам следует использовать LinkedHashMap, поэтому детерминированный означает вывод упорядоченно того, что вы добавляете.

Здесь пример: 1.недетерминированный

    HashMap<String, Integer> map = new HashMap<String,Integer>();
    map.put("a",5);
    map.put("b",16);
    map.put("c",46);
    System.out.println(map); //ouptput:{a=5, c=46, b=16}

2.детерминированный

HashMap<String, Integer> map = new LinkedHashMap<String,Integer>();
            map.put("a",5);
            map.put("b",16);
            map.put("c",46);
            System.out.println(map); //output:{a=5, b=16, c=46}
-4
ответ дан 27 November 2019 в 16:25
поделиться

Детерминированный означает, что результат предсказуем / предсказуем.

2
ответ дан 27 November 2019 в 16:25
поделиться

Недетерминированный означает отсутствие четко определенного поведения.

В случае с HashMap в зависимости от того, как вы вставляете элементы, у вас может быть тот или иной порядок итерации.

0
ответ дан 27 November 2019 в 16:25
поделиться

Проще говоря: когда вы вызываете keys(), values() или entrySet(), вы возвращаете коллекцию, которую вы можете перебирать. В этой строке говорится, что вы не можете ожидать, что порядок, в котором итератор возвращает объекты, будет каким-то определенным порядком. В частности, он может отличаться как от порядка вставки, так и от естественного упорядочения по значениям ключа.

Если вы хотите, чтобы итератор работал в порядке вставки, используйте LinkedHashMap. Если вы хотите выполнить итерацию по значению ключа, используйте TreeMap. Имейте в виду, что оба они имеют немного худшую производительность, чем обычный HashMap, поскольку им обоим приходится выполнять дополнительную работу, чтобы отслеживать порядок.

8
ответ дан 27 November 2019 в 16:25
поделиться

Это свойство HashMap, где элементы не итерируются в том же порядке, в котором они были вставлены, поскольку HashMap не вставляет элементы по порядку. Поэтому строка в документации

0
ответ дан 27 November 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: