В информатике потоковые алгоритмы — это алгоритмы обработки потоков данных , в которых входные данные представлены в виде последовательности элементов и могут быть проверены всего за несколько проходов, обычно за один . Эти алгоритмы предназначены для работы с ограниченной памятью, обычно логарифмической по размеру потока и/или по максимальному значению в потоке, а также могут иметь ограниченное время обработки на элемент.
В результате этих ограничений потоковые алгоритмы часто выдают приблизительные ответы, основанные на сводке или «наброске» потока данных.
Хотя потоковые алгоритмы уже изучались Манро и Патерсоном [1] еще в 1978 году, а также Филиппом Флажоле и Г. Найджелом Мартином в 1982/83 годах, [2] область потоковых алгоритмов была впервые формализована и популяризирована в статье 1996 года Ноги Алона , Йосси Матиаса и Марио Сегеди . [3] За эту статью авторы позже выиграли премию Гёделя в 2005 году «за их основополагающий вклад в потоковые алгоритмы». С тех пор было проведено большое количество работ, сосредоточенных вокруг потоковых алгоритмов данных, которые охватывают широкий спектр областей компьютерной науки, таких как теория, базы данных, сетевые технологии и обработка естественного языка.
Полупотоковые алгоритмы были введены в 2005 году как ослабление потоковых алгоритмов для графов, [4] в которых допустимое пространство линейно по числу вершин n , но только логарифмически по числу ребер m . Это ослабление все еще имеет смысл для плотных графов и может решать интересные проблемы (например, связность), которые неразрешимы в пространстве.
В модели потока данных часть или все входные данные представлены в виде конечной последовательности целых чисел (из некоторого конечного домена), которая обычно недоступна для случайного доступа , а вместо этого поступает по одному в «потоке». [5] Если поток имеет длину n , а домен имеет размер m , алгоритмы обычно ограничены использованием пространства, логарифмического по m и n . Они обычно могут делать только некоторое небольшое постоянное число проходов по потоку, иногда всего один . [6]
Большая часть литературы по потоковой передаче посвящена вычислению статистики по распределениям частот, которые слишком велики для хранения. Для этого класса задач существует вектор (инициализированный нулевым вектором ), обновления которого представлены ему в потоке. Цель этих алгоритмов — вычислить функции, используя значительно меньше места, чем потребовалось бы для точного представления. Существуют две общие модели для обновления таких потоков, называемые моделями «кассового аппарата» и «турникета». [7]
В модели кассового аппарата каждое обновление имеет форму , так что увеличивается на некоторое положительное целое число . Известный особый случай — когда (разрешены только вставки единиц).
В модели турникета каждое обновление имеет вид , так что увеличивается на некоторое (возможно, отрицательное) целое число . В модели «строгого турникета» ни одно в любой момент времени не может быть меньше нуля.
В нескольких работах также рассматривается модель «скользящего окна». [ необходима цитата ] В этой модели интересующая функция вычисляется в окне фиксированного размера в потоке. По мере продвижения потока элементы из конца окна удаляются из рассмотрения, а новые элементы из потока занимают их место.
Помимо вышеупомянутых проблем, основанных на частоте, были изучены и некоторые другие типы проблем. Многие проблемы с графами решаются в условиях, когда матрица смежности или список смежности графа передаются в неизвестном порядке. Существуют также некоторые проблемы, которые сильно зависят от порядка потока (т. е. асимметричные функции), такие как подсчет количества инверсий в потоке и поиск самой длинной возрастающей подпоследовательности. [ необходима цитата ]
Производительность алгоритма, работающего с потоками данных, измеряется тремя основными факторами:
Эти алгоритмы имеют много общего с онлайн-алгоритмами, поскольку оба требуют принятия решений до того, как все данные станут доступны, но они не идентичны. Алгоритмы потока данных имеют ограниченную доступную память, но они могут откладывать действия до тех пор, пока не прибудет группа точек, в то время как онлайн-алгоритмы должны предпринимать действия, как только прибудет каждая точка.
Если алгоритм является алгоритмом приближения, то точность ответа является еще одним ключевым фактором. Точность часто определяется как приближение, что означает, что алгоритм достигает ошибки менее чем с вероятностью .
Потоковые алгоритмы имеют несколько применений в сетях, таких как мониторинг сетевых соединений для потоков слонов , подсчет количества отдельных потоков, оценка распределения размеров потоков и т. д. [8] Они также имеют приложения в базах данных, такие как оценка размера объединения [ необходима ссылка ] .
Частотный момент k набора частот определяется как .
Первый момент — это просто сумма частот (т. е. общее количество). Второй момент полезен для вычисления статистических свойств данных, таких как коэффициент вариации Джини . определяется как частота наиболее частых элементов.
Основополагающая работа Алона, Матиаса и Сегеди была посвящена проблеме оценки частотных моментов. [ необходима цитата ]
Прямой подход к нахождению частотных моментов требует поддержания регистра m i для всех различных элементов a i ∈ (1,2,3,4,..., N ), что требует как минимум памяти порядка . [3] Но у нас есть ограничения по пространству и требуется алгоритм, который вычисляет в гораздо меньшей памяти. Этого можно достичь, используя приближения вместо точных значений. Алгоритм, который вычисляет ( ε,δ )приближение F k , где F' k является ( ε,δ )-приближенным значением F k . [9] Где ε является параметром приближения, а δ является параметром достоверности. [10]
Флажоле и др. в [2] представили вероятностный метод подсчета, который был вдохновлен статьей Роберта Морриса . [11] Моррис в своей статье говорит, что если требование точности отбросить, счетчик n можно заменить счетчиком log n , который может храниться в log log n битах. [12] Флажоле и др. в [2] улучшили этот метод, используя хэш-функцию h, которая, как предполагается, равномерно распределяет элемент в хэш-пространстве (двоичная строка длины L ).
Пусть bit( y,k ) представляет k-й бит в двоичном представлении y.
Пусть представляет позицию младшего значащего 1-го бита в двоичном представлении y i с подходящим соглашением для .
Пусть A — последовательность потока данных длиной M , мощность которого необходимо определить. Пусть BITMAP [0... L − 1] —
хэш-пространство, где записаны ρ ( hashedvalues ). Затем приведенный ниже алгоритм определяет приблизительную мощность A .
Процедура FM-Sketch: для i в диапазоне от 0 до L − 1 сделать BITMAP[i] := 0 конец для для x в A: сделать Индекс := ρ(хэш(x)) если BITMAP[индекс] = 0 тогда BITMAP[индекс] := 1 конец, если конец для B := Положение самого левого нулевого бита BITMAP[] возврат 2 ^ B
Если в потоке данных имеется N различных элементов.
Предыдущий алгоритм описывает первую попытку приближения F 0 в потоке данных, предпринятую Флажоле и Мартином. Их алгоритм выбирает случайную хэш-функцию , которая, как они предполагают, равномерно распределяет хэш-значения в хэш-пространстве.
Бар-Йоссеф и др. в [10] представили алгоритм k-минимального значения для определения количества различных элементов в потоке данных. Они использовали похожую хэш-функцию h , которая может быть нормализована до [0,1] как . Но они зафиксировали предел t для количества значений в хэш-пространстве. Значение t предполагается порядка (т.е. меньшее значение приближения ε требует большего t ). Алгоритм KMV сохраняет только t - наименьшие значения хэш-функции в хэш-пространстве. После того, как все m значений потока поступят, используется для вычисления . То есть, в близком к однородному хэш-пространстве они ожидают, что по крайней мере t элементов будут меньше .
Процедура 2 K-минимальное значениеИнициализируем первые значения t KMVдля а в а1 к делать если h(a) < Max(KMV), то Удалить Max(KMV) из набора KMV Вставьте h(a) в KMV конец, есликонец длявозврат т/Макс(КМВ)
Алгоритм KMV может быть реализован в пространстве бит памяти. Каждое хэш-значение требует пространства порядка бит памяти. Существуют хэш-значения порядка . Время доступа можно сократить, если хранить t хэш-значений в двоичном дереве. Таким образом, временная сложность будет снижена до .
Алон и др. оценивают F k , определяя случайные величины, которые могут быть вычислены в заданном пространстве и времени. [3] Ожидаемое значение случайных величин дает приблизительное значение F k .
Предположим, что длина последовательности m известна заранее. Тогда построим случайную величину X следующим образом:
Предположим, что S 1 имеет порядок , а S 2 имеет порядок . Алгоритм берет случайную величину S 2 и выводит медиану . Где Y i — среднее значение X ij , где 1 ≤ j ≤ S 1 .
Теперь вычислим математическое ожидание случайной величины E ( X ) .
Из алгоритма вычисления F k , рассмотренного выше, мы можем видеть, что каждая случайная величина X хранит значение a p и r . Таким образом, для вычисления X нам нужно поддерживать только log( n ) бит для хранения a p и log( n ) бит для хранения r . Общее количество случайных величин X будет .
Следовательно, общая пространственная сложность алгоритма имеет порядок
Предыдущий алгоритм вычисляет в порядке битов памяти. Алон и др. в [3] упростили этот алгоритм, используя четырежды независимую случайную величину со значениями, отображенными в .
Это еще больше снижает сложность вычислений
В модели потока данных проблема частых элементов заключается в выводе набора элементов, которые составляют больше некоторой фиксированной доли потока. Особым случаем является проблема большинства , которая заключается в определении того, составляет ли какое-либо значение большую часть потока.
Более формально, зафиксируем некоторую положительную константу c > 1, пусть длина потока будет m , и пусть f i обозначает частоту значения i в потоке. Проблема частых элементов заключается в выводе набора { i | f i > m/c }. [13]
Вот некоторые известные алгоритмы:
Обнаружение событий в потоках данных часто выполняется с использованием алгоритма Heavy hitters, как указано выше: наиболее частые элементы и их частота определяются с помощью одного из этих алгоритмов, затем наибольшее увеличение по сравнению с предыдущей точкой времени сообщается как тенденция. Этот подход можно усовершенствовать, используя экспоненциально взвешенные скользящие средние и дисперсию для нормализации. [14]
Подсчет количества различных элементов в потоке (иногда называемый моментом F 0 ) — еще одна хорошо изученная проблема. Первый алгоритм для нее предложили Флажоле и Мартин. В 2010 году Дэниел Кейн , Джелани Нельсон и Дэвид Вудрафф нашли асимптотически оптимальный алгоритм для этой проблемы. [15] Он использует O ( ε 2 + log d ) пространства с O (1) временем обновления и отчетности в худшем случае, а также универсальные хеш-функции и r -wise независимое хеш-семейство, где r = Ω(log(1/ ε ) / log log(1/ ε )) .
(Эмпирическая) энтропия набора частот определяется как , где .
Обучить модель (например, классификатор ) за один проход по обучающему набору.
Нижние границы были вычислены для многих проблем потоковой передачи данных, которые были изучены. До сих пор наиболее распространенной техникой для вычисления этих нижних границ было использование сложности связи . [ необходима цитата ]