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

Представим себе контейнер, который может состоять из 3-х уникальных элементов.

Но порядок этих элементов важен, а то задачу можно было бы просто решить 3-мя битами.
Представить в битах такой контейнер можно так: первые 3 бита определяют первый элемент (или 000 если контейнер пуст), вторые 2 бита определяют второй элемент. Именно 2 оставшихся бита, т.к. один бит уже исключен. Ну и соответственно, если 00, то контейнер закончился. Ну и последний 1 бит определяет наличие последнего элемента, или 0.
Соответственно для реализации такого контейнера нужно 3+2+1==6 бит.
Алгоритм хорошо обобщается на N уникальных элементов.

Вопрос - кто то где то видел реализацию такого контейнера, или что-то аналогичное или похожее?

5 ответов

9 просмотров

Всего возможно 3! = 3*2*1 = 6 перестановок элементов. 6 значений влезут в 3 бита. Ни моя схема, ни ваша схема на N элементов с большим N не скейлятся, потому что объем N!/8 битов (у меня) или N*(N+1)/2 битов (у вас) это слишком много Если совершенно точно известно что элементов не больше N, то используют static_vector. Там из доп памяти только 4 байта = размер вектора

Int-Unsigned Автор вопроса
Evgeny Sh.
Всего возможно 3! = 3*2*1 = 6 перестановок элемент...

Не перестановок, т.е. не N!, а суммирования от N до 1. То есть в моей схеме для 4 элементов нужно 10 бит, а не 4!==24. На каждом следующем шаге мы можем сжимать последовательность на один использованный бит.

Int Unsigned
Не перестановок, т.е. не N!, а суммирования от N д...

Ах, ну тоесть всё что больше ~16 элементов = оверхед? Я всё ещё не понимаю для чего и зачем это и при чём тут поля с битами

Int-Unsigned Автор вопроса
Т
Ах, ну тоесть всё что больше ~16 элементов = оверх...

Достаточно много приложений, когда возможно не более N элементов. Индексы по полям, например. 16 в этом случае это овердохрена.

Int Unsigned
Достаточно много приложений, когда возможно не бол...

Ну это долбёжка в битовые оптимизации. Силами компилятора делать такое сложно + там всёравно будет много логики-инструкций. Это если у вас RAM пару килобайт, а ROM под сотни, может и имеет смысл. А в остальном это мусор. Экономить пару байтов там где у тебя память в мегабайтах исчисляется, ну такое

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

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

подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
возможно для форматирования TimeStampZ нужен другой механизм, не?
Роман Лях (rgreat)
13
Добрый день. Абракадабра в 12-й студии ввела новый тип поля БД TSQLTimeStampOffset, использую в постгресе timestampz и вот с 12-й версии начались чудеса! До этого поля times...
Delphi Photo
9
Коллеги, здравствуйте! А можно узнать ваше мнение относительно Wolfram Mathematica vs Julia? Просто у меня стоит выбор между тем, чтобы продолжить преподавать Wolfram Mathemat...
Илья Гаража
10
Обновленный chat тестили уже господа? Готовимся на заводы ? Простой проект на ларавель собирает за 1 ответ..
Jacov Borisov
14
Дык какой описанный сценарий то? Единственное, что вижу я - это то что есть какой то интерфейс1 , про который известно, что у него есть метод, который возвращает другой интерф...
Jack128
7
А если без шуток, на чем десктоп сейчас пишут кроссплатформенный (ну чтобы с минимальным допиливанием под каждую платформу) и чтобы хорошая производительность софта была. Толь...
🐈
9
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта