الگوریتم جریان داده‌ها

در علم رایانه الگوریتم جریان داده‌ها (به انگلیسی: Streaming algorithm) الگوریتمی ست برای پردازش جریان داده‌ها که به صورت توالی از آیتم‌ها به عنوان ورودی هستند و از یک یا تعداد محدودی گذرگاه می‌توانند مورد بررسی قرار بگیرند. در واقع این الگوریتم دنباله‌ای از داده را به عنوان ورودی دریافت کرده و یک سری تابع روی آن‌ها اعمال می‌کند. این الگوریتم حافظه مورد نیاز (کمتر از اندازه واقعی خود ورودی) و زمان پردازش هر آیتم را هم محدود می‌کند. این محدودیت‌ها به این معناست که این الگوریتم جواب تقریبی بر اساس یک خلاصه یا «طرحی» از جریان داده‌ها در حافظه تولید می‌کند.

تاریخچه

اگرچه مطالعه الگوریتم جریان توسط مونرو و پاترسون دراوایل ۱۹۸۰ آغاز شد اما توسط Philippe Flajolet و نایجل مارتین در ۱۹۸۲–۱۹۸۳ باعث شد موضوعات مرتبط به الگوریتم‌های جریان برای اولین بار به رسمیت شناخته شود و در یک مقاله در سال ۱۹۹۶ توسط نوگا آلون، یوسی ماتیاس، و ماریو محبوب شد. نویسندگان این مقاله بعداً جایزه گودل در سال ۲۰۰۵ را «برای سهم بنیادی شان نسبت به الگوریتم‌های جریانی» کسب کردند. از آن زمان کار زیادی حول الگوریتم‌های جریان داده انجام شد که طیف متنوعی از زمینه‌های علوم کامپیوتر از قبیل تئوری، پایگاه داده، شبکه و پردازش زبان طبیعی را گسترش داد. الگوریتم‌های نیمه جریانی در سال ۲۰۰۵ به عنوان یک فرمت از الگوریتم‌های جریانی ارائه شد که برای تعداد ثابت یا لگاریتمی از گذرگاه‌ها روی مجموعهٔ داده‌ها امکان‌پذیر است.

مدل‌ها

در مدل جریان داده‌ها، برخی یا همه داده‌های ورودی که قابل عملیات هستند، برای دسترسی تصادفی از روی دیسک یا حافظه در دسترس نیستند، اما به عنوان یک جریان داده پیوسته سریع تر می‌رسند. جریان را می‌توان به صورت دنباله‌ای از نقاط تعریف کرد که می‌تواند تنها یک بار یا تعداد کمی در دسترس قرار بگیرد. بسیاری از ادبیات جریانی با آمار کامپیوتری روی داده‌های توزیعی که برای ذخیره کردن بسیار بزرگ هستند، مرتبط است. برای این دسته از مشکلات یک بردار a = ( , … , ) تعریف می‌کنیم که به صفر مقداردهی اولیه می‌کنیم که در یک جریان داده آمادهٔ به روزرسانی می‌باشد. هدف از این الگوریتم محاسبه توابعی از a با استفاده از فضای بسیار کمتری نسبت به فضایی که دقیقاً اشغال می‌کند، است. دو مدل رایج برای به روزرسانی هر جریان وجود دارد، به نام "مدل درخواست نقدی" (به انگلیسی:cash register) و "مدل گردان (به انگلیسی turnstile).
در مدل درخواست نقدی، هر به روزرسانی به فرم (i,c) می‌باشد به‌طوری‌که   توسط c عدد صحیح مثبت افزایش می‌یابد. در مدل گردان هیچ‌کدام ازها منفی نیستند. چندین مقاله نیز مدل «پنجره کشویی» را مطرح گرده‌اند. در این مدل، تابع مورد نظربرای محاسبه بیش از یک پنجره با اندازه ثابت در جریان داده دارد. هنگامی که جریان داده پیشرفت کند، یک آیتم از انتهای این جریان حذف شده و یک آیتم جدید جای آن را می‌گیرد.

علاوه بر مشکلاتی که در فرکانس بالا ایجادمیشود، مشکلات دیگر نیز بررسی شده‌است. تعدادی از مسائل گراف، با  ماتریس همسایگی  یا  فهرست همسایگی  که به صورت جریانی تعریف شده باشند، حل شده‌است. تعدادی از مشکلات این حوزه نیز به order(حجم و ترتیب و تعداد آیتم‌ها) یک جریان بستگی دارد. (مثلاً توابع نامتقارن) به‌طور مثال شمارش تعداد  نابه جایی‌ها در یک توالی داده مثلاً یک آرایه و یافتن  طولانی‌ترین زیررشته صعودی . در واقع الگوریتم‌های مطرح برای رسیدن به این خواسته‌ها به طول رشته داده بستگی دارد و هرچه تعداد آیتم‌های این توالی داده‌ها بیشتر باشد، زمان اجرای الگوریتم و رسیدن به مطلوب سؤال یشتر می‌شود، در واقع مفهوم order به معنی میزان زمان اجرای الگوریتم و تعداد عملیات‌های انجام شده در یک الگوریتم و پیچیدگی الگوریتم می‌باشد. با توجه به حجم داده‌ها، مدل جریان داده‌ها در پیدا کردن نابه جایی‌ها یک محیط طبیعی برای طراحی کارآمد است. ما مجموعه‌ای از الگوریتم‌های جریانی کارآمد، برای تخمین تعداد نابه جایی‌ها در یک جایگشت به دست می‌آوریم. بهترین order برای این الگوریتم‌ها الگوریتم قطعی (deterministic) است که در انجام می‌شود (عبارت  به این مفهوم است که وقتی طول رشته داده ما n باشد زمان اجرای الگوریتم و همان order الگوریتم یک ضریبی از   می‌باشد).

کاربردها

الگوریتم جریان داده‌ها چندین کابرد در حوزه  شبکه رایانه‌ای  از قبیل کنترل پیوندهای شبکه برای  جریان‌های بزرگ داده، شمارش تعداد جریان‌های متمایز، برآورد توزیع اندازه جریان و غیره دارد. هم‌چنین تعدادی کابرد در زمینهٔ پایگاه داده دارد مانند تخمین اندازه  پیوندها.

به عنوان مثال در زمینه ارتباطات :۳ میلیارد تماس‌های تلفنی در آمریکا هر روز ۳۰ میلیارد ایمیل‌های روزانه، ۱ میلیارد اس‌ام‌اس وجود دارد که ذخیره تمام این داده‌ها در حافظه با دسترسی تصادفی برای پردازش غیرممکن است؛ که راه حل این مسئله پردازش داده‌ها به عنوان یک جریان و بردازش روی این داده‌ها می‌باشد.

ممان فرکانسی

k مین ممان فرکانسی از مجموعه فرکانس‌ها به اسم a ایگونه تعریف می‌شود:  

اولین ممان  به سادگی مجموع فرکانس‌هاست (به عنوان مثال، تعداد کل). رخداد برای محاسبه خواص آماری از داده‌ها، مانند شاخص جینی مورد استفاده است.   به عنوان فرکانس عضو پرفرکانس‌ترین تعریف می‌شود.

مقاله بدوی از آلون، ماتیاس و Szegedy به مشکل برآورد لحظات فرکانس پرداخته است.

محاسبه ممان فرکانسی

یک روش مستقیم برای پیدا کردن ممان‌های فرکانس نیاز به حفظ یک ثبات  برای همه عناصر متمایز  که عضو (۱٬۲٬۳٬۴، …، N) می‌باشد که به حداقل حافظه با حدود نیاز دارند. اما ما باید محدودیت فضا مواجه هستیم و نیاز به یک الگوریتم است که در حافظه بسیار پایین‌تر محاسبه کند. به این می‌توان با استفاده از تقریب به جای ارزش‌های دقیق دست یافت. یک الگوریتمی که محاسبه می‌کند یک تقریب ( , ) از   که   به عنوان پارامتر تقریب و   به عنوان پارامتر اطمینان است. .

الگوریتم FM-Sketch

فلاجولت (به انگلیسی: Flajolet) وهمکاران در روش احتمالاتی از شمارش که از یک مقاله نوشتهٔ رابرت موریس الهام گرفته شده بود، شمارش تعداد زیادی از حوادث در ثبات‌های کوچک را معرفی کرد. موریس در مقاله خود می‌گوید که اگر نیاز به دقت، کاهش یافته‌است، یک شمارنده   می‌تواند با یک شمارنده  جایگزین شود که در  بیت ذخیره می‌شود. فلاجولت (به انگلیسی: Flajolet) وهمکاران این روش را با استفاده از تابع هش  که عناصر را به صورت یکنواخت در فضای هش توزیع می‌کند (یک رشته عدد باینری به طول  )، بهبود بخشیدند.

فرض کنید bit(y,k) نشان‌دهنده بیت k ام در عدد باینری y است :   

فرض کنید  نشان‌دهنده کم ارزش‌ترین بیت ۱ در نمایش باینری عدد  با یک قرارداد و تعریف مناسب از 
می‌باشد. 

فرض کنید A یک دنباله‌ای از داده‌ها به طول M است که کاردینالیتی مورد نیاز را مشخص می‌کند. فرض کنید BITMAP[0..L-1] فضای هش می‌باشد که  در آنجا ثبت می‌شود. الگوریتم زیر کاردینالیتی تقریبی A را مشخص می‌کند.
Procedure FM-Sketch:
 for i in 0 to L − 1 do
 BITMAP[i]:=0
 end for
 for x in A: do
 Index:=ρ(hash(x))
 i
 end if
 end for
 B:= Position of left most 0 bit of BITMAP[]
 return 2^B

اگر n عنصر متمایز و جدا در جریان داده وجود داشته باشد:
برای همه  ، در این صورت: BITMAP[i]=0

برای همه   ، در این صورت: BITMAP[i] = 1

برای همه  ، در این صورت BITMAP[i] عددی اطراف ۰ و ۱ می‌شود.

الگوریتم ارزش k امین مینیمم

الگوریتم قبلی اولین تلاش و مرحله برای تقریب  در جریان داده‌ها توسط فلاجولت و مارتین توصیف می‌کند. الگوریتم یک تابع هش تصادفی را انتخاب می‌کند که به‌طور یکنواخت مقادیر را به فضای هش می‌برد.

باریوسف و همکاران الگوریتم مقدار k امین مینیمم برای تعیین تعداد عناصر متمایز در جریان داده‌ها را معرفی کردند. آن‌ها از یک تابع هش مشابه استفاده کردند که مقادیر رو بین ۰ و ۱ می‌برد (عملیات نرمال کردن) . اما آن‌ها یک مقدار محدود t را برای تعداد عناصر موجود در فضای هش یعنی بازه [۰٬۱] ثابت کردند. مقدار t از  می‌باشد. الگوریتم KVM مقدار هش شدهٔ کوچک‌ترین t را نگه می‌دارد. پس ازاینکه همه m مقدار داده دریافت شد ،  تا بتواند به وسیله آن   را حساب کند. در بازه فضای یکنواخت هش، آن‌ها انتظار دارند که کمترین مقدار t از  کمتر باشد.
Procedure 2 K-Minimum Value

Initialize first t values of KMV
for a in a1 to an do
if h(a) <Max(KMV) then
Remove Max(KMV) from KMV set
Insert h(a) to KMV
end if
end for
return t/Max(KMV)

تحلیل پیچیدگی الگوریتم KMV

الگوریتم یافتن مقدار k امین مینیمم می‌تواند در  از بیت‌های حافظه پیاده‌سازی شود. هش کردن هر مقدار  از بیت‌های حافظه را نیاز دارد؛ و تعداد هش کردن مقادیر نیز از 
می‌باشد. اگر مقدار هش شده t در درخت باینری قرار داده شود، زمان دسترسی به آن به مقدار  کاهش یافته و به‌طور کلی الگوریتم به  کاهش می‌یابد.

پیچیدگی
  
    
      
        
          F
          
            k
          
        
      
    
    {\displaystyle F_{k}}

باتوجه به الگوریتم بالا برای محاسبه  که در آن متغیر تصادفی X دو مقدار  و  را ذخیره می‌کند پس متوجه می‌شویم برای محاسبه X به log(n) بیت برای ذخیره کردن  و log(n) بیت برای ذخیره کردن  نیازمندیم. تعداد کل متغیرتصادفی X از  محاسبه می‌شود؛ بنابراین کل الگوریتم از  می‌باشد.

روش مشابه برای محاسبه 
  
    
      
        
          F
          
            k
          
        
      
    
    {\displaystyle F_{k}}

الگوریتم قبلی  را در  از حافظه محاسبه می‌کرد. آلون و همکاران ساده شده این الگوریتم را با استفاده از چهار متغیر تصادفی مستقل که مقادیر رو در بازه     هش می‌کند. این کار پیچیدگی الگوریتم را به  کاهش می‌دهد.

تشخیص رویداد

تشخیص رویدادها در جریان داده اغلب با استفاده از یک الگوریتم بزرگان که در بالا ذکر شده‌است، انجام می‌شود. شایع‌ترین عناصر و میزان فرکانس و تکرار با استفاده یکی از این الگوریتمها تعیین می‌شود، سپس بیشترین افزایشی که در طول زمان گذشته رخ داده گزارش شود. این رویکرد می‌تواند با استفاده از میانگین متحرک نمایی و واریانس عادی و نرمال شده تصفیه شود.
.

شمارش عناصر متمایز

شمارش تعداد عناصر متمایز در یک جریان (گاهی اوقات ممان خوانده می‌شود) مشکل دیگری است که به خوبی مورد مطالعه قرار گرفته‌است. اولین الگوریتم برای آن توسط فلاجولت و مارتین ارائه شده‌است. در سال ۲۰۱۰ کین، نلسون و ودراف یک الگوریتم مجانبی بهینه برای این مشکل پیدا کرده‌اند. این الگوریتم از O(ε² + log d) برای حافظه و فضا، بدترین حالت به روزرسانی و زمانش از O(1)، هم‌چنین توابع هش جهانی و یک مجموعه از r هش مستقل به‌طوری کهr = Ω(log(1/ε) / log log(1/ε))استفاده می‌کند.

کران پایین

کران پایین برای بسیاری از مشکلات جریان داده که مطالعه شده‌اند محاسبه شده‌است. تا کنون، متداول‌ترین روش برای محاسبه این کران استفاده از پیچیدگی‌های ارتباطی است.