Алгоритмы, основанные на системах с числовой базой?

Недавно я заметил, что существует множество алгоритмов, основанных частично или полностью на умном использовании чисел в творческих базах. Например:

  • Биномиальные кучи основаны на двоичных числах, а более сложные косые биномиальные кучи основаны на косых двоичных числах.
  • Некоторые алгоритмы генерации лексикографически упорядоченных перестановок основаны на системе факторических чисел.
  • Трижды можно рассматривать как деревья, которые смотрят на одну цифру строки за раз, для соответствующей базы.
  • Деревья кодирования Huffman предназначены для того, чтобы каждое ребро в дереве кодировало нуль или один в некотором двоичном представлении.
  • Кодирование Фибоначчи используется в поиске Фибоначчи и для инвертирования определенных типов логарифмов.

Мой вопрос: какие существуют другие алгоритмы, которые используют умную систему чисел как ключевой шаг их интуиции или доказательства?. Я думаю о том, чтобы собрать разговор по этому вопросу, поэтому чем больше примеров я должен извлечь, тем лучше.

Ответ 1

Крис Окасаки имеет очень хорошую главу в своей книге "Чисто функциональные структуры данных", в которой обсуждается "числовые представления": по существу, принимаем некоторое представление числа и преобразуем его в структуру данных. Чтобы дать аромат, вот разделы этой главы:

  • Системы позиционных номеров
  • Двоичные числа (двоичные списки произвольного доступа, нулевые представления, ленивые представления, сегментированные представления)
  • Косые двоичные числа (скользящие двоичные списки случайного доступа, скошенные биномиальные кучи)
  • Триные и четвертичные числа

Некоторые из лучших трюков, дистиллированных:

  • Различать плотные и разреженные представления чисел (обычно вы видите это в матрицах или графах, но оно также применимо к числам!)
  • Полезны резервные системы счисления (системы, которые имеют более одного представления числа).
  • Если вы уделите первую цифру ненулевым или используйте нулевое представление, получение заголовка структуры данных может быть эффективным.
  • Избегайте каскадных заимствований (от взятия хвоста списка) и переносите (из consing в список) путем сегментации структуры данных

Вот также список ссылок для этой главы:

  • Guibas, McCreight, Plass and Roberts: новое представление для линейных списков.
  • Myers: прикладной стек случайного доступа
  • Carlsson, Munro, Poblete: неявная биномиальная очередь с постоянным временем вставки.
  • Kaplan, Tarjan: Чисто функциональные списки с привязкой через рекурсивное замедление.

Ответ 2

"Тернарные числа могут использоваться для передачи самоподобные структуры, такие как Треугольник Серпинского или кантора удобно." источник

"Четвертичные числа используются в представление двумерных кривых Гильберта. источник

" Квадратно-мнимая система цифр был впервые предложен Дональдом Кнутом в 1955, в представлении в средней школе научный талант поиск. Это нестандартная позиционная цифровая система который использует мнимое число 2i как его базы. Он способен представлять каждое комплексное число, используя только цифры 0, 1, 2 и 3. "источник

"Римские цифры - это бикварная система ". источник

" Сенарий может считаться полезным в изучение простых чисел, поскольку все простые числа, выраженные в базе шесть, кроме 2 и 3, имеют 1 или 5 в качестве конечная цифра. источник

" Sexagesimal (основание 60) - это цифра система с шестидесяти ее базой. Это возникла с древними шумерами в III тысячелетии до н.э., это было переданы древнему Вавилонян, и он по-прежнему используется - в модифицированная форма - для измерения времени, углы и географические координаты которые являются углами. "источник

и т.д...

Этот список является хорошей отправной точкой.

Ответ 3

Я прочитал ваш вопрос на днях и сегодня столкнулся с проблемой: как мне сгенерировать все разбиения набора? Решение, которое пришло мне в голову и которое я использовал (возможно, из-за чтения вашего вопроса), было следующим:

Для набора с (n) элементами, где мне нужны (p) разделы, подсчитывайте все (n) цифры в базе (p).

Каждое число соответствует разбиению. Каждая цифра соответствует элементу в наборе, а значение цифры указывает, какой раздел для размещения элемента.

Это не удивительно, но это аккуратно. Он завершен, не вызывает избыточности и использует произвольные базы. Используемая вами база данных зависит от конкретной проблемы с разделением.

Ответ 4

Недавно я наткнулся на классный алгоритм для генерации подмножеств в лексикографическом порядке на основе двоичных представлений чисел между 0 и 2 n - 1. Он использует биты чисел как для определения того, какие элементы должны быть выбраны для множества и локально переупорядочить сгенерированные множества, чтобы получить их в лексикографическом порядке. Если вам интересно, у меня есть запись в здесь.

Кроме того, многие алгоритмы основаны на масштабировании (например, слабой полиномиальной версии алгоритма максимального потока Форда-Фулкерсона), который использует двоичное представление чисел во входной задаче для постепенного уточнения грубого приближения в полное решение.

Ответ 5

Не совсем умная базовая система, но умное использование базовой системы: Последовательность Van der Corput низкое несоответствие последовательностей, образованных путем изменения базового представления чисел. Они используются для создания 2-d последовательностей Halton, которые выглядят как this.

Ответ 6

Я смутно помню что-то о двойных базовых системах для ускорения некоторого матричного умножения.

Двойная базовая система - это резервная система, которая использует два баз для одного номера.

 n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}

Резервирование означает, что один номер может быть указан разными способами.

Вы можете найти статью "Гибридный алгоритм вычисления матричного полинома" Вассила Димитрова, Тодора Куклева.

Попытка дать лучший краткий обзор я могу.

Они пытались вычислить матричный многочлен G(N,A) = I + A + ... + A^{N-1}.

Дополнение N является составным G(N,A) = G(J,A) * G(K, A^J), если мы применим для J = 2, получим:

         / (I + A) * G(K, A^2)        , if N = 2K
G(N,A) = |
         \ I + (A + A^2) * G(K, A^2)  , if N = 2K + 1

и

         / (I + A + A^2) * G(K, A^3)           , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3)     , if N = 3K + 1
         \ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2

Как это "очевидно" (шутливо), что некоторые из этих уравнений бывают быстрыми в первой системе, а некоторые лучше - во втором, так что это хорошая идея выбрать лучшие из тех, которые зависят от N. Но для этого требуется быстрая модульная операция для обоих и 2 и 3. Здесь, почему приходит двойная база, вы можете в основном выполнить модульную работу быстро, поскольку обе они дают вам комбинированную систему:

         / (I + A + A^2) * G(K, A^3)       , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
         | (I + A) * G(3K + 1, A^2)        , if N = 2 mod 6
         \ I + (A + A^2) * G(3K + 2, A^2)  , if N = 5 mod 6

Посмотрите на статью для лучшего объяснения, поскольку я не эксперт в этой области.

Ответ 7

RadixSort может использовать различные базы чисел. http://en.wikipedia.org/wiki/Radix_sort Довольно интересная реализация bucketSort.

Ответ 8

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

Ответ 9

Хеширующие строки (например, в алгоритме Rabin-Karp) часто оценивают строку как базовое число b, состоящее из n цифр (где n - длина строки, а b - некоторая выбранная база, достаточно большая). Например, строка "ABCD" может быть хеширована как:

'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0

Подставляя значения ASCII для символов и принимая b до 256, это становится,

65*256^3+66*256^2+67*256^1+68*256^0

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

Ответ 11

В Hackers Delight (книга, которую должен знать каждый программист в моих глазах), есть полная глава об основах отказа, например -2 в качестве базы (да, правые отрицательные базы) или -1 + я (i как мнимая единица sqrt (-1)) в качестве базы. Также я славный расчет, какая лучшая база (с точки зрения аппаратного дизайна, для всех, кто не хочет ее читать: решение уравнения есть e, поэтому вы можете пойти с 2 или 3, 3 будет немного лучше (фактор 1.056 раз лучше, чем 2), но технически более практично).

Другие вещи, которые приходят мне на ум, - это счетчик серы (вы, когда считаете в этой системе только 1 бит изменений, часто используете это свойство в аппаратном дизайне для уменьшения проблем с метастабильностью) или обобщение уже упомянутой кодировки Хаффмана - арифметическое кодирование.

Ответ 12

Криптография широко использует целые кольца (модульные арифметические), а также конечные поля, операции которых интуитивно основаны на том, как ведут себя полиномы с целочисленными коэффициентами.

Ответ 14

Отличный вопрос. Список действительно длинный. Рассказать время - простой пример смешанных оснований (дни | часы | минуты | секунды | am/pm)

Я создал мета-базу перечисления n-tuple, если вам интересно узнать об этом. Это очень сладкий синтаксический сахар для базовых систем нумерации. Он еще не выпущен. Отправьте свое имя пользователя (в gmail).

Ответ 15

Один из моих фаворитов, использующий базу 2, Арифметическое кодирование. Это необычно, потому что hart алгоритма использует представления чисел от 0 до 1 в двоичном формате.

Ответ 16

Может быть AKS.