Допустим, у меня есть простая проблема, связанная с возвратом индекса появления всех символов в строке. Я знаю, что вы можете буквально запустить один цикл for и распечатать его, но допустим, мне нужно вернуть его в какой-то структуре данных!
Другие предположения: мы точно знаем, что это строка ASCII. В строке нет повторяющихся символов.
Я мог бы сделать одну из двух вещей.
Заранее инициализируйте хэш-карту со всеми возможными 128 ключами и
None
в качестве значений.Переберите строку и просто обновите словарь/хэш-карту
, указав индекс в качестве значения ключа.Переберите элементы словаря и удалите те пары ключ-значение, где значение равно
None
.ascii_occurrence = {'a': None, 'b': None, 'c': None ... char#128: None} #Initialize a hashmap with each of the 128 characters as key, and set None to its value. for charIndex in string: ascii_occurrence[string[charIndex]] = charIndex indexMap = {k: v for k, v in ascii_occurrence.items() if v is not None} print(indexMap)
Инициализируйте ПУСТОЙ хэш-карту без ключей или значений.
Переберите строку и создайте пары ключ-значение.
ascii_occurrence = {} for charIndex in string: ascii_occurrence[string[charIndex]] = charIndex print(ascii_occurrence)
Я уверен, что временная сложность в обоих случаях равна O(N), но я не уверен в пространственной сложности обоих подходов.
Рассуждая о космических сложностях:
Подход 1, мое пространство не «ЗАВИСИТ» от размера ввода. Вы можете предположить, что хэш-карта со 128 ключами уже существует, когда вы купили компьютер для запуска кода для этой конкретной цели. Я только обновляю значение, а не создаю новые ключи и расширяю хэш-карту в зависимости от моего ввода. В данном случае это O(1).
Подход 2, хэш-карта изначально пуста, в ней ничего нет, вам нужно было заполнить ее парами ключ-значение, перебирая строку. Так что на самом деле .. Насколько вы заполняете свой словарь, зависит от размера ввода. В данном случае это O(N).
Верен ли мой аргумент?