Использование значений в качестве ключей в массивах для уменьшения сложности при поиске элементов

Вот где-то я много делаю в PHP. Поиск иглы в стоге сена.

$names = [
    'Mike',
    'John',
    'Dave',
    'Tony'
];

$gotDave = in_array('Dave', $names);

Время выполнения in_array равно O (n), где n - количество элементов.

Я часто настраиваю свою структуру данных поиска, чтобы выглядеть так.

$names = [
    'Mike' => true,
    'John' => true,
    'Dave' => true,
    'Tony' => true
];

$gotDave = isset($names['Dave']);

Время выполнения O (1), потому что в php ассоциативный массив является хэшмапом.

Некоторые вопросы:

  • Должен ли я это сделать? это хорошая практика?
  • есть лучшее значение для правой руки

Ответ 1

Да, это отличное решение. Фактически, именно так, как Sets реализованы в основных библиотеках большинства языков программирования, - в верхней части моей головы Python, Ruby и Java делают это так. Язык Go не предоставляет Set и просто говорит вам, что вы сделали то, что вы сделали.

Я не могу думать о какой-либо причине использовать любое значение, отличное от true `` `true``. Это имеет смысл.

Ответ 2

вы можете использовать array_key_exists() для проверки ключа массива, в отличие от in_array, который проверяет значения

вам нужно будет использовать array_key_exists() вместо isset() в вашем случае