স্লাইডিং উইন্ডো মিডিয়ান গণনার জন্য অনানুষ্ঠানিক অ্যালগরিদম


25

আমার চলমান মিডিয়ান গণনা করা দরকার:

  • ইনপুট: , , ভেক্টর ।nk(x1,x2,,xn)

  • আউটপুট: ভেক্টর , যেখানে হ'ল ।(y1,y2,,ynk+1)yi(xi,xi+1,,xi+k1)

(আনুমানিক সাথে কোনও প্রতারণা নয়; আমি সঠিক সমাধান পেতে চাই উপাদানসমূহ বৃহত্তর পূর্ণসংখ্যা))xi

একটি তুচ্ছ অ্যালগরিদম আছে যা সাইজের এর অনুসন্ধান গাছ বজায় রাখে ; মোট চলমান সময় হ'ল । (এখানে একটি "অনুসন্ধান ট্রি" কিছু কার্যকর ডেটা স্ট্রাকচারকে বোঝায় যা লগারিদমিক সময়ে সন্নিবেশ, মুছে ফেলা এবং মিডিয়ান কোয়েরিকে সমর্থন করে))( এন লগ কে )kO(nlogk)

তবে এটি আমার কাছে কিছুটা বোকা মনে হচ্ছে। আমরা কার্যকরভাবে শিখতে হবে সব আকারের সকল উইন্ডো মধ্যে অর্ডার পরিসংখ্যান , শুধু মধ্যমা। তদুপরি, এটি অনুশীলনে খুব আকর্ষণীয় নয়, বিশেষত কে বড় হলে (বড় সন্ধানের গাছগুলি ধীরে ধীরে থাকে, মেমরির ব্যবহারে ওভারহেড অপ্রয়োজনীয় হয়, ক্যাশে-দক্ষতা প্রায়শই দুর্বল থাকে ইত্যাদি)।kk

আমরা কি যথেষ্ট পরিমাণে আরও ভাল করতে পারি?

কোন নিম্ন সীমানা আছে (উদাহরণস্বরূপ, তুলনা মডেল জন্য তুচ্ছ আলগোরিদম asympototically অনুকূল)?


সম্পাদনা করুন: তুলনা মডেলটির জন্য দাউদ এপস্টিন একটি দুর্দান্ত নীচে দিয়েছিলেন! আমি ভাবছি তবুও তুচ্ছ অ্যালগরিদমের চেয়ে কিছুটা চালাক কিছু করা সম্ভব কিনা?

উদাহরণস্বরূপ, আমরা এই লাইনগুলি বরাবর কিছু করতে পারি: ইনপুট ভেক্টর আকারের কিছু অংশে ভাগ করুন ; প্রতিটি অংশকে বাছাই করুন (প্রতিটি উপাদানগুলির মূল অবস্থানগুলি লক্ষ্য রাখছেন); এবং তারপরে কোনও সহায়ক ডেটা স্ট্রাকচার ছাড়াই চলমান মিডিয়েনসকে দক্ষতার সাথে খুঁজে পেতে টুকরোড়া সাজানো ভেক্টর ব্যবহার করবেন? অবশ্যই এটি এখনও , তবে অনুশীলন অনুসারে অ্যারে বাছাই করা অনুসন্ধানের গাছগুলি রক্ষণাবেক্ষণের চেয়ে অনেক দ্রুত হতে পারে।kO(nlogk)


সম্পাদনা 2: সা Saeedদ অনুসন্ধানের ক্রিয়াকলাপগুলির চেয়ে বাছাই করা কেন দ্রুত বলে মনে করি তার কয়েকটি কারণ দেখতে চেয়েছিলেন। , জন্য এখানে খুব দ্রুত মানদণ্ড রয়েছে :k=107n=108

  • S 8s: প্রতিটি উপাদানগুলির সাথে ভেক্টর বাছাই করাn/kk
  • ≈ 10s: উপাদানগুলির সাথে একটি ভেক্টর বাছাই করাn
  • ≈ 80s: সন্নিবেশ & আকারের একটি হ্যাশ টেবিল মুছেnk
  • ≈ 390s: সন্নিবেশ & আকারের একটি সুষম অনুসন্ধান গাছে মুছেnk

হ্যাশ টেবিলটি কেবল তুলনার জন্য রয়েছে; এটি এই অ্যাপ্লিকেশনটিতে সরাসরি ব্যবহারের নয়।

সংক্ষেপে, ভারসাম্যপূর্ণ অনুসন্ধান ট্রি ক্রিয়াকলাপগুলি বাছাইয়ের পারফরম্যান্সে আমাদের প্রায় 50 টি পার্থক্য রয়েছে। এবং আমরা বাড়িয়ে দিলে জিনিসগুলি আরও খারাপ হয়ে যায় ।k

(প্রযুক্তিগত বিবরণ: ডেটা = এলোমেলো 32-বিট পূর্ণসংখ্যা। কম্পিউটার = একটি আদর্শ আধুনিক ল্যাপটপ। স্ট্যান্ডার্ড লাইব্রেরি রুটিনগুলি (স্ট্যান্ড :: সাজান) এবং ডেটা স্ট্রাকচার (স্টাড :: মাল্টিসেট, স্টেড ::) ব্যবহার করে পরীক্ষার কোডটি সি ++ তে লেখা হয়েছিল was আনসোর্টড_মলিটসেট) আমি দুটি পৃথক সি ++ কম্পাইলার (জিসিসি এবং ক্ল্যাং) এবং স্ট্যান্ডার্ড লাইব্রেরির দুটি পৃথক বাস্তবায়ন (libstdc ++ এবং libc ++) ব্যবহার করেছি ditionতিহ্যগতভাবে, std :: মাল্টিসেটটি একটি অত্যন্ত অনুকূলিত লাল-কালো গাছ হিসাবে প্রয়োগ করা হয়েছে))


1
আমি মনে করি না আপনি উন্নতি করতে সক্ষম হবেন । কারণ, যদি আপনি একটি উইন্ডোতে তাকান এক্স টি , , x t + k - 1 , আপনি x টি + কে কোনও সংখ্যার বাইরে যেতে পারবেন নাnlogkxt,...,xt+k1ভবিষ্যতের উইন্ডোর মিডিয়ান হওয়ার থেকে। এর অর্থ হ'ল যে কোনও সময় আপনাকে কোনওডেটা স্ট্রাকচারেকমপক্ষেপূর্ণসংখ্যার রাখতে হবে এবং লগ সময়ের চেয়ে কম আপডেট হবে বলে মনে হয় না। xt+k2,...,xt+k1k2
আরবি

আমাকে তোমার তুচ্ছ অ্যালগরিদম হবে বলে মনে হয় না হে ( লগ ইন করুন ) , আমি ভুল বুঝে ভাবেন কিছু নই? এবং আমি মনে করি এর কারণে আপনার বড় কে নিয়ে সমস্যা আছে , অন্যথায় লোগারিদমিক ফ্যাক্টর ব্যবহারিক প্রয়োগগুলিতে কিছুই নয়, এছাড়াও এই অ্যালগরিদমে কোনও বড় লুকানো ধ্রুবক নেই। O((nk)klogk)O(nlogk)k
Saeed

@ সাeedদ: তুচ্ছ অ্যালগরিদমে আপনি একের পর এক উপাদান প্রক্রিয়া করেন; ধাপে আপনি যোগ এক্স আমি অনুসন্ধান বৃক্ষ এবং (যদি আমি > ) আপনার কাছে অপসারণ এক্স আমি - অনুসন্ধান গাছ থেকে। এটি n পদক্ষেপ, যার প্রত্যেকটিতে O ( লগ কে ) সময় লাগে । ixii>kxiknO(logk)
Jukka Suomela

সুতরাং আপনার অর্থ কি আপনার ভারসাম্যযুক্ত অনুসন্ধানের গাছটি ন্যায্য অনুসন্ধানের গাছ নয়?
Saeed

1
@ সাeedদ: দয়া করে নোট করুন যে আমার মানদণ্ডে আমি মধ্যস্থদের সন্ধান করার চেষ্টাও করি নি। আমি মাত্র সাইজের কে- এর অনুসন্ধান বৃক্ষে সন্নিবেশ এবং এন মোছা করেছি এবং এই ক্রিয়াকলাপগুলিতে ( লগ কে ) সময় নেওয়ার নিশ্চয়তা রয়েছে । আপনাকে কেবল এটি গ্রহণ করতে হবে যে বাছাইয়ের তুলনায় অনুসন্ধান ট্রি ক্রিয়াকলাপগুলি অনুশীলনে খুব ধীর। আপনি এটি সহজে দেখতে পাবেন যদি আপনি একটি বাছাই করা অ্যালগরিদম লিখতে চেষ্টা করেন যা ভারসাম্যযুক্ত অনুসন্ধানের গাছগুলিতে উপাদান যুক্ত করে কাজ করে - এটি অবশ্যই ( এন লগ এন ) সময়ে কাজ করে তবে এটি হাস্যকরভাবে অনুশীলনে ধীর হয়ে যাবে এবং প্রচুর অপচয়ও করবে also স্মৃতি। nnkO(logk)O(nlogn)
Jukka Suomela

উত্তর:


32

এখানে বাছাই থেকে কম আবদ্ধ। একটি ইনপুট সেট দেওয়া দৈর্ঘ্যের এন সাজাতে হবে, আপনার গঠিত মধ্যমা সমস্যা চলমান একটি ইনপুট তৈরি এন - 1 একটি সংখ্যা সর্বনিম্ন চেয়ে ছোট কপি এস , তারপর S নিজেই, তারপর এন - 1 চেয়ে বড় একটি সংখ্যা কপি সর্বাধিক এস এবং কে = 2 এন - 1 সেট করুন । এই ইনপুটটির চলমান মিডিয়ানগুলি এস এর বাছাই করা ক্রমের সমান ।Snn1SSn1Sk=2n1S

সুতরাং গণনার তুলনা মডেলটিতে, সময় প্রয়োজন। সম্ভবত যদি আপনার ইনপুটগুলি পূর্ণসংখ্যা হয় এবং আপনি পূর্ণসংখ্যার বাছাই করা অ্যালগরিদম ব্যবহার করেন তবে আপনি আরও ভাল করতে পারেন।Ω(nlogn)


6
এই উত্তরটি আমাকে সত্যিই বিস্মিত করে তোলে যদি কনভার্সটিও ধরে রাখে: একটি দক্ষ বাছাই অ্যালগরিদম দেওয়া, আমরা কি একটি কার্যকর চলমান মিডিয়ান অ্যালগরিদম পাই? (উদাহরণস্বরূপ, দক্ষ পূর্ণসংখ্যার বাছাই অ্যালগরিদমটি কি পূর্ণসংখ্যার জন্য দক্ষ চলমান মিডিয়ান অ্যালগরিদমকে বোঝায়? বা কোনও আইও-দক্ষ বাছাই করা অ্যালগরিদম কোনও আইও-দক্ষ চালিত মিডিয়ান অ্যালগরিদম সরবরাহ করে?)
Jukka Suomela

1
আবারও, আপনার উত্তরের জন্য অনেক ধন্যবাদ, এটি আমাকে সত্যিকারের ট্র্যাকের উপরে ফেলেছে এবং বাছাই-ভিত্তিক মিডিয়াল ফিল্টার অ্যালগরিদমের জন্য অনুপ্রেরণা দিয়েছে! শেষ পর্যন্ত আমি 1991 সালের একটি কাগজ সন্ধান করতে সক্ষম হয়েছিল যা আপনি এখানে যা দেন তা মূলত একই যুক্তি উপস্থাপন করে এবং প্যাট মরিন ২০০৫ সাল থেকে অন্য প্রাসঙ্গিক কাগজে একটি পয়েন্টার দিয়েছেন; রেফারেস দেখুন। []] এবং [9] এখানে
Jukka Suomela

9

সম্পাদনা: এই অ্যালগরিদমটি এখন এখানে উপস্থাপন করা হয়েছে: http://arxiv.org/abs/1406.1717


হ্যাঁ, এই সমস্যাটি সমাধান করার জন্য নিম্নলিখিত ক্রিয়াকলাপগুলি সম্পাদন করা যথেষ্ট:

  • কে / এল উপাদান সহ প্রতিটি ভেক্টর বাছাই করুন ।n/kk
  • রৈখিক-সময় পোস্ট-প্রসেসিং করুন।

খুব মোটামুটিভাবে, ধারণাটি হ'ল:

  • ইনপুট দুটি সংলগ্ন ব্লক, এবং , উভয় কে উপাদান সহ বিবেচনা করুন; উপাদান হতে দিন একটি 1 , একটি 2 , , একটি এবং 1 , 2 , , বি কে ইনপুট ভেক্টর এক্স এর উপস্থিতি অনুসারে ।abka1,a2,...,akb1,b2,...,bkx
  • এই ব্লকগুলি বাছাই করুন এবং ব্লকের মধ্যে প্রতিটি উপাদানের অবস্থান শিখুন।
  • পূর্বসূরি / উত্তরসূরি পয়েন্টারগুলির সাথে ভেক্টরগুলিকে এবং b সংযোজন করুন যাতে পয়েন্টার চেইনগুলি অনুসরণ করে আমরা উপাদানগুলিকে একটি ক্রমবর্ধমান ক্রমে অতিক্রম করতে পারি। এই ভাবে আমরা নির্মাণ করেছি দোকর তালিকা লিঙ্ক একটি ' এবং 'abab
  • একের পর এক যুক্ত তালিকা থেকে সব উপাদান মুছে দিন, চেহারা বিপরীত ক্রম, , - 1 , , । যখনই আমরা কোনও উপাদান মুছি, মনে রাখবেন মোছার সময় এর উত্তরাধিকারী ও পূর্বসূরী কী ছিলbbk,bk1,...,b1
  • এখন বজায় রাখা "মধ্যমা পয়েন্টার" এবং কুই যে তালিকাতে বিন্দু একটি ' এবং ' যথাক্রমে। ইনিশিয়ালাইজ পি এর মিডপয়েন্ট থেকে একটি ' , এবং ইনিশিয়ালাইজ কুই খালি তালিকার লেজ থেকে 'pqabpaqb
  • প্রত্যেকের জন্য :i

    • মুছুন তালিকা থেকে একটি ' (এই হল হে ( 1 ) সময়, শুধু যুক্ত তালিকা থেকে মুছে)। তুলনা করুন একটি আমি উপাদান এর মাধ্যমে নির্দিষ্ট পি যদি আমরা আগে বা পরে মুছে দেখতে পিaiaO(1)aipp
    • রাখুন তালিকাতে ফিরে ' তার মূল অবস্থানে থাকে (এটি হে ( 1 ) সময়, আমরা পূর্বসুরী এবং উত্তরাধিকারী মুখস্ত আমি )। তুলনা আমি উপাদান দ্বারা ইশারা দিয়ে কুই যদি আমরা আগে বা পরে উপাদান যোগ দেখতে কুইbibO(1)bibiqq
    • পয়েন্টার আপডেট এবং কুই যাতে যোগদান তালিকার মধ্যমা একটি '' এ যেকোনো হয় পি বা কুই । (এটি ( 1 ) সময়, সমস্ত কিছু সংশোধন করার জন্য কেবল লিঙ্কযুক্ত তালিকাগুলি অনুসরণ করুন each প্রতিটি তালিকায় পি এবং কিউ এর আগে / পরে কতগুলি আইটেম রয়েছে তা আমরা পর্যবেক্ষণ করব এবং আমরা আক্রমণকারীটি বজায় রাখব যে উভয় পি এবং q এমন উপাদানগুলির দিকে নির্দেশ করুন যা সম্ভব যতটা মধ্যকের কাছাকাছি থাকে))pqabpqO(1)pqpq

লিঙ্কযুক্ত তালিকাগুলি কেবলমাত্র সূচিগুলির এলিমেন্ট অ্যারে, তাই এগুলি লাইটওয়েট হয় (মেমরি অ্যাক্সেসের লোকেশনটি কম নয়)।k


এখানে একটি নমুনা বাস্তবায়ন এবং মানদণ্ড রয়েছে:

এখানে চলমান সময়গুলির একটি প্লট ( ):n2106

  • নীল = বাছাই + পোস্ট-প্রক্রিয়াজাতকরণ, O(nlogk)
  • সবুজ = https://github.com/craffel/median-filter থেকে দুটি কার্যকর, বজায় রাখুনO(nlogk)
  • লাল = দুটি অনুসন্ধান গাছ বজায় রাখুন, O(nlogk)
  • কালো = বাছাই করা ভেক্টর বজায় রাখুন, O(nk)
  • এক্স অক্ষ = উইন্ডোর আকার ( )।k/2
  • Y অক্ষ = সেকেন্ডে চলমান সময়।
  • ডেটা = 32-বিট পূর্ণসংখ্যা এবং এলোমেলোভাবে 64-বিট পূর্ণসংখ্যা, বিভিন্ন বিতরণ থেকে।

running times


3

ডেভিডের সীমাবদ্ধতার পরিপ্রেক্ষিতে এটি সম্ভবত আপনি সবচেয়ে খারাপ ক্ষেত্রে করতে পারবেন না, তবে আরও ভাল আউটপুট সংবেদনশীল অ্যালগরিদম রয়েছে। বিশেষত, ফলাফলটিতে মিডিয়ান সংখ্যায় যদি হয় তবে আমরা O ( n লগ এম + এম লগ এন ) সময়ে সমস্যাটি সমাধান করতে পারি ।mO(nlogm+mlogn)

এটি করার জন্য, ভারসাম্য বাইনারি গাছের সাথে ভারসাম্যযুক্ত বাইনারি গাছের সাথে প্রতিস্থাপন করুন কেবলমাত্র সেই উপাদানগুলিতে যা অতীতে মধ্যযুগীয় ছিল, এবং পূর্ববর্তী মিডিয়ানদের প্রতিটি জোড় (প্রতিটি দিকের জন্য একটি) এর মধ্যে দুটি ফিবোনাচি হ'ল, এবং আরও গুনে যাতে আমরা করতে পারি কোন ফিবোনাচি হিপটিতে ক্রমে একটি নির্দিষ্ট উপাদান রয়েছে তা সনাক্ত করুন। উপাদানগুলি মুছতে কখনও বিরক্ত করবেন না। যখন আমরা একটি নতুন উপাদান সন্নিবেশ করি তখন আমরা সময়ে আমাদের ডেটা স্ট্রাকচার আপডেট করতে পারি । যদি নতুন গণনাগুলি ইঙ্গিত দেয় যে মিডিয়ানটি ফিবোনাচি হিপগুলির মধ্যে একটিতে রয়েছে তবে নতুন মিডিয়ানটিকে বাইরে টেনে আনতে অতিরিক্ত ( লগ এন ) লাগে । এই হে ( লগ এন )O(logm)O(logn)O(logn) চার্জ প্রতি মিডিয়ান প্রতি একবার হয়।

যদি সুন্দর ফিবোনাচি হিপ জটিলতার ক্ষতি না করে উপাদানগুলি মুছতে কোনও পরিষ্কার উপায় থাকে তবে আমরা , তবে আমি নিশ্চিত নই যে এটি সম্ভব কিনা।O(nlogm+mlogk)


ওহো, এটি লিখিত হিসাবে কাজ করবে না, কারণ আপনি যদি উপাদানগুলি মুছেন না তবে গণনাগুলি নতুন উইন্ডোকে প্রতিফলিত করবে না। এটি ঠিক করা যায় কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে কোনও উপায় থাকলে আমি উত্তরটি ছেড়ে দেব।
জেফ্রি ইরভিং

সুতরাং আমি মনে করি এই অ্যালগরিদমটি আসলে ফিনোনাচি হিপগুলি থেকে নোডগুলি মুছে ফেললে নিতে পারে , যেহেতু ডিলিট-মিনিট বলা হয় তখনই ফিবোনাচি হিপ গভীরতা বৃদ্ধি পায়। ডিলিট-মিনিটের কলগুলিকে অ্যাকাউন্টে গ্রহণ করে কেউ কি ফিবোনাচি হিপ জটিলতায় সুন্দর সীমানা জানে? O(nlogm)
জেফ্রি ইরভিং

পার্শ্ব দ্রষ্টব্য: প্রশ্ন পরিষ্কার নয়, আন্ডারলিং ডেটা স্ট্রাকচারটি সংজ্ঞায়িত করা হয়নি, আমরা কেবল খুব অস্পষ্ট কিছু জানি। আপনি কীভাবে এমন কোনও উন্নতি করতে চান যা আপনি জানেন না এটি কী? আপনি কিভাবে আপনার পদ্ধতির তুলনা করতে চান?
Saeed

1
অসম্পূর্ণ কাজের জন্য আমি ক্ষমা চেয়ে নিচ্ছি। আমি এই উত্তরটি এখানে ঠিক করার জন্য প্রয়োজনীয় কংক্রিট প্রশ্ন জিজ্ঞাসা করেছি: cstheory.stackexchange.com/questions/21778/… । আপনি যদি এটি যথাযথ মনে করেন তবে দ্বিতীয় উত্তরটি সমাধান না হওয়া পর্যন্ত আমি এই উত্তরটি সরিয়ে ফেলতে পারি।
জেফ্রি ইরভিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.