170 похожих чатов

Интересно, какой гений придумал что std::set и std::multiset удовлетворяют AssociativeContainer?...

62 ответов

9 просмотров
Evgeny-Sh. Автор вопроса

Во всех остальных известных мне языках, "ассоциативный" означает именно мапу, т.е. один объект ассоциируется с другим https://en.wikipedia.org/wiki/Associative_array

Ну а в плюсах queue через deque, но queue же не удовлетворяет требованиям на deque

Evgeny Sh.
Во всех остальных известных мне языках, "ассоциати...

add a pair to the collection; remove a pair from the collection; modify an existing pair; lookup a value associated with a particular key set<pair<T1, T2>> всё это вполне может (надо только аккуратно посмотреть, что нужная гетерогенная операция будет)

как-то не очень по табличке сходится, у вектора тяжеловато с contains() за логарифм

Отсортируем!

Dmitriy [Отпуск]
Отсортируем!

тогда с insert сложновато будет

Constantine Drozdov
как-то не очень по табличке сходится, у вектора тя...

ну зависит от размера (количества элементов) даже поиск перебором по НЕ сортированному вектору может быть быстрее поиска по дереву : Big O не всегда отражает реальную скорость

Andrei Tokmakov
ну зависит от размера (количества элементов) даже ...

а сортировку вставками бинпоиск так вообще всегда замедляет, я в курсе констант реальных вычислительных устройств)

Да но иногда это очень важно. Для таких случаев они и есть как я понимаю.

Konstantin Vladimirov
Да но иногда это очень важно. Для таких случаев он...

Мне кажется, что это просто ошибка проектирования зари STL, когда cache friendly было не так важно

Constantine Drozdov
Мне кажется, что это просто ошибка проектирования ...

Почему ошибка-то? Вам дают возможность делать и так и так. Это преимущество а не ошибка.

Konstantin Vladimirov
Почему ошибка-то? Вам дают возможность делать и та...

Потому что в другую сторону можно обеспечить пользовательским кодом. Это лишняя гарантия.

Constantine Drozdov
Потому что в другую сторону можно обеспечить польз...

Не надо решать за людей какие гарантии им лишние. Вам лишняя, кому-то другому в самый раз =)

Konstantin Vladimirov
Не надо решать за людей какие гарантии им лишние. ...

А если эта гарантия вам не нужна (99% случаев), то у вас нет подходящего решения, только очень медленное

Constantine Drozdov
А если эта гарантия вам не нужна (99% случаев), то...

В смысле нет? Если не нужна то есть перечисленные выше аналоги.

Konstantin Vladimirov
Не надо решать за людей какие гарантии им лишние. ...

Представьте, что в std будет добавлен именованный shared_mutex и не будет всех остальных примитивов синхронизации

Constantine Drozdov
Представьте, что в std будет добавлен именованный ...

Но это явно не тот случай. Добавили же и вектор и обычный map.

Konstantin Vladimirov
Но это явно не тот случай. Добавили же и вектор и ...

Но не добавили быстрый map, который именно что отображает элементы.

Konstantin Vladimirov
Поясните? Типа бустового flat_map?

Ну посмотрите сравнение производительности unordered_map<int, int> и хеш-таблиц открытой адресации

Constantine Drozdov
Представьте, что в std будет добавлен именованный ...

Плохой пример, было бы норм если бы shared_mutex написали нормально

Constantine Drozdov
Ну посмотрите сравнение производительности unorder...

А как они в бусте называются? Если их нет в бусте то напишите, предложите в стандартную библиотеку, прославьтесь =)

https://probablydance.com/2017/02/26/i-wrote-the-fastest-hashtable/ как будто все об этом не знают)

Вот более актуальные бенчмарки, там цифры поинтереснее https://martin.ankerl.com/2019/04/01/hashmap-benchmarks-01-overview/

Constantine Drozdov
https://probablydance.com/2017/02/26/i-wrote-the-f...

а почему пики и падения есть? с чем связано падение сложности после пика?

Constantine Drozdov
add a pair to the collection; remove a pair from t...

Modify не получится так как константой является вся пара, а не только первая компонента.

Mikelangelo 🇩🇪🚜🇷🇺
а почему пики и падения есть? с чем связано падени...

я не разбирал графики настолько детально, но полагаю, что там реаллокация и прыгающий load_factor

Constantine Drozdov
https://probablydance.com/2017/02/26/i-wrote-the-f...

Посмотрел. Насколько я понимаю обгон делается не отказом от гарантий по итераторам а просто более эффективными алгоритмами. То есть проектирование правильное, критикуется конкретно реализация в libstdc++.

Konstantin Vladimirov
Посмотрел. Насколько я понимаю обгон делается не о...

Это построение в принципе не работает для неперемещаемых ключей

Konstantin Vladimirov
Посмотрел. Насколько я понимаю обгон делается не о...

Отказом в том числе - flat_map нереализуема без такового

Konstantin Vladimirov
Посмотрел. Насколько я понимаю обгон делается не о...

Нет же, там одна большая аллокация памяти в хешмапе

Sergey Skvortsov
Вот более актуальные бенчмарки, там цифры поинтере...

Не очень ясно зачем в бенчмарках emilib1 или ska, да и думаю некоторые другие, они вроде бажные. Вообще мне кажется практически всегда достаточно absl. Кст если говорить о мапах, то по-моему довольно прикольная штука: https://github.com/serge-sans-paille/frozen

Arelav
Не очень ясно зачем в бенчмарках emilib1 или ska, ...

Да, у автора есть вывод в конце, что хорошая дефолтная мапа — absl Ну и с тех пор ещё два года прошло

Constantine Drozdov
https://probablydance.com/2017/02/26/i-wrote-the-f...

У открытой адресации есть небольшой изъян, worse case. Который не предугадать. И этот товарищ сделал вид что его обошёл. Чутка покукушил и в rehash. Что приведёт к жору памяти в неприятных случаях.

Dmitry Sokolov
У открытой адресации есть небольшой изъян, worse c...

В смысле worst case? Хеш плохой? И там робингудят

В chaining схеме надо просто пройти по коллизиям. В open addressing надо использовать алгоритм обхода который в худшем случае для любой из схем будет O(n). И одна косвенная адресация, ну какой 10-кратный рост? Разве что в искусственных int-int мапах

Dmitry Sokolov
В chaining схеме надо просто пройти по коллизиям. ...

ты не веришь, что vector<T> может быть быстрее list<T> в 10 раз в качестве стека?) хуже O(n) не может быть, и там никогда не будет O(n), потому что робин гуд, говорю

Constantine Drozdov
ты не веришь, что vector<T> может быть быстрее lis...

Я не верю что в качественном hashmap одна лишняя косвенная адресация делает 10x

Dmitry Sokolov
Я не верю что в качественном hashmap одна лишняя к...

Почему одна-то? Цепочки непустые обычно, да и unordered_map трогает память неаккуратно в целом

Dmitry Sokolov
Я не верю что в качественном hashmap одна лишняя к...

для начала давай заметим, что в любом односвязном списке O(N) указателей имеет значение nullptr :)

Dmitry Sokolov
В chaining схеме надо просто пройти по коллизиям. ...

Стоит попробовать современные хешмапы у себя, вы будете приятно удивлены

Dmitry Sokolov
Я не верю что в качественном hashmap одна лишняя к...

так что в качестве априорного оверхеда за корзиночно-списочной схемы будет размер_буфера*sizeof(указателя) мусора в кэше просто так

Dmitry Sokolov
Я не верю что в качественном hashmap одна лишняя к...

но на самом деле худшее, что можно сделать кэшу, это написать a[i][j] для int** а, потому что нужно два раза подряд вычитать память и спекуляция вряд ли справится с таким; именно таким занимается списковая хешмапа

Constantine Drozdov
так что в качестве априорного оверхеда за корзиноч...

Для того чтобы обеспечить минимальное количество коллизий нужно табличку то с запасом держать, так что sizeof value тоже даст о себе знать, причём намного раньше

Dmitry Sokolov
Для того чтобы обеспечить минимальное количество к...

Ну так и куча мелких аллокаций тоже не бесплатная в плане оверхеда

Dmitry Sokolov
Для того чтобы обеспечить минимальное количество к...

в открытой накладные расходы 1 бит за ячейку для элемента, а не 8 байт

Dmitry Sokolov
Соотноси 8/sizeof value

Ну ладно. Давай так. Сделаем открытую хеш-таблицу, только будем делать записи в виде указателей на элементы, и добавим к ней аллокатор для самих элементов. Заметь, это всё ещё меньше расходов, чем в корзиночной хеш-таблице, потому что нет расходов на формирование односвязного списка.

Dmitry Sokolov
Соотноси 8/sizeof value

В этом сравнении некорректность, потому что ты считаешь бесплатным аллокатор для элементов списка

Constantine Drozdov
В этом сравнении некорректность, потому что ты счи...

Неее, а если sizeof например килобайт. Зачем мне платить за такую таблицу?

Dmitry Sokolov
Неее, а если sizeof например килобайт. Зачем мне п...

Ну это же вырожденный случай, положите в таблицу указатели

Dmitry Sokolov
Неее, а если sizeof например килобайт. Зачем мне п...

Я же тебе выше предложил способ переделать открытую адресацию в то, что кажется тебе быстрее :)

Constantine Drozdov
Я же тебе выше предложил способ переделать открыту...

Ну давай за быстродействие, chaining = одна косвенная адресация в лучшем случае + проход по списку коллизий. Open addressing для второго варианта вообще не гарантирует же толком ничего даже если коллизий мало.

Dmitry Sokolov
Ну давай за быстродействие, chaining = одна косвен...

Да ровно такая же гарантия, потому что open addressing имеет меньше накладных расходов и при том же memory usage будет работать на меньшем load factor

Dmitry Sokolov
Ну давай за быстродействие, chaining = одна косвен...

Заметь, я экономлю один указатель на элемент в варианте unique_ptr внутри open addressing, мне этого хватит, чтобы load factor из 0.5 сделать 0.33

Constantine Drozdov
Заметь, я экономлю один указатель на элемент в вар...

Chaining легко работает при load factor близких к единице. Open addressing при этом начнет конечно жутко лажать

Dmitry Sokolov
Chaining легко работает при load factor близких к ...

Близкий к 1 load factor означает ожидаемое количество проверок порядка 2 и соответствует load factor 0.5 для open addressing по расходу памяти)

Dmitry Sokolov
Для того чтобы обеспечить минимальное количество к...

В случае открытой контроль sizeof value и запоминание хеша отдаются на откуп пользователю

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

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
10
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Изменение типа с SomeException на String и правда удобней @cheese_hs . А вот такой вариант насколько некрасив еще? loadConfigDB :: IO (Either String ConfigDataBase) loadConfi...
Camara
7
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Карта сайта