На cs.stackexchange я запитав про бібліотеку scala algebird на github, розмірковуючи над тим, чому їм може знадобитися абстрактний пакет алгебри.
На сторінці github є деякі підказки:
Впровадження Monoids для цікавих алгоритмів наближення, таких як фільтр Bloom, HyperLogLog та CountMinSketch. Вони дозволяють думати про такі складні операції, як ти, можливо, чисел, і додавати їх у hadoop або в Інтернеті для отримання потужної статистики та аналітики.
та в іншій частині сторінки GitHub:
Спочатку він був розроблений як частина Matrix API Scalding, де в матрицях були значення, що є елементами моноїдів, груп або кілець. Згодом було зрозуміло, що код отримав ширше застосування в межах Scalding та інших проектів у Twitter.
Навіть Оскар Бойкін із Twitter прозвучав:
Основна відповідь полягає в тому, що, використовуючи структуру напівгруп, ми можемо будувати системи, які правильно паралелізуються, не знаючи основної операції (користувач обіцяє асоціативність).
Використовуючи Monoids, ми можемо скористатись ощадливістю (ми маємо справу з великою кількістю розріджених матриць, де майже всі значення є нулем у деяких Monoid).
Використовуючи Кільця, ми можемо робити матричне множення на інші речі, крім чисел (що це було зроблено).
Сам проект algebird (як і історія випусків) досить чітко пояснює, що тут відбувається: ми будуємо безліч алгоритмів для агрегації великих наборів даних, а використання структури операцій дає нам виграш на стороні систем (що зазвичай є больовою точкою при спробі виробити алгоритми на 1000-ти вузлах).
Вирішіть системні проблеми один раз для будь-якої Semigroup / Monoid / Group / Ring, і тоді ви можете підключити будь-який алгоритм, не замислюючись про Memcache, Hadoop, Storm тощо.
Як Bloom filters
/ hyperloglog
/ countminsketch
подібні числа?
Яким чином агрегація баз даних має моноїдну структуру?
Як виглядає цей моноїд? Чи мають вони колись групову структуру?
Літературні посилання були б корисні.