সর্বশেষ এন সংখ্যার যোগফল


19

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

আমাদের যদি গণনার ক্ষেত্রে সহায়তা করার জন্য কোনও ডেটা কাঠামো রাখার অনুমতি দেওয়া হয় তবে এটি কতটা দক্ষতার সাথে করতে পারেন? আমরা কী চেয়ে আরও ভাল কিছু করতে পারি Θ(N), অর্থাত প্রতিবার একটি নম্বর পাওয়ার পরে যোগফলটি পুনর্নির্মাণ করতে পারি?

উদাহরণস্বরূপ: ধরুন ওজন হয় W=w1,w2,w3,w4 । এক পর্যায়ে আমরা গত কয়েক তালিকা আছে N সংখ্যার L1=a,b,c,d> , এবং ভরযুক্ত সমষ্টি S1=w1a+w2b+w3c+w4d

যখন অন্য একটি নম্বর, e , গ্রহণ করা, তখন আমরা পেতে তালিকা আপডেট L2=b,c,d,e এবং আমরা গনা প্রয়োজন S2=w1b+w2c+w3d+w4e

এফএফটি ব্যবহার করে বিবেচনা করা এই সমস্যার একটি বিশেষ ক্ষেত্রে দ্রুত ফুয়ুরি ট্রান্সফর্ম নিয়োগ দিয়ে দক্ষতার সাথে সমাধানযোগ্য বলে মনে হয়। এখানে, আমরা তুলিত অঙ্কের গনা S গুণিতকে N । অন্য কথায়, আমরা N নম্বরগুলি পাই এবং কেবলমাত্র তখনই আমরা সংশ্লিষ্ট N ওজনের পরিমাণগুলি গণনা করতে পারি । এটি করার জন্য, আমাদের N1 অতীতের সংখ্যাগুলি (যার জন্য অঙ্কগুলি ইতিমধ্যে গণনা করা হয়েছে) এবং মোট 2 এন - 1 নম্বরগুলিতে N নতুন সংখ্যা দরকার।2N1

যদি ইনপুট সংখ্যার এই ভেক্টর এবং ওজন ভেক্টর W বহুবর্ষ P(x) এবং Q(x) এর Q দেয়, তবে Q এর বিপরীতমুখী সহ, আমরা দেখতে পাই যে পণ্য P(x)×Q(x) একটি বহুবর্ষ যার সামনে কোফিসিয়েন্টস xN1 পর্যন্ত x2N2 ঠিক ভরযুক্ত অঙ্কের আমরা চাইতে হয়। এসব FFT ব্যবহার করে গণনা করা যাবে সময়, যা আমাদের গড়ে দেয় Θ ( লগ ( এন ) ) ইনপুট সংখ্যা প্রতি সময়।Θ(Nlog(N))Θ(log(N))

তবে এটি সমস্যার সমাধান হিসাবে যেমনটি বলা হয়েছে তেমন সমাধান নয়, কারণ প্রতিটি বার নতুন নম্বর পাওয়ার সময় ওজনফলকে দক্ষতার সাথে গণনা করা দরকার - আমরা গণনাটি বিলম্ব করতে পারি না।


নোট করুন যে আপনি এখানে ল্যাটেক্স ব্যবহার করতে পারেন
রাফেল

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

এফআইআর ফিল্টারগুলি এটি করে, তাই তাদের নকশা প্রাসঙ্গিক হবে।
অ্যাড্রিয়ানএন

@ আরডিএন আমি এই প্রশ্নটিকে কৌতূহল হিসাবে তুলে ধরেছি, আমার মনে ব্যবহারিক প্রয়োগ নেই।
আম্বروز বিজ্জাক

উত্তর:


6

এখানে আপনার পদ্ধতির একটি বিস্তারিত। প্রতিটি পুনরাবৃত্তিও, আমরা গনা FFT অ্যালগরিদম ব্যবহার মি সময় সংবর্তন মান হে ( লগ ইন করুন এন ) অভিমানী যে পরবর্তী মি মান শূন্য হয়। অন্য কথায়, আমরা n - 1 i = 0 w i a t - i + k গণনা করছি ,mmO(nlogn)m যেখানে W আমি হয় এন ওজন (অথবা বিপরীত ওজন), একটি আমি ইনপুট ক্রম হয়, টি , বর্তমান সময় এবং একটি টি ' = 0 জন্য টি ' > টন

i=0n1wiati+k,0km1,
winaitat=0t>t

নিম্নলিখিত প্রতিটি পুনরাবৃত্তির জন্য, আমরা সময় হে ( এম ) এ প্রয়োজনীয় সমাবর্তন গণনা করতে সক্ষম ( i ম পুনরাবৃত্তির সময় ( i ) প্রয়োজন )। সুতরাং অনুমিত সময় হ'ল ( এম ) + ( এন লগ এন / এম ) । এটি এম = choosing নির্বাচন করে হ্রাস করা হয় mO(m)iO(i)O(m)+O(nlogn/m) , যাহে( ) এর একটি চলমান সময় দেয়m=nlognO(nlogn)

আমরা এটিকে ( √) এর সবচেয়ে খারাপ সময়ে চলতে চলতে উন্নত করতে পারি অংশগুলিতে গণনা ভেঙে। ফিক্সমি, এবং সংজ্ঞায়িত টি , পি , = মি - 1 Σ আমি = 0 W পি মি + + আমি একটি টি মিটার - আমি + + ,O(nlogn)m প্রতিটি সি টি , পি কেবলমাত্র 2 মি ইনপুটগুলিরউপর নির্ভর করেতাই এটি( এম লগ এম ) সময়ে গণনা করা যায়। এছাড়াও, প্রদত্ত সি টি / মি - পি , পি জন্য 0 পি এন

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)Ct/mp,p0pn/m1 , আমরা সময় মধ্যে কনভলিউশনটি গণনা করতে পারি । পরিকল্পনা অতএব তালিকা বজায় রাখা হয় সি টি / মি - পি , পি ,O(n/m+m)মি ইনপুটগুলির প্রতিটি সময়কালেরজন্য আমাদের এগুলির n / m আপডেট করতে হবে। প্রতিটি আপডেটে O ( m লগ এম ) সময় লাগে, সুতরাং আমরা এই আপডেটগুলি সমানভাবে ছড়িয়ে দিলে প্রতিটি ইনপুট O ( ( n / m 2 ) m log m ) = O ( ( n / m ) লগ এম ) গ্রহণ করবে
Ct/mp,p,0pn/m1.
mn/mO(mlogm)O((n/m2)mlogm)=O((n/m)logm)O((n/m)logm+m). Choosing m=nlogn as before, this gives O(nlogn).

Wonderful solution, thanks, I wasn't really sure if it can be done.
Ambroz Bizjak

And it works! C implementation: ideone.com/opuoMj
Ambroz Bizjak

Meh, I was missing that last bit of code which actually makes it break up the computation, fixed here ideone.com/GRXMAZ .
Ambroz Bizjak

On my machine this algorithm begins to be faster than the simple algorithm at around 17000 weights. For small numbers of weights it is slow. Benchmark: ideone.com/b7erxu
Ambroz Bizjak

Very impressive that you actually implemented this! You probably want to optimize over m. The choice m=nlogn is just a rough guide, and might not be optimal. Did you try running the algorithm with different values of m?
Yuval Filmus
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.