চলমান মিডিয়ান গণনা করতে অ্যালগরিদম?


18

ছোট উইন্ডো আকারে, n log nবাছাইয়ের কাজ হতে পারে। এটি অর্জনের জন্য আরও ভাল অ্যালগরিদম আছে কি?


1
আমি মনে করি এটি স্ট্যাক ওভারফ্লোতে সরানো প্রথম প্রার্থী।

সম্ভবত, তবে এটির জন্য আরও অনেক বেশি ব্যাখ্যা দরকার।
ওয়াকিটাল্কি

2
বেশিরভাগ প্রোগ্রামাররা "মিডিয়ান" জানেন। (সাজান (অ্যারে)) [দৈর্ঘ্য / 2] যাঁরা ভুলে গিয়েছিলেন তাদের পক্ষে একটি বড় যথেষ্ট ইঙ্গিত। প্রতিটি নতুন পয়েন্টের জন্য এটির সবচেয়ে বেসিকটিতে আপনাকে কেবল অ্যারের এক অর্ধেক অংশে বাইসেকশন / inোকানো প্রয়োজন ...
পল


2
একটি মন্তব্যের চেয়ে বেশি তুচ্ছ, তবে 3s এর মধ্যমগুলির কোড কেবল একটি + বি + সি - সর্বাধিক (ক, বি, সি) - নূন্যতম (ক, খ। সি)। সম্পর্ক বিদ্যমান থাকলেও এটি কাজ করে। এটি কেবল তখনই আমার কাছে স্পষ্ট হয়েছিল যখন আমি অন্য কারও কোড থেকে এটি সম্পর্কে চিন্তা করেছিলাম (কেন তিনি (এই ক্ষেত্রে) একজন মিডিয়ান পেতে যোগ এবং বিয়োগ করছেন ???) এবং আরও কয়েকজনের একই প্রতিক্রিয়া হতে পারে। সর্বোচ্চ () এবং কমপক্ষে () কমপক্ষে সুপার-ফাস্ট ফাংশন হিসাবে প্রয়োগ করা হয়। দুঃখজনকভাবে সাধারণভাবে এরকম কোনও কৌশল নেই।
নিক কক্স

উত্তর:


11

কোনও মিডিয়ান গণনা করার জন্য অ্যারে বাছাই করা এটি খারাপ ফর্ম। মেডিয়ান (এবং অন্যান্য কোয়ান্টাইলস) সাধারণত ( এন ) জটিলতার সাথে কুইক সিলেক্ট অ্যালগরিদম ব্যবহার করে গণনা করা হয় ।হে(এন)

আপনি এখানে সাম্প্রতিক সম্পর্কিত প্রশ্নের আমার উত্তরটিও দেখতে চাইতে পারেন ।


7

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


1
লিঙ্কটি নষ্ট হয়ে গেছে, এবং শিরোনাম বা লেখকের তথ্য ছাড়াই এটি যা উল্লেখ করা হয়েছে তা খুঁজে পাওয়া শক্ত।
ক্রিস্টোফার জনসন


6

আপনি যদি একটি আনুমানিক সহ্য করতে রাজি হন তবে অন্যান্য পদ্ধতিও রয়েছে। উদাহরণস্বরূপ, একটি আনুমানিক একটি মান যাঁর র‌্যাঙ্ক প্রকৃত মিডিয়ান থেকে কিছু (ব্যবহারকারী নির্দিষ্ট) দূরত্বে থাকে। উদাহরণস্বরূপ, মিডিয়ানটি (সাধারণীকরণের) র‌্যাঙ্কটি 0.5 রেখেছে এবং আপনি যদি 10% এর ত্রুটি শব্দটি নির্দিষ্ট করেন তবে আপনি একটি উত্তর চান যা 0.45 এবং 0.55 এর মধ্যে রয়েছে।

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

সুতরাং, মূল প্রশ্নটি কীভাবে কোনও নির্দিষ্ট আকারের ডেটার চলমান নমুনা বজায় রাখতে হয় এবং জলাশয়ের নমুনা হিসাবে পরিচিত প্রযুক্তি সহ এর জন্য অনেকগুলি পন্থা রয়েছে। উদাহরণস্বরূপ, এই কাগজ: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.7136


4

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


1
বাছাই করা দ্বিগুণ-লিঙ্ক তালিকায় আপনি কীভাবে বাইনারি অনুসন্ধানের প্রস্তাব দেওয়ার বিষয়ে বিস্তারিত ব্যাখ্যা করতে পারেন?
এনপিই

একটি 'লিঙ্ক' আপনাকে তালিকাটিকে সাজানো ক্রমে অতিক্রম করতে দেয়; অপরটি আপনাকে যে ক্রমে উপাদানগুলি প্রদর্শিত হবে সেটিকে অতিক্রম করতে দেয়। এটি কীভাবে আপনি পয়েন্টার দিয়ে এটি করবেন তা স্পষ্ট নয়, যদিও @ অ্যাক্স প্রশ্ন হিসাবে।
shabbychef

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

3

যেমন আপনি উল্লেখ করেছেন বাছাই করা হবে O(n·log n) দৈর্ঘ্যের একটি উইন্ডো জন্যn । এই চলনটি করা l=vectorlengthমোট ব্যয়কে আরও একটি যোগ করে O(l·n·log n)

এটিকে ধাক্কা দেওয়ার সহজতম উপায় হ'ল এক উইন্ডো থেকে পরের উইন্ডোতে যাওয়ার সময় মেমোরিতে সর্বশেষ n উপাদানগুলির একটি অর্ডার করা তালিকা রাখা। অর্ডার তালিকায় / থেকে একটি উপাদান সরিয়ে / সন্নিবেশ করানো উভয়ই O(n)এর ব্যয় হতে পারে O(l·n)

সুডোকোড:

l = length(input)
aidvector = sort(input(1:n))
output(i) = aid(n/2)
for i = n+1:l
    remove input(i-n) from aidvector
    sort aid(n) into aidvector
    output(i) = aid(n/2)

3

এখানে বর্তমান মিডিয়ান সন্ধানের জন্য একটি সমাধান ও (1), এবং একটি নতুন সংখ্যা যুক্ত করার জন্য ও (লগ এন) http://www.dsalgo.com/RunningMedian.php


2

আপনি যদি সত্যিকারের মাধ্যমের পরিবর্তে কোনও অনুমানের সাথে বেঁচে থাকতে পারেন তবে রেমেডিয়ান অ্যালগরিদম (পিডিএফ) হ'ল স্বল্প সঞ্চয়ের প্রয়োজনীয়তা এবং সঠিকভাবে সংজ্ঞায়িত নির্ভুলতার সাথে এক পাস।

বেস বি দিয়ে প্রতিকারকারী বি পর্যবেক্ষণের গ্রুপগুলির মিডিয়ানগুলির গণনা করে এবং তারপরে এই মিডিয়ানদের মধ্যকগণের দ্বারা এগিয়ে যায়, যতক্ষণ না কেবল একটি একক অনুমান থাকে। এই পদ্ধতিতে কেবল খ আকারের k অ্যারে প্রয়োজন (যেখানে এন = বি ^ কে) ...


0

আমি এই রানিংস্ট্যাটস সি ++ লাইব্রেরি ব্যবহার করেছি একটি এম্বেড অ্যাপ্লিকেশনটিতে ব্যবহার করেছি। এটি আমি খুঁজে পাওয়া সবচেয়ে সহজ চলমান পরিসংখ্যান লাইব্রেরি।

লিঙ্ক থেকে:

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


সেই পৃষ্ঠাটি কি মিডিয়ান সম্পর্কে কিছু বলে?
মুসফিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.