Алгоритми на основі чисельних базових систем? [зачинено]


87

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

  • Біноміальні купи базуються на двійкових числах, а більш складні перекоси біноміальні купи базуються на косих двійкових числах.
  • Деякі алгоритми генерування лексикографічно впорядкованих перестановок базуються на фактографічній системі числення.
  • Спроби можна сприймати як дерева, які дивляться на одну цифру струни за раз, для відповідної основи.
  • Дерева кодування Хаффмана призначені для того, щоб кожен край у дереві кодував нуль або одиницю в якомусь двійковому поданні.
  • Кодування Фібоначчі використовується при пошуку Фібоначчі та для інвертування певних типів логарифмів.

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


5
Мені теж подобається питання, але як ви обираєте "правильну" відповідь? Це має бути вікі спільноти?
vlad

14
Це має бути wiki-спільнота
BlueRaja - Danny Pflughoeft

18
@close voter: Якщо питання про алгоритми не відповідає темі SO, я не знаю, що тут є. Ідіотичні запитання щодо початківців щодо CSS? "Чи можу я зробити регулярний вираз plzz"? "plz email the codez 4 mi hoemwok"?
MAK

2
Путівник автостопом по Галактиці: Яка відповідь на Життя, Всесвіт і все? Відповідь глибокої думки: 42. Земля як машина, щоб знайти запитання: що таке 9 х 6? і ось чому все так закручено. На футболці: 9 (основа 13) x 6 (основа 13) = 42 (основа 13). QED.
Кріс Уолтон,

"які ще існують алгоритми, які використовують розумну систему числення як ключовий крок своєї інтуїції чи доказу?" Переповнення стеку не є механізмом рекомендацій , списком усіх речей або фермою посилань . Алгоритми вирішення практичних питань програмування, абсолютно. Клірингові палати для розумних алгоритмів, ні. Можливо, ви захочете запитати про мета математики , чи хочуть вони цього.

Відповіді:


39

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

  1. Позиційні системи числення
  2. Двійкові числа (двійкові списки з довільним доступом, безнульові подання, ліниві подання, сегментовані подання)
  3. Косові двійкові числа (Косові двійкові списки довільного доступу, Косі двоіменні купи)
  4. Трицинарні та четвертинні числа

Одні з найкращих прийомів, дистильовані:

  • Розрізняють щільні і розріджене подання чисел (зазвичай це ви бачите в матрицях або графіках, але це стосується і чисел!)
  • Корисні системи надлишкових чисел (системи, що мають більше одного подання числа).
  • Якщо ви розташуєте першу цифру ненульовою або використовуєте безнульове подання, отримання головки структури даних може бути ефективним.
  • Уникайте каскадного запозичення (від взяття хвоста списку) та перенесення (від потрапляння до списку) шляхом сегментування структури даних

Ось також список посилань для цього розділу:

  • Гібас, Маккрейт, Пласс і Робертс: нове представлення для лінійних списків.
  • Майерс: застосувальний стек з довільним доступом
  • Карлссон, Манро, Поблете: неявна біноміальна черга з постійним часом вставки.
  • Каплан, Тарджан: Суто функціональні списки з зв'язком через рекурсивне уповільнення.

2
+1 У мене є примірник книги Окасакі ... Мені сподобались ці глави, і вони частково чому вони взагалі задали це запитання (завантажені перекошені біноміальні купи справді круто!), Хоча я не читав його повністю, хоча можливо, мені слід. Крім того, я перевірю ці посилання; вони виглядають чудово.
templatetypedef

Повна теза Окасакі доступна в Інтернеті: cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi

20

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

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

"Кватерно-уявна система числення була вперше запропонована Дональдом Кнутом у 1955 році для подання на пошук талантів середньої школи. Це нестандартна позиційна система числення, яка використовує уявне число 2i як свою основу. Вона здатна представляти кожне комплексне число, використовуючи лише цифри 0, 1, 2 та 3. " джерело

"Римські цифри - це бікінарна система". джерело

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

"Сексагезімаль (основа 60) - це числівна система, основою якої є шістдесят. Вона виникла у древніх шумерів у 3-му тисячолітті до нашої ери, вона передалася древнім вавилонянам і досі використовується - у модифікованій формі - для вимірювання час, кути та географічні координати, які є кутами ". джерело

тощо ...

Цей список є хорошою відправною точкою.


6
Жодне з них не пов’язане з алгоритмами ..
BlueRaja - Danny Pflughoeft

11
Звичайно, вони є. Побудова трикутника трикутника Серпінського в трійці або обчислення географічних координат у шістдесятичному. Як щодо алгоритму перетворення римських цифр у десяткові? Як щодо алгоритмів пошуку простих чисел на основі сенарної системи?
Бенджамін

9

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

Для набору з (n) елементами, де мені потрібні (p) розділи, перерахуйте всі (n) цифри в основі (p).

Кожне число відповідає розділу. Кожна цифра відповідає елементу в наборі, а значення цифри підказує, до якого розділу потрібно додати елемент.

Це не дивно, але акуратно. Він завершений, не викликає надмірності та використовує довільні основи. База, яку ви використовуєте, залежить від конкретної проблеми розділення.


3
Я думаю, це повністю викрадено з допису templatetypedef, мабуть, воно застрягло в моїй підсвідомості. Я залишив його лише тому, що в ньому йдеться про більше баз, ніж просто двійкові.
Ben Horner

2
Це генерує всі розділи, що містять щонайбільше p розділів, і він має надмірності. Чим 111222відрізняється від 222111?
Нульовий набір

7

Нещодавно я натрапив на крутий алгоритм генерації підмножин у лексикографічному порядку на основі двійкових подань чисел від 0 до 2 n - 1. Він використовує біти чисел як для того, щоб визначити, які елементи слід вибрати для набору, так і для локального переупорядкування сформовані набори для приведення їх у лексикографічний порядок. Якщо вам цікаво, у мене тут розміщений матеріал .

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


2
Це найпростіший спосіб генерації підмножин :)
st0le

Це найпростіший спосіб підрахунку в комбінаторних концепціях.
Saeed Amiri

@ st0le - Я думаю, що це трохи складніше, ніж у стандартній версії, тому що це списки наборів у лексикографічному порядку, а не звичайне впорядкування, яке ви отримуєте при співвідношенні один до одного між бітами та включення набору.
templatetypedef

6

Не зовсім розумна базова система, але розумне використання базової системи: послідовності Ван дер Корпута - це послідовності з низькою невідповідністю, утворені шляхом обернення подання чисел base-n. Вони використовуються для побудови 2-d HALTON послідовності , які виглядають начебто цього .


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

Подивіться на статтю для кращого пояснення, оскільки я не фахівець у цій галузі.



5

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


Це був приголомшливий допис, і я в кінцевому підсумку використав це у своїй доповіді під назвою "Розваги з числовими системами". Велике спасибі за розміщення!
templatetypedef

ласкаво просимо і раді, що ви змогли ним скористатися!
Martin DeMello

5

Хешувальні рядки (наприклад, в алгоритмі Рабіна-Карпа ) часто оцінюють рядок як число base-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

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



4

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

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


3

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



1

Чудове запитання. Список справді довгий. Час розповіді - простий приклад змішаних основ (дні | години | хвилини | секунди | ранку / вечора)

Я створив фреймворк n-кортежу з переліком мета-бази, якщо вам цікаво про це почути. Це дуже солодкий синтаксичний цукор для базових систем нумерації. Це ще не випущено. Надіслати електронне повідомлення на моє ім’я користувача (на gmail).


1
І будь-яка календарна система - майя, місяця, вавилону .... разом з англійською валютою до 1971 року (LSD). Як ви говорите, список можна продовжувати.
Кріс Уолтон,


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.