Привет! Во-первых, цикл видео - огонь! Спасибо! Но внесу немного полезной критики :) 19:55 "Если нам надо найти 10 пользователей, то нам придется итерироваться 10 раз по слайсу, если же мы используем мапу - то мы итерируемся только один раз, превращая мапу в слайс." На самом деле, поиск по массиву - всегда итерация, и всегда только одна, от первого элемента к последнему. И найдя элемент - мы завершаем итерацию. Сложность алгоритма - от O(1) (если элемент первый) до O(n) (если элемент последний). Не происходит десяти итераций :) А в поиске по мапе - вообще нет итерации. Потому что хипа/ хэш-таблица, мапа, сама по себе всегда гарантирует поиск O(1) из-за того, что ячейка памяти лежит в ключе самой мапы. Вот так вот. Еще раз спасибо за твои видосы!
Добрый день. Говоря про количество итераций для поиска 10 человек, я имел в виду: 1. Если мы будем итерироваться по слайсу на каждого пользователя (10 пользователей = 10 итераций по слайсу) 2. Если мы хотим искать в мапе, то ее нужно сначала построить из нашего слайса. Чтобы перенести значения слайса в мапу, нужно проитерироваться по слайсу 1 раз, а уже при поиске обращаться к полученной мапе)
@@alexispell4251 Кажется мы неверно поняли друг друга, я имел в виду, что если мы вызываем функцию поиска в слайсе (findInSlice) 10 раз, то каждый вызов функции выполняет 1 итерацию. суммарно 10 вызовов: 10 * O(n) Если мы построим мапу одной итерацией и 10 раз обратимся к мапе по ключу, то итерация останется только одна, а остальное - обращение к мапе по ключу: 1*O(n) + 10 * O(1)
Map как Set со структурой уродливей чем с bool: map[key] = true; if map[key].... Если потеря байта не критична с булевым значением будет читабельней и не нужно использовать ок синтаксис для проверки значения (Jon Bodner O'Really)
вы показали вставку значений в количестве 1 шт. можно ли в маппу вставлять (добавлять) несколько значенй с помощью оператора "for"? если да, покажите как это делается на примерах.
Добрый день. За одну операцию мы можем вставить/обновить только одно значение в мапе, используя нужный ключ. Но мы можем выполнить несколько таких одиночных операций в цикле, например вот так: go.dev/play/p/2O-rG4EpmyG
Для map len показывает реальное количество элементов внутри, а второй аргумент в make позволяет создать map с уже выделенной памятью под указанное количество элементов. Это в некотором роде указание cap для map, но его нельзя посмотреть через cap. Насчет примера с map2 - там же значения с ключами 3 и 4 закомментированы, поэтому их и нет. Код в комментариях не выполняется, поэтому значения в map2 не попали
@@thisisit7267 это я закоментировал, просто когда тестировал. Уберу комментарии и Len станет 4 без каких либо ошибок, хотя изначально выделялось память для 3. Вот о чем мой вопрос. Будто второй аргумент в make не несет никакого смысла, т.к. любое добавление или удаление людей просто меняет len у карты. слушай, а ты откуда все тонкости знаешь? Учил в универе голанг или через опыт и учебники на работе узнал? Какое образование и опыт у тебя? Потрать минутку на объяснение, чтоб мы знали своих героев ))
Внутри мапы данные хранятся разделенные на части, которые называются buckets. Каждый bucket может хранить определенный объем данных. Когда мы указываем вторым аргументом количество, в нашей мапе под капотом создается нужное количество buckets сразу. Если мы этого не делаем изначально, то при дальнейшем добавлении элементов выделяется память в несколько раз больше текущей (как у слайсов), чтобы перенести туда старые элементы и можно было добавлять новые. Таким образом, использование 2 аргумента позволяет нам сэкономить время и память в дальнейшем. Про свой опыт расскажу чуть позже, наверное даже в отдельном видосе)
@@vitaliikaverin3120 "просто меняет"... происходит выделение памяти и скорее всего в куче, что довольно трудозатратная операция. Вот почему новичкам таки рекомендуют начинать изучения программирования с Си, чтобы понять что такое стэк, куча и операции выделения и освобождения памяти
То есть, ты считаешь, что взятие элемента по индексу в мапе - это одна операция? )) Что-то мне подсказывает, что под капотом там как раз и происходит перебор массива в цикле. Чудес не бывает!
Спасибо, только не останавливаетесь)
Пожалуйста. Я постараюсь)
Спасибо. Быстро и в то же время толково подаешь материал. Молоток )
Спасибо!)
Привет! Во-первых, цикл видео - огонь! Спасибо!
Но внесу немного полезной критики :)
19:55
"Если нам надо найти 10 пользователей, то нам придется итерироваться 10 раз по слайсу, если же мы используем мапу - то мы итерируемся только один раз, превращая мапу в слайс."
На самом деле, поиск по массиву - всегда итерация, и всегда только одна, от первого элемента к последнему. И найдя элемент - мы завершаем итерацию. Сложность алгоритма - от O(1) (если элемент первый) до O(n) (если элемент последний). Не происходит десяти итераций :)
А в поиске по мапе - вообще нет итерации. Потому что хипа/ хэш-таблица, мапа, сама по себе всегда гарантирует поиск O(1) из-за того, что ячейка памяти лежит в ключе самой мапы. Вот так вот. Еще раз спасибо за твои видосы!
Добрый день. Говоря про количество итераций для поиска 10 человек, я имел в виду:
1. Если мы будем итерироваться по слайсу на каждого пользователя (10 пользователей = 10 итераций по слайсу)
2. Если мы хотим искать в мапе, то ее нужно сначала построить из нашего слайса. Чтобы перенести значения слайса в мапу, нужно проитерироваться по слайсу 1 раз, а уже при поиске обращаться к полученной мапе)
@@thisisit7267 но в этом и смысл, сколько бы ни было в массиве пользователей - итерация одна, а не столько, сколько пользователей в массиве/слайсе🙂
@@alexispell4251 Кажется мы неверно поняли друг друга, я имел в виду, что если мы вызываем функцию поиска в слайсе (findInSlice) 10 раз, то каждый вызов функции выполняет 1 итерацию. суммарно 10 вызовов: 10 * O(n)
Если мы построим мапу одной итерацией и 10 раз обратимся к мапе по ключу, то итерация останется только одна, а остальное - обращение к мапе по ключу: 1*O(n) + 10 * O(1)
@@thisisit7267 Да, согласен)
Ещё раз огромный суперлайк за суперконтент по го :3
@@alexispell4251 Спасибо🙂
Очень годный контент. Спасибо!
подписался, лайк поставил = лайфхак, по использованию мапы отличный ! (как раз был вопрос, как лучше этот инструмент применять)
Идеально, спасибо!)
Спасибо!
ну вот я и дошел до темы, которую сложно понять чайнику, кто только начал изучение Го с нуля )
Спасибо. Можешь примеры показать с использованием: map[int]bool или map[string]bool
Привет. Тут пример создания мап и установки значений по ключам: go.dev/play/p/79kjGOLJHW5
Map как Set со структурой уродливей чем с bool: map[key] = true; if map[key].... Если потеря байта не критична с булевым значением будет читабельней и не нужно использовать ок синтаксис для проверки значения (Jon Bodner O'Really)
вы показали вставку значений в количестве 1 шт. можно ли в маппу вставлять (добавлять) несколько значенй с помощью оператора "for"? если да, покажите как это делается на примерах.
Добрый день. За одну операцию мы можем вставить/обновить только одно значение в мапе, используя нужный ключ. Но мы можем выполнить несколько таких одиночных операций в цикле, например вот так: go.dev/play/p/2O-rG4EpmyG
Где-то читал что в мапе 0(n) - работает как-то сверхбыстро - это так?
У меня почему то когда я пишу %T или %#v они не подсвечиваются оранжевым и не выдают нужные значения. Так и печатают %T и %#v. Как пофиксить?
может обычный принт используешь? а не принтФ
какой смысл в указывании вместимости map? Добавил 2 значения, длина Len 2. Сделал 3, потом 4 человека - Len поменялось на 3, 4. Никаких ограничений или ошибок не выдает. Будто нет значения 3 в map2
map2 := make(map[string]string, 3)
fmt.Printf("Type: %T, Value: %#v, Len: %v
", map2, map2, len(map2))
map2 = map[string]string{"1": "Kolya", "2": "Vasya" /*, "3": "Igor", "4": "Vitalya"*/}
fmt.Printf("Type: %T, Value: %#v, Len: %v
", map2, map2, len(map2))
-------------------
Type: map[string]string, Value: map[string]string{}, Len: 0
Type: map[string]string, Value: map[string]string{"1":"Kolya", "2":"Vasya"}, Len: 2
Для map len показывает реальное количество элементов внутри, а второй аргумент в make позволяет создать map с уже выделенной памятью под указанное количество элементов. Это в некотором роде указание cap для map, но его нельзя посмотреть через cap.
Насчет примера с map2 - там же значения с ключами 3 и 4 закомментированы, поэтому их и нет. Код в комментариях не выполняется, поэтому значения в map2 не попали
@@thisisit7267 это я закоментировал, просто когда тестировал. Уберу комментарии и Len станет 4 без каких либо ошибок, хотя изначально выделялось память для 3. Вот о чем мой вопрос. Будто второй аргумент в make не несет никакого смысла, т.к. любое добавление или удаление людей просто меняет len у карты.
слушай, а ты откуда все тонкости знаешь? Учил в универе голанг или через опыт и учебники на работе узнал? Какое образование и опыт у тебя? Потрать минутку на объяснение, чтоб мы знали своих героев ))
Внутри мапы данные хранятся разделенные на части, которые называются buckets. Каждый bucket может хранить определенный объем данных. Когда мы указываем вторым аргументом количество, в нашей мапе под капотом создается нужное количество buckets сразу. Если мы этого не делаем изначально, то при дальнейшем добавлении элементов выделяется память в несколько раз больше текущей (как у слайсов), чтобы перенести туда старые элементы и можно было добавлять новые. Таким образом, использование 2 аргумента позволяет нам сэкономить время и память в дальнейшем.
Про свой опыт расскажу чуть позже, наверное даже в отдельном видосе)
@@vitaliikaverin3120 "просто меняет"... происходит выделение памяти и скорее всего в куче, что довольно трудозатратная операция. Вот почему новичкам таки рекомендуют начинать изучения программирования с Си, чтобы понять что такое стэк, куча и операции выделения и освобождения памяти
То есть, ты считаешь, что взятие элемента по индексу в мапе - это одна операция? )) Что-то мне подсказывает, что под капотом там как раз и происходит перебор массива в цикле. Чудес не бывает!
Тут больше про среднее время. В среднем это ближе к 0(1), в худшем можем и до O(N) дойти, зависит от хэш функции и числа колллизий
Не мара, а отображение или словарь
Не кампербл, а сравнимые