Перейти до вмісту

Потоковий алгоритм

Матеріал з Вікіпедії — вільної енциклопедії.

Потоковий алгоритм (англ. streaming algorithm) — алгоритм для обробки послідовності даних за один або мале число проходів.

Потокові алгоритми розв'язують задачі, в яких дані надходять послідовно й у великому обсязі. Прикладом може бути аналіз мережного трафіку з боку маршрутизатора. Подібні задачі накладають на потокові алгоритми природні обмеження щодо доступної пам'яті (значно менше, ніж розмір вхідних даних) і часу обробки кожного елемента послідовності. Часто обробка даних можлива тільки за один прохід.

Суворі обмеження на час і пам'ять часто унеможливлюють точне розв'язання досліджуваної задачі. Зазвичай потокові алгоритми є ймовірнісними та дають наближення до точної відповіді.

Історія

[ред. | ред. код]

Хоча подібні алгоритми розглянуто в працях першої половини 1980-х років[1][2], поняття потокового алгоритму вперше формалізовано в роботі Алона, Матіаса[en] та Сегеді[en] 1996 року[3]. 2005 року авторів відзначено премією Геделя за внесок у теорію алгоритмів (англ. for their foundational contribution to streaming algorithms).

2005 року введено поняття напівпотокового алгоритму (англ. semi-streaming algorithm)[4] як алгоритму, що обробляє вхідний потік за стале або логарифмічне від обсягу даних число проходів.

Модель

[ред. | ред. код]

У моделі потокових даних вважається, що до частини або всього набору вхідних даних, які слід обробити, немає довільного доступу: вхідні дані надходять послідовно і безперервно в одному або декількох потоках. Потоки даних можна подати впорядкованою послідовністю точок («оновлень»), доступ до яких може здійснюватися за порядком і лише один чи обмежене число разів.

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

У «касовій» моделі кожне «оновлення» подається у формі і модифікують вектор так, що збільшується на деяке додатне ціле число . Найчастіше , що означає тривіальну інкрементну модель.

У «турнікетній» моделі кожне «оновлення» подається у формі і модифікують вектор так, що змінюється на деяке додатне чи від'ємне ціле число . У строгій турнікетній моделі в будь-який момент часу може бути від'ємним.

Багато публікацій із потокової обробки розглядають задачу обчислення статистик над частотним розподілом даних. При цьому обсяг даних дуже великий для ефективного зберігання. Прикладами нетривіальних задач є обчислення медіани, довільних перцентилів або кількість унікальних елементів потоку. Формально, для задач цього класу вважається, що вектор (ініціалізований нульовою послідовністю ) має певну кількість «оновлень». Кожне оновлення збільшує або зменшує значення в окремій комірці вектора. Мета алгоритму — обчислити функції від , використовуючи істотно менше місця, ніж вимагає повне як подання вектора , так і збереження обсягу оброблюваних даних. Існують дві загальні моделі оновлення таких даних: «каса» (англ. cash register) та «турнікет» (англ. turnstile).

У потокових алгоритмах розглядаються як питання, пов'язані з частотними характеристиками даних, так і низка інших. Багато задач на графах розв'язуються в умовах того, що матриця суміжності графа потоково підвантажується в деякому невідомому наперед порядку. Також є задачі, коли порядок має особливе значення. Наприклад, задача підрахунку числа інверсій або пошуку найбільшої зростальної підпослідовності.

Порівняння алгоритмів

[ред. | ред. код]

Основні характеристики потокових алгоритмів:

  • кількість допустимих проходів алгоритму над даними;
  • доступна пам'ять;
  • час обробки окремого елемента.

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

Якщо алгоритм є наближеним, то ще одним показником є точність відповіді. Точність алгоритму часто подають як величину , що означає, що алгоритм досягне помилки менше з імовірністю .

Застосування

[ред. | ред. код]

Потокові алгоритми важливі в задачах моніторингу комп'ютерних мереж. Наприклад, відстеження потоків високої інтенсивності, оцінення загальної кількості різних потоків, наближене оцінення розподілу інтенсивності потоків тощо[5]. Також потокові алгоритми можуть застосовуватись у базах даних, наприклад, для оцінення розміру декартового добутку таблиць.

Приклади задач, які розв'язують потокові алгоритми

[ред. | ред. код]

Задачі з частотним розподілом

[ред. | ред. код]

-ий момент частоти у векторі визначають як .

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

Також вивчено питання оцінення моментів частот.

Пошук важких елементів

[ред. | ред. код]

Задача полягає в пошуку в потоці даних елемента, який зустрічається найчастіше. Тут застосовуються такі алгоритми:

Відстеження тренду

[ред. | ред. код]

Відстеження тренду в потоці даних зазвичай проводять у такому порядку: найчастіші елементи та їхні частоти визначають на основі одного зі згаданих вище алгоритмів, а потім найбільше збільшення відносно попереднього моменту часу відзначають як тренд. Для цього застосовують експоненційне рухоме середнє і різне нормування[6]. Алгоритм використовує O(ε² + log d) місця і O(1) для найгіршого випадку оновлення за універсальної геш-функції зі сімейства r-розумних незалежних геш-функцій з r = Ω(log(1/ε)/log log(1/ ε))).

Ентропія

[ред. | ред. код]

Емпірична оцінка ентропії над набором частот визначається як , де [7].

Машинне навчання

[ред. | ред. код]

Основна задача онлайнового машинного навчання — навчити модель (наприклад, класифікатор) за один прохід за навчальною вибіркою; для її розв'язання зазвичай використовують методи передбачального гешування[en] і стохастичний градієнтний спуск.

Підрахунок числа унікальних елементів

[ред. | ред. код]

Підрахунок кількості унікальних елементів у потоці даних (момент ) — ще одна добре вивчена задача. Перший алгоритм запропонували Флажоле та Мартен[8]. 2010 року знайдено асимптотично оптимальний алгоритм[9].

Примітки

[ред. | ред. код]
  1. Munro та Paterson, (1980)
  2. Flajolet та Martin, (1985)
  3. Alon, Matias та Szegedy, (1996)
  4. Feigenbaum, Joan; Sampath, Kannan (2005). On graph problems in a semi-streaming model. Theoretical Computer Science. 348 (2): 207—216. doi:10.1016/j.tcs.2005.09.013.
  5. J. Xu A Tutorial on Network Data Streaming
  6. Schubert, E.; Weiler, M.; Kriegel, H. P. (2014). SigniTrend: scalable detection of emerging topics in textual streams by hashed significance thresholds. Proceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining - KDD '14. с. 871—880. doi:10.1145/2623330.2623740. ISBN 9781450329569.
  7. Оцінки ентропії наведено в працях: McGregor та ін., Do Ba та ін., Lall та ін., Chakrabarti та ін.[уточнити]
  8. Flajolet та Martin, (1985)
  9. Kane, Daniel M.; Nelson, Jelani; Woodruff, David P. (2010), «An optimal algorithm for the distinct elements problem», Proceedings of the twenty-ninth ACM SIGMOD-SIGACT-SIGART symposium on Principles of database systems, PODS '10, New York, NY, USA: ACM, pp. 41-52, doi:10.1145/1807085.1807094, ISBN 978-1-4503-0033-9.

Література

[ред. | ред. код]

Посилання

[ред. | ред. код]
Підручники