Недавно я заметил, что существует множество алгоритмов, частично или полностью основанных на умном использовании чисел в творческих основах. Например:
- Биномиальные кучи основаны на двоичных числах, а более сложные косые биномиальные кучи основаны на косых двоичных числах.
- Некоторые алгоритмы генерации лексикографически упорядоченных перестановок основаны на факторадической системе счисления.
- Попытки можно рассматривать как деревья, которые просматривают одну цифру строки за раз для соответствующей базы.
- Деревья кодирования Хаффмана предназначены для того, чтобы каждое ребро в дереве кодировало ноль или единицу в некотором двоичном представлении.
- Кодирование Фибоначчи используется в поиске Фибоначчи и для инвертирования определенных типов логарифмов.
Мой вопрос: какие еще существуют алгоритмы, которые используют умную систему счисления в качестве ключевого шага своей интуиции или доказательства? . Я думаю о том, чтобы составить доклад на эту тему, поэтому чем больше примеров я буду использовать, тем лучше.
algorithm
math
data-structures
numbers
number-systems
templatetypedef
источник
источник
Ответы:
У Криса Окасаки есть очень хорошая глава в своей книге « Чисто функциональные структуры данных», в которой обсуждаются «Числовые представления»: по сути, возьмите некоторое представление числа и преобразуйте его в структуру данных. Чтобы дать представление, вот разделы этой главы:
Некоторые из лучших приемов дистилляции:
Вот также список ссылок к этой главе:
источник
так далее...
Этот список - хорошая отправная точка.
источник
На днях я прочитал ваш вопрос и сегодня столкнулся с проблемой: как сгенерировать все разбиения набора? Решение, которое пришло мне в голову и которое я использовал (возможно, из-за чтения вашего вопроса), было следующим:
Для набора с (n) элементами, где мне нужно (p) разделов, подсчитайте все (n) числовые числа в базе (p).
Каждое число соответствует разделу. Каждая цифра соответствует элементу в наборе, а значение цифры говорит вам, в какой раздел поместить элемент.
Это не удивительно, но аккуратно. Он полный, не вызывает избыточности и использует произвольные основания. База, которую вы используете, зависит от конкретной проблемы разделения.
источник
111222
отличается от222111
?Недавно я наткнулся на классный алгоритм для генерации подмножеств в лексикографическом порядке на основе двоичных представлений чисел от 0 до 2 n - 1. Он использует биты чисел как для определения элементов, которые следует выбрать для набора, так и для локального изменения порядка. сгенерированные наборы, чтобы привести их в лексикографический порядок. Если вам интересно, у меня есть запись здесь .
Кроме того, многие алгоритмы основаны на масштабировании (например, слабо-полиномиальная версия алгоритма максимального потока Форда-Фулкерсона), который использует двоичное представление чисел во входной задаче для постепенного уточнения грубого приближения до полного решения.
источник
Не совсем умная базовая система, но умное использование базовой системы: последовательности Ван дер Корпута - это последовательности с низким расхождением, сформированные путем обращения представления чисел с основанием n. Они используются для построения 2- мерных последовательностей Холтона, которые выглядят примерно так .
источник
Я смутно помню кое-что о системах с двойным основанием для ускорения умножения матриц.
Система с двойной базой - это система с дублированием, в которой для одного номера используются две базы.
Избыточность означает, что один номер можно указать разными способами.
Вы можете найти статью «Гибридный алгоритм вычисления матричного многочлена» Василия Димитрова, Тодора Куклева.
Пытаюсь дать краткий обзор как можно лучше.
Они пытались вычислить матричный полином
G(N,A) = I + A + ... + A^{N-1}
.Supoosing N является составным
G(N,A) = G(J,A) * G(K, A^J)
, если мы применим J = 2, мы получим:также,
Поскольку «очевидно» (в шутку), что некоторые из этих уравнений быстры в первой системе, а некоторые лучше - во второй, поэтому рекомендуется выбрать лучшее из них в зависимости от
N
. Но это потребует быстрой операции по модулю как для 2, так и для 3. Вот почему приходит двойное основание - вы можете быстро выполнить операцию по модулю для них обоих, давая вам комбинированную систему:Прочтите статью для лучшего объяснения, так как я не эксперт в этой области.
источник
RadixSort может использовать различные системы исчисления. http://en.wikipedia.org/wiki/Radix_sort Довольно интересная реализация bucketSort.
источник
вот хороший пост об использовании троичных чисел для решения проблемы "поддельной монеты" (где вам нужно обнаружить одну поддельную монету в пакете обычных, используя баланс как можно меньше раз)
источник
Хеширование строк (например, в алгоритме Рабина-Карпа ) часто оценивает строку как число с основанием b, состоящее из n цифр (где n - длина строки, а b - некоторая выбранная база, которая достаточно велика). Например, строка «ABCD» может быть хеширована как:
Подставляя значения ASCII для символов и принимая b равным 256, получается,
Хотя в большинстве практических приложений результирующее значение берется по модулю некоторого числа разумного размера, чтобы результат оставался достаточно маленьким.
источник
Возведение в степень возведением в квадрат основано на двоичном представлении экспоненты.
источник
В
Hackers Delight
(книге, которую каждый программист должен знать в моих глазах) есть полная глава о необычных основаниях, таких как -2 как основание (да, правильные отрицательные основания) или -1 + i (i как мнимая единица sqrt (-1)) как основание. Также мне приятно посчитать, какова лучшая база (с точки зрения дизайна оборудования, для всех, кто не хочет его читать: решение уравнения - e, поэтому вы можете выбрать 2 или 3, 3 будет немного лучше (коэффициент В 1.056 раза лучше, чем 2) - но технически практичнее).Другие вещи, которые приходят мне на ум, - это счетчик серого (если вы считаете в этой системе только 1-битные изменения, вы часто используете это свойство в дизайне оборудования, чтобы уменьшить проблемы с метастабильностью) или обобщение уже упомянутой кодировки Хаффмана - арифметическое кодирование.
источник
Криптография широко использует целочисленные кольца (модульная арифматика), а также конечные поля, операции которых интуитивно основаны на поведении полиномов с целочисленными коэффициентами.
источник
Мне очень нравится этот для преобразования двоичных чисел в коды Грея: http://www.matrixlab-examples.com/gray-code.html
источник
Отличный вопрос. Список действительно длинный. Определение времени - это простой пример смешанного базиса (дни | часы | минуты | секунды | am / pm)
Я создал фреймворк n-tuple для перечисления мета-базы, если вам интересно о нем услышать. Это очень приятный синтаксический сахар для систем счисления. Он еще не выпущен. Напишите мое имя пользователя (на Gmail).
источник
Одно из моих любимых приложений с основанием 2 - это арифметическое кодирование . Это необычно, потому что суть алгоритма использует представление чисел от 0 до 1 в двоичном формате.
источник
Может быть, это АКС .
источник