এক বিলিয়ন সংখ্যার মধ্যম গণনা করুন


127

আপনার যদি এক বিলিয়ন নম্বর এবং একশত কম্পিউটার থাকে তবে এই সংখ্যার মাঝারিটি সনাক্ত করার সবচেয়ে ভাল উপায় কী?

আমার একটি সমাধান যা হ'ল:

  • কম্পিউটারের মধ্যে সমানভাবে বিভক্ত করুন।
  • তাদের বাছাই করুন।
  • প্রতিটি সেটের জন্য মিডিয়ানদের সন্ধান করুন।
  • মিডিয়ানদের উপর সেটগুলি বাছাই করুন।
  • এক সাথে সর্বনিম্ন থেকে সর্বোচ্চ মধ্যস্থতে দুটি সেট মার্জ করুন।

যদি আমাদের m1 < m2 < m3 ...প্রথমে মার্জ হয়ে থাকে Set1এবং Set2ফলস্বরূপ সেটে আমরা Set12(সংহত) এর মধ্যকের চেয়ে কম সমস্ত সংখ্যা ফেলে দিতে পারি । সুতরাং যে কোনও সময় আমাদের সমান আকারের সেট থাকে। উপায় দ্বারা এটি সমান্তরাল পদ্ধতিতে করা যায় না। কোন ধারনা?


3
@ জন বোকার: আসলে সমস্যাটি দুটি সাব-প্রবলেম নিয়ে গঠিত: 1) তালিকাটি বাছাই করুন এবং 2) সূচক 5'000'000'000 সহ উপাদান পান। আমি বিশ্বাস করি না যে সংখ্যাগুলি বাছাই করা হয়েছে।
রোমান

3
@ রোমান: সমস্যাটি আপনি বর্ণনা করেছেন এমন দুটি সাব-প্রবলেম, যেমন কুইকসलेक्ट নির্বাচন করে না। তবে কুইক সিলেক্ট সমান্তরাল নয়, কমপক্ষে তুচ্ছ নয়। এবং অবশ্যই আপনি ঠিক বলেছেন যে সংখ্যাগুলি পূর্বে সাজানো থাকলে এটি একটি দুর্দান্ত অর্থহীন প্রশ্ন।
স্টিভ জেসোপ

5
@ এফএমএসএফ: আমি মনে করি না যে কোনও ইংরেজীভাষী দেশ কোনও সরকারী উদ্দেশ্যে ইংরেজিতে দীর্ঘ বিলিয়ন ব্যবহার করে । উদাহরণস্বরূপ এখানে যুক্তরাজ্যে, আমরা এটি 1974 সালে ব্যবহার বন্ধ করে দিয়েছি I আমি ইংরেজী ভাষায় "মিলিয়ন" অর্থ একটি মিলিয়ন মিলিয়ন বোঝার জন্য বিবেচনা করব , একেবারেই "সত্যিকারের বিলিয়ন" নয় per অবশ্যই ফরাসি ভাষায় এটি সম্পূর্ণ আলাদা বিষয় হবে, তবে প্রশ্নটি ফরাসী ভাষায় নয়।
স্টিভ জেসোপ

5
আপনার বাছাই করার দরকার নেই! en.wikipedia.org/wiki/...
glebm

2
1 বিলিয়ন সংখ্যা কেবল কয়েকটি গিগাবাইট ডেটা, আপনার এই টাস্কটি সমাধান করার জন্য একাধিক পিসি বা জটিল অ্যালগরিদমের প্রয়োজন নেই। Overcomplicate করবেন না।
ব্যবহারকারী 626528

উত্তর:


54

আহা, আমার মস্তিষ্ক সবেমাত্র গিয়ারে লাথি মেরেছে, আমার এখন একটি বুদ্ধিমান পরামর্শ রয়েছে। সম্ভবত যদি এটি একটি সাক্ষাত্কার হয়ে থাকে তবে দেরী হবে না:

মেশিন 1 কে "কন্ট্রোল মেশিন" বলা হবে, এবং যুক্তির স্বার্থে এটি সমস্ত ডেটা দিয়ে শুরু হয় এবং এটি অন্য 99 টি মেশিনে সমান পার্সেলে প্রেরণ করে, অন্যথায় ডেটাগুলি মেশিনগুলির মধ্যে সমানভাবে বিতরণ শুরু হয় এবং এটি এর 1/1 ডেটা অন্যের প্রত্যেককে প্রেরণ করে। পার্টিশনগুলি সমান হতে হবে না, কেবল কাছেই।

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

কন্ট্রোল মেশিনটি ডেটা আসার সাথে সাথে একটি 99-ওয়ে মার্জ সম্পাদন করে তবে মার্জ হওয়া ডেটাটি ত্যাগ করে কেবলমাত্র দেখেছে মানগুলির সংখ্যা গণনা করে। এটি মধ্যমকে 1/2 বিলিয়ন এবং 1/2 বিলিয়ন প্লাস অনথের মান হিসাবে গণনা করে।

এটি "পশুর মধ্যে সবচেয়ে ধীর" সমস্যায় ভুগছে। বাছাইয়ের মেশিন দ্বারা মিডিয়ানের চেয়ে কম প্রতিটি মান প্রেরণ না করা পর্যন্ত অ্যালগরিদম সম্পূর্ণ করতে পারে না। এর যুক্তিসঙ্গত সুযোগ আছে যে এর একটির মান এর ডেটা পার্সেলের মধ্যে বেশ বেশি হবে। সুতরাং একবার ডেটাটির প্রাথমিক বিভাজন সম্পূর্ণ হয়ে গেলে, আনুমানিক চলমান সময় হ'ল ডেটা 1/99 তম সাজানোর এবং এটিকে আবার নিয়ন্ত্রণের কম্পিউটারে ফেরত পাঠানোর সময়ের সংমিশ্রণ এবং নিয়ন্ত্রণের জন্য 1/2 ডেটা পড়ার সময় । "সংমিশ্রণ" কোথাও কোথাও সর্বাধিক এবং সেই সময়ের যোগফল, সম্ভবত সর্বোচ্চের কাছাকাছি।

আমার প্রবৃত্তিটি হ'ল নেটওয়ার্কের মাধ্যমে ডেটা প্রেরণের জন্য এটি বাছাই করার চেয়ে দ্রুত হওয়া (কেবলমাত্র মধ্যমা নির্বাচন করা যাক) এটি খুব সুন্দর দ্রুত নেটওয়ার্ক হওয়া দরকার। নেটওয়ার্কটি তাত্ক্ষণিক হিসাবে ধরে নেওয়া যেতে পারে যদি আরও ভাল সম্ভাবনা হতে পারে, উদাহরণস্বরূপ যদি আপনার কাছে 100 কোরের ডেটা সমেত র‍্যামের সমান অ্যাক্সেস থাকে।

যেহেতু নেটওয়ার্ক I / O আবদ্ধ হওয়ার সম্ভাবনা রয়েছে তাই অন্তত নিয়ন্ত্রণ মেশিনে ফিরে আসা ডেটার জন্য আপনি খেলতে পারেন এমন কিছু কৌশল থাকতে পারে। উদাহরণস্বরূপ, "1,2,3, .. 100" প্রেরণের পরিবর্তে, সম্ভবত একটি বাছাই করা মেশিন "101 এর চেয়ে কম 100 মান" অর্থ একটি বার্তা পাঠাতে পারে। কন্ট্রোল মেশিনটি পরিবর্তিত সংযুক্তি সম্পাদন করতে পারে, যার মধ্যে এটি সমস্ত শীর্ষ স্তরের একটি পরিসরের মানগুলির মধ্যে সবচেয়ে কম খুঁজে পায় এবং তারপরে সমস্ত বাছাই করা মেশিনগুলিকে জানিয়ে দেয়, যাতে তারা (ক) নিয়ন্ত্রণ মেশিনকে কীভাবে বলতে পারে "মান" মানের অনেক মান, এবং (খ) সেই বিন্দু থেকে তাদের সাজানো ডেটা প্রেরণ শুরু করে।

আরও সাধারণভাবে, সম্ভবত একটি চতুর চ্যালেঞ্জ-প্রতিক্রিয়া অনুমান করার গেমটি রয়েছে যা নিয়ন্ত্রণ মেশিনটি 99 বাছাই করা মেশিনের সাথে খেলতে পারে।

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

[*] উপলভ্য স্ট্যাক অনুমতি - আপনার কাছে ও (এন) অতিরিক্ত জায়গা না থাকলে প্রথমে কোন অংশটি করবেন তা আপনার পছন্দসই। তবে আপনার যদি অতিরিক্ত অতিরিক্ত জায়গা থাকে তবে আপনি বাছাই করতে পারেন এবং আপনার কাছে পর্যাপ্ত জায়গা না থাকলে কমপক্ষে কিছু কোণ কাটতে হবে যা আপনি প্রথমে কয়েকটি পার্টিশনের জন্য ছোট অংশটি ব্যবহার করে করতে পারেন।


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

4
@ শ্রীরেপাসাদোগোভিয়ানডানকি: পুনরাবৃত্তি পদক্ষেপটি হ'ল সমস্ত 99 প্রার্থীর মধ্যে ক্ষুদ্রতম মান বাতিল করা এবং গণনা বৃদ্ধি করা। এই 99-উপায় সংহত পদক্ষেপটি ব্যতীত সমস্ত আগত মানগুলির গণনা রাখার কোনও লাভ নেই। যদি আপনি সেগুলি আসার সাথে সাথে তাদের তুলনা না করেন, তবে আপনি জানেন না যে আপনি যে মূল্যটি ছাড়ছেন তা মিডিয়ানের নীচে।
স্টিভ জেসোপ

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

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

52
sort -g numbers | head -n 500000001 | tail -n 2 | dc -e "1 k ? ? + 2 / p"

2
হাঃ হাঃ হাঃ. এটি কি সত্যিই কাজ করে বা ওওমের ঘাতক এটি শেষ হওয়ার আগেই তা নাক করে দেবে? (যে কোনও যুক্তিসঙ্গত কম্পিউটারে)
ইসাক সাভো

5
করা উচিত. বাছাই কীভাবে কোনও আউট-অফ-কোর সাজানোর কাজটি করে তা জানে, সুতরাং এটি মেমরির বাইরে চলে না।
ড্রিপিজা

6
@ জাগফাই আমার মনে হয় না এটি খুব বেশি সময় নিবে; বিলিয়ন সংখ্যা 32-বিট ইনট / ফ্লোটের জন্য 4 জিবি, 64-বিট ইনট / ডাবলসের জন্য 8 জিবি। উভয়ই ভীষণভাবে ট্যাক্স লাগছে না।
ড্রিপজ্জা

13
সবেমাত্র একটি ইন্টেল i5-4200M @ 3.1 গিগাহার্টজ (4 কোর) দিয়ে চেষ্টা করেছেন। timeপুরো পাইপলাইনে প্রয়োগ করা কমান্ড অনুসারে , এটি real=36m24s("প্রাচীরের ঘড়ির সময়"), user=113m15s ("সমান্তরাল সময়", সমস্ত কোর যুক্ত করা) নিয়েছিল । অন্যদের থেকে অনেক দীর্ঘতম কমান্ডটি ছিল sort, এটি আমার চারটি কোরকে 100% এ থ্রেড করা হলেও। র‌্যাম খরচ খুব গ্রহণযোগ্য ছিল।
মরগান টোভেরি কুইলিং

11
তারপর, 100 কম্পিউটারে চালানোর তাই আপনি 100 গুণ বেশি নিশ্চিত যে ফলাফলের সঠিক :) হতে পারে
ডস

26

আমি এখানে কনট্রিশিয়ান হতে পছন্দ করি না, তবে আমি বিশ্বাস করি না যে বাছাই করা দরকার, এবং আমি মনে করি যে বিলিয়ন / 100 সংখ্যা বাছাইয়ের সাথে যুক্ত যে কোনও অ্যালগরিদম ধীর হতে চলেছে। আসুন একটি কম্পিউটারে একটি অ্যালগরিদম বিবেচনা করা যাক।

1) বিলিয়ন থেকে এলোমেলোভাবে 1000 মান নির্বাচন করুন, এবং তাদের সংখ্যা, বিশেষত একটি পরিসীমা বিতরণের ধারণা পেতে তাদের ব্যবহার করুন।

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

3) মধ্যম মিথ্যা বালতি কোন বালতি রেঞ্জ। প্রতিটি বালতিতে মোট সংখ্যা পরীক্ষা করে এটি করা যেতে পারে।

৪) সেই বালতিতে মানগুলি পরীক্ষা করে প্রকৃত মধ্যকটি সন্ধান করুন। আপনি চাইলে আপনি এখানে বাছাই করতে পারেন, যেহেতু আপনি কেবল 10,000 নম্বর বাছাই করছেন। যদি সেই বালতিতে মানগুলির সংখ্যা বড় হয় তবে আপনার বাছাই করার জন্য পর্যাপ্ত পরিমাণ না পাওয়া পর্যন্ত আপনি এই অ্যালগরিদমটি আবার ব্যবহার করতে পারবেন।

এই পদ্ধতির কম্পিউটারগুলির মধ্যে মানগুলি ভাগ করে তুচ্ছভাবে সমান্তরাল করে। প্রতিটি কম্পিউটার প্রতিটি বালতিতে মোট পরিমাণকে একটি 'নিয়ন্ত্রণ' কম্পিউটারে প্রতিবেদন করে যা পদক্ষেপ 3 রয়েছে step ধাপ 4 এর জন্য প্রতিটি কম্পিউটার প্রাসঙ্গিক বালতিতে (সাজানো) মানগুলি কম্পিউটারে প্রেরণ করে (আপনি সেই দুটি অ্যালগোরিদমকে সমান্তরালেও করতে পারেন, তবে এটি সম্ভবত মূল্যবান নয়)।

মোট প্রক্রিয়াটি হ'ল (এন), যেহেতু 3 এবং 4 উভয় পদক্ষেপই তুচ্ছ, বকেটের সংখ্যা যথেষ্ট পরিমাণে সরবরাহ করা।


1
আমার মনে হয় এটি মিডিয়ানদের মিডিয়ান এবং কুইক সিলেক্ট অ্যালগরিদমের মধ্যকার কিছু। en.wikipedia.org/wiki/Selection_algorithm
Dimath

চতুর্থ ধাপে, বালতিগুলিতে কেবল 10,000 থাকতে পারে না। এটি এমন ক্ষেত্রে হতে পারে যে বিতরণটি মাঝের দিকে ঝুঁকছে, যেখানে এটিতে বলা যেতে পারে, ৮০% ডেটা, যা এখনও বিশাল।
justhalf

যে অ্যাকাউন্ট নিতে সম্পাদিত।
ডিজেক্লেওয়ার্থ

আমি এই পদ্ধতির পছন্দ।
আল কেপ

4
এই অ্যালগরিদমে পারফরম্যান্স ও (এন) নয়: আপনার বেশিরভাগ সংখ্যা "মিডিয়ান" বালতিতে পড়তে পারে এবং এটি সবকিছুকে বাছাই করার মতো খারাপভাবে পারফর্ম করতে পারে।
Sklivvz

12

এক বিলিয়ন আসলে একটি আধুনিক কম্পিউটারের জন্য বেশ বিরক্তিকর কাজ। আমরা এখানে 4 বাইট সংখ্যার 4 গিগাবাইটের কথা বলছি ... 4 জিবি ... এটি কিছু স্মার্টফোনের র‌্যাম।

public class Median {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        int[] numbers = new int[1_000_000_000];

        System.out.println("created array after " +  (System.currentTimeMillis() - start) + " ms");

        Random rand = new Random();
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = rand.nextInt();
        }

        System.out.println("initialized array after " + (System.currentTimeMillis() - start) + " ms");

        Arrays.sort(numbers);

        System.out.println("sorted array after " + (System.currentTimeMillis() - start) + " ms");

        if (numbers.length % 2 == 1) {
            System.out.println("median = " + numbers[numbers.length / 2 - 1]);
        } else {
            int m1 = numbers[numbers.length / 2 - 1];
            int m2 = numbers[numbers.length / 2];
            double m = ((long) m1 + m2) / 2.0;
            System.out.println("median = " + new DecimalFormat("#.#").format(m));
        }
}

আমার মেশিনে আউটপুট:

created array after 518 ms
initialized array after 10177 ms
sorted array after 102936 ms
median = 19196

সুতরাং এটি আমার মেশিনে একটি একক কোর ব্যবহার করে কম দুই মিনিটেরও কম সময়ের মধ্যে (1:43 যার মধ্যে 0:10 এলোমেলো সংখ্যা তৈরি করতে হবে) এবং এটি একটি সম্পূর্ণ বাছাইও করছে। আসলেই অভিনব কিছু নয়।

এটি অবশ্যই সংখ্যার বৃহত্তর সেটগুলির জন্য একটি আকর্ষণীয় কাজ। আমি এখানে একটি বিষয় বলতে চাই: এক বিলিয়ন হল চিনাবাদাম। তাই আপনি আশ্চর্যজনকভাবে সহজ কাজগুলিতে জটিল সমাধান নিক্ষেপ করার আগে দু'বার ভাবেন;)


এই কি আমি আমার উত্তর এখানে :-) বলা হয় stackoverflow.com/a/31819222/363437
vidstige

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

যদিও এটি মিডিয়ান নয়, মিডিয়ানটি (numbers[numbers.length / 2]+numbers[numbers.length / 2+1])/2যদি numbers.lengthহয় এমনকি numbers[numbers.length / 2]যদি numbers.lengthবিজোড় হয় তবে।
Sklivvz

@ স্ক্লিভিভজ সঠিক, তবে মিডিয়ানের গণনা করতে যে সময় লাগে তা এটি লক্ষণীয় নয়।
অদ্ভুত

1
@ Sklivvz আপনি অবশ্যই ঠিক আছেন। আমি সবেমাত্র মধ্যম হিসাব আপডেট করেছি। যদিও এটি বাকি উত্তর পরিবর্তন করে না।
sfussnegger

10

প্রাক্কলন মধ্যমা এবং 99th শতকরা মত অর্ডার পরিসংখ্যান দক্ষতার মত আলগোরিদিম সঙ্গে বিতরণ করা যেতে পারে টি-হজম বা কিউ-হজম

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

এই পদ্ধতির দ্বারা ব্যবহার করা হয় elasticsearch এবং, সম্ভবতঃ, BigQuery- তে (QUANTILES ফাংশনের বর্ণনা দ্বারা যাচ্ছে)।


5

সংখ্যার এই সেটটির জন্য মিডিয়ান

2, 3, 5, 7, 11, 13, 67, 71, 73, 79, 83, 89, 97

67 হয়।

সংখ্যার এই সেটটির জন্য মিডিয়ান

2, 3, 5, 7, 11, 13, 67, 71, 73, 79, 83, 89

40 হয়।

ধরে নেওয়া প্রশ্নটি প্রায় 1,000,000,000 পূর্ণসংখ্যা (x) যেখানে 0> = x <= 2,147,483,647 এবং ওপি (উপাদান (499,999,999) + উপাদান (500,000,000)) / 2 (সংখ্যাগুলি বাছাই করা থাকলে) খুঁজছিল। ধরে নেওয়াও যে সমস্ত 100 কম্পিউটার সমস্ত সমান ছিল।

আমার ল্যাপটপ এবং গিগ ব্যবহার করছি ...

আমি যা পেয়েছি তা হ'ল আমার ল্যাপটপটি 1.3 সেকেন্ডের মধ্যে 10,000,000 ইন্ট 32 এর বাছাই করতে পারে। সুতরাং মোটামুটি অনুমান হবে যে বিলিয়ন সংখ্যার সাজানোর ক্ষেত্রে 100 x 1.3 সেকেন্ড (2 মিনিট 10 সেকেন্ড) লাগবে;)।

গিগাবিট ইথারনেটে 40 এমবি ফাইলের একমুখী ফাইল স্থানান্তরের একটি অনুমান .32 সেকেন্ড। এর অর্থ হ'ল সমস্ত কম্পিউটার থেকে সাজানো ফলাফলগুলি প্রায় 32 সেকেন্ডে ফিরে আসবে (কম্পিউটার 99 শুরু হওয়ার 30 সেকেন্ড পর্যন্ত তার ফাইল পেল না)। সেখান থেকে সর্বনিম্ন 499,999,998 সংখ্যাটি বাতিল করতে, পরবর্তী 2 যোগ করুন এবং 2 দিয়ে ভাগ করতে বেশি সময় নেওয়া উচিত নয়।


3
ভোটারদের মন্তব্য কম? এটি আমাকে কীভাবে আরও ভাল করতে পারি তা বুঝতে সহায়তা করবে।
dbasnett

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

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

ধরে নিলাম তাদের একই ফ্যাক্টর রয়েছে (যা তারা সম্ভবত মেমরি সমস্যার কারণে হয় না) তবে a*(1e7)log(1e7) = 1.3sec=> a = 1.6e-9sec => a*(1e9)log(1e9) ~ 167sec, তাই আপনার অনুমানটি বন্ধ ছিল না।
bcorso

আপনার অনুমানগুলি বেশ রুক্ষ। প্রথমত, কিছু বাছাই করা অ্যালগরিদমগুলি সবচেয়ে খারাপ অবস্থার (যেমন সাধারণভাবে ব্যবহৃত উইকসোর্টের ক্ষেত্রে) ও (এন ^ 2) হিসাবে যায়। দ্বিতীয়ত, আপনি একটি পরীক্ষা ডেটাसेट বেছে নিয়েছেন যা আপনার এল 2 ক্যাশের আকার সম্পর্কে। এটি ফলাফলকে স্কিউ করে তোলে। তৃতীয়ত আপনি (অন্যান্য অনেক উত্তরদাতারা) "সংখ্যা" অর্থ "পূর্ণসংখ্যা" ধরে নিয়েছেন। এর অর্থ ভাসা, ডাবল বা দশমিক, যার পারফরম্যান্সের বৈশিষ্ট্যগুলি খুব আলাদা।
Sklivvz

5

এটি মানুষকে অবাক করে দিতে পারে, তবে সংখ্যাগুলি যদি 32-বিটের (বা আরও ছোট) অভ্যন্তরে ফিট করার জন্য যথেষ্ট পরিমাণ পূর্ণসংখ্যার হয় - তবে কেবল একটি বালতি সাজান! যে কোনও সংখ্যক 32-বিট ইনট এবং ও (এন) এ চালিত হয় তার জন্য কেবল 16 গিগাবাইট র‌্যামের প্রয়োজন, যা যুক্তিযুক্ত এন, যেমন একটি বিলিয়ন এর জন্য কোনও বিতরণ সিস্টেমকে ছাড়িয়ে যায়।

একবার আপনার বাছাই করা তালিকা হয়ে গেলে, মিডিয়ান বাছাই করা তুচ্ছ। আসলে, আপনার বাছাই করা তালিকাটি তৈরি করার দরকার নেই, তবে কেবল বালতিগুলির দিকে তাকিয়ে এটি করা উচিত।

একটি সাধারণ বাস্তবায়ন নীচে দেখানো হয়েছে। কেবল 16-বিট পূর্ণসংখ্যার জন্য কাজ করে তবে 32-বিট পর্যন্ত প্রসারিত করা সহজ হওয়া উচিত।

#include <stdio.h>
#include <string.h>

int main()
{
    unsigned short buckets[65536];
    int input, n=0, count=0, i;

    // calculate buckets
    memset(buckets, 0, sizeof(buckets));
    while (scanf("%d", &input) != EOF)
    {
        buckets[input & 0xffff]++;
        n++;
    }

    // find median 
    while (count <= n/2)
    {
        count += buckets[i++];
    }

    printf("median: %d\n", i-1);

    return 0;
}

এক বিলিয়ন (10 9 ) সংখ্যা সহ একটি পাঠ্য ফাইল ব্যবহার করা এবং এর timeমতো চলমান

time ./median < billion

আমার মেশিনে 1 মি 49.293 এস চলমান সময় দেয়। চলমান বেশিরভাগ সময় সম্ভবত ডিস্ক আইও পাশাপাশি থাকে।


এটি সত্যই প্রশ্নের উত্তর দেয় না এবং এটি অনুমানের উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি এমনকি জানেন না যে তারা পূর্ণসংখ্যা হয়।
Sklivvz

কীভাবে এটি প্রশ্নের উত্তর দেয় না? এবং হ্যাঁ, আমার উত্তরটি সংখ্যাটি পূর্ণসংখ্যা বলে ধরে নিয়েছে। আমি আমার অনুমানগুলি স্পষ্ট করে বলার চেষ্টা করেছি।

আপনি এটি বলে মনে করছেন না যে পূর্ণসংখ্যা থাকা একটি অনুমিতি, না আপনি ওপি যে 100 টি কম্পিউটার সম্পর্কে জিজ্ঞাসা করবেন সেগুলি কীভাবে ব্যবহার করবেন তা আপনি সম্বোধন করেন। আপনি একটি নোডে মিডিয়ান গণনা করতে পারেন তবে এটি কেন "না" প্রদর্শিত হয় তা না হলে এটি "সেরা" সমাধান নয়। এছাড়াও, র্যাডিক্স সাজানোর ণ (ঢ) না হলে অঙ্ক সংখ্যা পরিবর্তিত হয়, যা এই ক্ষেত্রে অবশ্যই না, অনুযায়ী en.wikipedia.org/wiki/Radix_sort#Efficiency , এটা O (n log n)
Sklivvz

আমি বলছে "যদি পূর্ণসংখ্যার ছোট যথেষ্ট একটি 32 বিট ভিতরে মাপসই দ্বারা শুরু পূর্ণসংখ্যা " ... Radix সাজানোর একটি ধ্রুবক শব্দ আকার জন্য হে (ঢ) হয় W আপনি যে লিংক পোস্ট করা বড় স্বচ্ছতা বর্ণনা অনুযায়ী। এখানে আমি 32 একটি ধ্রুবক শব্দ আকার অনুমান
vidstige

1
অন্যান্য 99 টি কম্পিউটারের সাথে আপনি যা করেন তা এই উত্তরের সাথে প্রাসঙ্গিক নয়। আপনি তাদের পিরামিড তৈরি করতে বা পোড়াতে একে অপরের উপরে স্তুপ করতে পারেন। বা কেবল তাদের উপেক্ষা করুন।
ভিজিট করুন

3

অদ্ভুতভাবে যথেষ্ট, আমি মনে করি আপনার কাছে পর্যাপ্ত কম্পিউটার থাকলে আপনি O(n)মিডিয়ান ফাইন্ডিং অ্যালগরিদম ব্যবহার করার চেয়ে বাছাই করা ভাল । (যদি আপনার কোরগুলি খুব, খুব ধীর না হয় তবে আমি কেবল একটি ব্যবহার করতাম এবং O(n)কেবল 1e9 সংখ্যার জন্য একটি মিডিয়ান সন্ধানকারী অ্যালগরিদম ব্যবহার করতাম; যদি আপনার 1e12 থাকে, তবে এটি সম্ভবত ব্যবহারিক হতে পারে না।)

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

একটি থ্রেড তালিকাটিকে অন্ধভাবে সমান আকারের টুকরো টুকরো টুকরো করে এবং অন্য এম থ্রেডগুলিকে বাছাই করতে বলে। এই থ্রেডগুলি (n/M) log (n/M)সময় মতো অধ্যবসায় করে । তারপরে তারা কেবল তাদের মিডিয়ানদেরই প্রত্যাবর্তন করবে না, তবে বলুন, তাদের 25 তম এবং 75 তম পার্সেন্টাইল পাশাপাশি (আপনি কিছুটা আলাদা সংখ্যা বেছে নিলে বিকৃততম খারাপ পরিস্থিতি আরও ভাল)। এখন আপনার কাছে 4M রেঞ্জের ডেটা রয়েছে। তারপরে আপনি এই রেঞ্জগুলি সাজান এবং তালিকার মাধ্যমে উপরের দিকে কাজ করুন যতক্ষণ না আপনি এমন কোনও সন্ধান পান, যদি আপনি সংখ্যার চেয়ে ছোট বা সংখ্যার প্রত্যেকটি সীমা ফেলে দেন তবে আপনি আপনার অর্ধেক তথ্য ফেলে দেবেন। এটি মধ্যমা জন্য আপনার নিম্ন সীমাবদ্ধ। উপরের বাউন্ডের জন্য একই করুন। এটি M log Mসময়ের মতো কিছু লাগে , এবং সমস্ত কোরকে এটির জন্য অপেক্ষা করতে হবে, সুতরাং এটি সত্যই অপচয় করছেM^2 log Mসম্ভাব্য সময় এখন আপনার একক থ্রেড অন্যকে বলার জন্য রেঞ্জের বাইরে থাকা সমস্ত ডেটা টস করতে বলেছেন (প্রতিটি পাসে আপনার প্রায় অর্ধেক নিক্ষেপ করা উচিত) এবং পুনরাবৃত্তি করুন - এটি ইতিমধ্যে তুচ্ছভাবে দ্রুত অপারেশন হিসাবে ডেটা ইতিমধ্যে সাজানো হয়েছে। log(n/M)কেবলমাত্র বাকী ডেটা ধরতে এবং O(n)এটিতে একটি স্ট্যান্ডার্ড মিডিয়ান সন্ধানকারী ব্যবহার করা দ্রুত হওয়ার আগে আপনাকে বারবার এর বেশি পুনরাবৃত্তি করা উচিত নয় ।

সুতরাং, মোট জটিলতা কিছু এক O((n/M) log (n/M) + M^2 log M log (n/M))। সুতরাং, এটি একটি কোরকে O(n)মাঝারি সাজানোর চেয়ে দ্রুত M >> log(n/M)এবং যদি M^3 log M < n, আপনি বর্ণিত দৃশ্যের জন্য এটি সত্য।

আমি মনে করি এটি সত্যিই খারাপ ধারণা যা দেওয়া হয় এটি কতটা অকার্যকর তবে এটি আরও দ্রুত।


ও (এন / এম লগ (এন / এম)) হ'ল আক্ষরিক অর্থে ও (এন লগ এন), কারণ ও (এন / এম লগ (এন / এম)) = 1 / এম ও (এন (লগ এন - লগ এম)) ) = ও (এন লগ এন) আপনি ও (এন) এর সাথে সত্যিকারের সাথে এটি তুলনা করতে পারবেন না, কারণ "ও" মূলত "কিছুটা অনির্দিষ্ট ধ্রুবক সহ বৃহত্তর জন্য আনুপাতিক" means আপনি যদি এই ধ্রুবকগুলি না জানেন তবে আপনি তুলনা করতে পারবেন না, তবে যথেষ্ট পরিমাণ এন এর জন্য ধ্রুবকরা প্রভাবশালী নয়। কম সংখ্যার জন্য সমস্ত বেট বন্ধ রয়েছে, ও (1) সহজেই ও (এন!) এর চেয়ে ধীর হতে পারে।
Sklivvz

@ স্ক্লিভিভিজ - nএবং Mএমন ভেরিয়েবলগুলি যা নির্বিচারে স্কেল করতে পারে তাই একটিতে উভয়ই অন্তর্ভুক্ত। বিশেষ করে, আমি যে postulated M> log n, যার অর্থ যদি আপনি যত্ন এটি যে n log nশুধু পরিবর্তে n, আপনি যত্নশীল আছে Mএছাড়াও।
রেক্স কের

3

এটি অ্যালগরিদম ভোট দেওয়ার চেয়ে দ্রুত করা যায় (এন লগ এন)

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

আরও বিশদ এবং বাস্তবায়নের জন্য দেখুন:
http://www.fusu.us/2013/07/median-in-large-set-across-1000-servers.html


2

সমস্যা সমাধানের জন্য একটি কম্পিউটারই যথেষ্ট বেশি।

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

তারপরে সাজানো তালিকার মাঝামাঝি থেকে সংখ্যাটি আনুন (অর্থাত্ সূচী 5 000 000 000 সহ)


3
যাইহোক এখন আমার প্রতিনিধি বেশ গোলাকার :)
রোমান

সংশ্লেষ সর্বোত্তম O (n), এবং আপনি ও (এন) এর একটি একক কোরতে মধ্যস্থতাটি খুঁজে পেতে পারেন, সুতরাং এটি কোনও লাভের জন্য অনেক অতিরিক্ত কাজ তৈরি করে বলে মনে হয়।
রেক্স কের

2

এটি আপনার ডেটা উপর নির্ভর করে। সবচেয়ে খারাপ পরিস্থিতিটি হ'ল এটি একইরূপে বিতরণ করা হয়।

এক্ষেত্রে আপনি ও (এন) সময়ের মতো মধ্যবর্তীটি খুঁজে পেতে পারেন:

ধরুন আপনার সংখ্যাগুলি 2,7,5,10,1,6,4,4,6,10,4,7,1,8,4,9,9,3,4,3 (পরিসীমা 1-10) ।

আমরা 3 বালতি তৈরি করি: 1-3, 4-7, 8-10। নোট করুন যে শীর্ষ এবং নীচে সমান আকার রয়েছে।

আমরা বালতিগুলি সংখ্যার সাথে পূরণ করি, প্রতিটি এবং সর্বোচ্চ এবং সর্বনিম্ন কতটি পড়ে যায় তা গণনা করি

  • নিম্ন (5): 2,1,1,3,3, মিনিট 1, সর্বোচ্চ 3
  • মাঝারি (10): 7,5,6,4,4,6,4,7,4,4, ন্যূনতম 4, সর্বোচ্চ 7
  • উচ্চ (5): 10, 10, 8, 9, 9, মিনিট 8, সর্বোচ্চ 10 max

গড়টি মাঝের বালতিতে পড়ে, আমরা বাকিগুলিকে উপেক্ষা করি

আমরা 3 বালতি তৈরি করি: 4, 5-6, 7. লো 5 টি গণনা এবং সর্বোচ্চ 3 এবং উচ্চতর একটি নূন্যতম 8 এবং 5 এর গণনা দিয়ে শুরু হবে।

প্রতিটি সংখ্যার জন্য আমরা গণনা করি কতগুলি নিম্ন এবং উচ্চ বালতি, সর্বাধিক এবং মিনিটে পড়ে এবং মাঝের বালতিটি রাখে।

  • পুরাতন নিম্ন (5)
  • নিম্ন (5): 4, 4, 4, 4, 4, সর্বোচ্চ 4
  • মাঝারি (3): 5,6,6
  • উচ্চ (2): 7, 7, মিনিট 7
  • পুরাতন উচ্চ (5)

এখন আমরা সরাসরি মিডিয়ান গণনা করতে পারি: আমাদের মতো পরিস্থিতি রয়েছে

old low    low          middle  high  old high
x x x x x  4 4 4 4 4 4   5 6 6  7 7   x x x x x

সুতরাং মিডিয়ান 4.5 হয়।

ধরে নিচ্ছি যে আপনি বিতরণ সম্পর্কে কিছুটা জানেন, আপনি গতি অনুকূলকরণের জন্য ব্যাপ্তিগুলি কীভাবে সংজ্ঞায়িত করতে পারেন তার সুর করতে পারেন। যে কোনও ক্ষেত্রে, পারফরম্যান্সটি ও (এন) এর সাথে হওয়া উচিত, কারণ 1 + 1/3 + 1/9 ... = 1.5

প্রান্তের মামলার কারণে আপনার ন্যূনতম এবং সর্বাধিক প্রয়োজন (উদাহরণস্বরূপ, যদি মাঝারিটি পুরানো নিম্নের সর্বাধিক এবং পরবর্তী উপাদানগুলির মধ্যে গড় হয়)।

এই সমস্ত অপারেশনকে সমান্তরাল করে তোলা যেতে পারে, আপনি প্রতিটি কম্পিউটারে 1/100 ডেটা দিতে পারেন এবং প্রতিটি নোডের 3 টি বালতি গণনা করতে পারেন, তারপরে আপনার রাখা বালতিটি বিতরণ করুন। এটি আবার আপনাকে দক্ষতার সাথে নেটওয়ার্ক ব্যবহার করতে বাধ্য করে কারণ প্রতিটি সংখ্যা গড়ে 1.5 বার পাস (তাই ও (এন))। এমনকি আপনি এটিও হারাতে পারেন যে আপনি যদি নোডগুলির মধ্যে কেবলমাত্র ন্যূনতম সংখ্যাগুলি পাস করেন (যেমন নোড 1 এর 100 টি সংখ্যা এবং নোড 2 এর 150 টি সংখ্যা থাকে তবে নোড 2 25 নোডকে 25 নম্বর দিতে পারে)।

বিতরণ সম্পর্কে আপনি যদি না জানেন তবে আমি সন্দেহ করি আপনি এখানে ও (এন) এর চেয়ে আরও ভাল করতে পারবেন, কারণ আপনাকে আসলে উপাদানগুলি অন্তত একবার গণনা করতে হবে।


1
সমস্ত সংখ্যা সমান হলে প্রকৃত নিকৃষ্ট ঘটনাটি (আপনার অ্যালগোরিদমের জন্য নয়)? আমি যদি সঠিক হয়ে থাকি তবে আপনার বালতিগুলির কোনও একটিই সমস্ত উপাদানগুলির সাথে মাঝেরটি থেকে আলাদা হয়ে যাবে। সুতরাং, আপনাকে প্রতিবার সমস্ত উপাদান অতিক্রম করতে হবে, বিরতিতে মাঝের দিকে দ্রুত গতিতে অগ্রসর হতে হবে। আমি বিশ্বাস করি এটি একটি হবে O(n log n)যে ক্ষেত্রে। এটা বোঝা যায় না? যাইহোক আমি আপনার ধারণাটি পছন্দ করি
Dici

1
@ ডিকি সত্যই নয়: প্রথমত আপনি খুব সহজেই "সমস্ত একই" দৃশ্যের শর্টকাট করতে পারেন কারণ আপনি ন্যূনতম এবং সর্বাধিক জানেন। আমি উত্তরে যেমন বলেছি, বিতরণটি জেনে রাখা আপনার বুকিংয়ের পছন্দগুলি চালিত করতে পারে; দ্বিতীয়ত, এটি এখনও গ্রহণ করবে o(n)+o(n/3)+o(n/9)+...যা এখনও আছে o(n)এবং নেই o(n log n)
Sklivvz

অন্যদিকে, সম্ভবত অন্যরকম খারাপ পরিস্থিতি রয়েছে, একটি ইউ আকারের বিতরণ। আমার এ সম্পর্কে কিছুটা চিন্তা করা দরকার, সবচেয়ে খারাপ ক্ষেত্রে আনুষ্ঠানিকতা আনতে হবে, তবে এটি সম্ভবত o(n)নিষ্পাপ বিভাজনের সাথে এর চেয়ে খারাপ হতে পারে ।
Sklivvz

Mmm হাঁ, সর্বনিম্ন ও সর্বোচ্চ চমত্কার সহজে "সব একই" ক্ষেত্রে পরিচালনা করতে সাহায্য করবে
Dici

2

একটি সহজ পদ্ধতি হ'ল সংখ্যাযুক্ত হওয়া।

  • বড় সেট কম্পিউটারের মধ্যে বিভক্ত করুন
  • প্রতিটি সেট বাছাই করুন
  • ছোট-সেটটি দিয়ে পুনরাবৃত্তি করুন এবং পুনরাবৃত্ত উপাদানগুলির ওজন গণনা করুন
  • প্রতিটি 2 সেট 1 তে মার্জ করুন (প্রতিটি ইতিমধ্যে সাজানো হয়েছে) ওজন আপডেট করে upd
  • আপনি কেবল একটি সেট না পাওয়া পর্যন্ত সেটগুলি মার্জ করে রাখুন
  • আপনি ওয়ানবিলিয়ন / 2 এ না পৌঁছানো পর্যন্ত এই সেটটি জমে ওজনের মাধ্যমে পুনরাবৃত্তি করুন

1

প্রতিটি কম্পিউটারে 10, 9 নম্বর, 10 ^ 7 বিভক্ত করুন ~ 80 এমবি প্রতিটি on প্রতিটি কম্পিউটার তার নম্বরগুলি বাছাই করে। তারপরে কম্পিউটার 1 কম্পিউটার 2, কম্পিউটার 3 এবং 4 ইত্যাদির সাথে নিজস্ব নম্বরগুলি সাজায় ... তারপরে কম্পিউটার 1 অর্ধেক নম্বর 2, 3 থেকে 4 ইত্যাদিতে লিখবে, তারপর 1 সংযোজন কম্পিউটার থেকে সংখ্যাগুলি সাজায় 1,2,3,4, তাদের আবার লিখুন। ইত্যাদি। কম্পিউটারে র‌্যামের আকারের উপর নির্ভর করে প্রতিটি পদক্ষেপে পৃথক কম্পিউটারগুলিতে সমস্ত নম্বর না লিখে আপনি পালিয়ে যেতে পারেন, আপনি বিভিন্ন পদক্ষেপের জন্য কম্পিউটার 1 এ সংখ্যাগুলি সংগ্রহ করতে সক্ষম হতে পারেন, তবে আপনি গণিতগুলি করেন।

ওহ, অবশেষে 500000000 তম এবং 500000001 সেকেন্ডের মানটি পান (তবে সেখানে যথেষ্ট 00 টি রয়েছে তা পরীক্ষা করে দেখুন, আমার নেই)।

সম্পাদনা: @ রোমান - ভাল আপনি যদি এটি বিশ্বাস নাও করতে পারেন তবে এটি সত্য, তবে আমার প্রস্তাবটির সত্যতা বা মিথ্যা প্রকাশ করার কোনও মানে নেই। আমি যেটা বোঝাতে চাইছিলাম তা হ'ল বর্বর বাহিনী মাঝে মাঝে একটি দৌড়ে স্মার্টকে মারধর করে। এটি একটি অ্যালগরিদম তৈরি করতে আমার প্রায় 15 সেকেন্ড সময় নিয়েছিল যা আমি নিশ্চিত যে আমি বাস্তবায়ন করতে পারি, যা কাজ করবে এবং যা বিভিন্ন আকারের ইনপুট এবং সংখ্যক কম্পিউটারের সাথে খাপ খাইয়ে নেবে এবং কম্পিউটারের বৈশিষ্ট্যগুলির সাথে সুসংগত এবং নেটওয়ার্কিংয়ের ব্যবস্থা যদি এটি আপনাকে বা অন্য কারও কাছে লাগে তবে আরও পরিশীলিত অ্যালগরিদম তৈরি করতে 15 মিনিট বলুন আমার সমাধানটি কোড আপ করার জন্য এবং এটি চালানো শুরু করার জন্য আমার 14m45s সুবিধা রয়েছে।

তবে আমি নির্দ্বিধায় স্বীকার করি এটি সমস্ত দাবি, আমি কিছু পরিমাপ করি নি।


এখানে আমরা কেবল সমস্ত সংখ্যার একত্রীকরণ করছি। আমরা কি এটি ব্যবহার করে আরও ভাল উপায়ে করতে পারি: - "আমরা লগইন সময়ে দুটি বাছাই করা তালিকার মধ্যস্থতা খুঁজে পাই n n প্রতিটি তালিকার দৈর্ঘ্য" "
অ্যানি

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

আপনি কি 7 মিনিটের মধ্যে সত্যিই এটি করেছেন ? এটি সত্য হলেও আমি বিশ্বাস করতে পারি না। আমি অনুরূপ কাজটি করেছি (এটি একটি বিশ্ববিদ্যালয় অ্যাসাইনমেন্ট ছিল) এবং সমস্ত রিমোটিং স্টাফ প্রয়োগ করতে এবং পরীক্ষা করতে প্রায় 2 ঘন্টা সময় লেগেছিল (আমি জাভা আরএমআই ব্যবহার করেছি)।
রোমান

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

'অস্পষ্টভাবে প্রশংসনীয়' - এটি আমার পক্ষে যথেষ্ট! স্টিভ! বিশেষত একটি অস্পষ্টভাবে অবর্ণনীয় প্রশ্নের জবাবে।
উচ্চ পারফরম্যান্স

1

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

এখানে 1 টি প্যারেন্ট নোড এবং 99 টি শিশু নোড রয়েছে। শিশু নোডের দুটি এপিআই কল রয়েছে:

  • পরিসংখ্যান (): সর্বনিম্ন, সর্বোচ্চ এবং গণনা প্রদান করে
  • তুলনা করুন (মিডিয়ান_গুয়েস): মিলের মান গণনা করে, মানের চেয়ে কম গণনা করে এবং মানটির চেয়ে বড় গণনা করে

সমস্ত নোডের ন্যূনতম এবং সর্বাধিক লক্ষ করে প্যারেন্ট নোড সমস্ত শিশু নোডে স্ট্যাটাস () কল করে।

একটি বাইনারি অনুসন্ধান এখন নিম্নলিখিত উপায়ে পরিচালিত হতে পারে:

  1. সর্বনিম্ন এবং সর্বাধিক বৃত্তাকার ডাউন বিস্কুট - এটি মধ্যম 'অনুমান'
  2. গণনার চেয়ে বড় যদি গণনার চেয়ে কম হয় তবে অনুমানের জন্য ন্যূনতম নির্ধারণ করুন
  3. গণনার চেয়ে বড় যদি গণনার চেয়ে কম হয় তবে অনুমানের ক্ষেত্রে সর্বাধিক সেট করুন
  4. যদি গণনা বিজোড় সমাপ্ত হয় যখন সর্বনিম্ন এবং সর্বোচ্চ সমান হয়
  5. যদি সর্বাধিক <= সর্বনিম্ন + অনুমান.ম্যাচ_কাউন্টটি গণনাটি সমাপ্ত হয় তবে নিম্নলিখিত পদ্ধতিতে অরসোর্টড ডেটা (লগ ফাইলগুলি থেকে বলুন) ব্যবহার করে নোডগুলিতে এটি করা যেতে পারে।

এখানে 1 টি প্যারেন্ট নোড এবং 99 টি শিশু নোড রয়েছে। শিশু নোডের দুটি এপিআই কল রয়েছে:

  • পরিসংখ্যান (): সর্বনিম্ন, সর্বোচ্চ এবং গণনা প্রদান করে
  • তুলনা করুন (মিডিয়ান_গুয়েস): মিলের মান গণনা করে, মানের চেয়ে কম গণনা করে এবং মানটির চেয়ে বড় গণনা করে

সমস্ত নোডের ন্যূনতম এবং সর্বাধিক লক্ষ করে প্যারেন্ট নোড সমস্ত শিশু নোডে স্ট্যাটাস () কল করে।

একটি বাইনারি অনুসন্ধান এখন নিম্নলিখিত উপায়ে পরিচালিত হতে পারে:

  1. সর্বনিম্ন এবং সর্বাধিক বৃত্তাকার ডাউন বিস্কুট - এটি মধ্যম 'অনুমান'
  2. গণনার চেয়ে বড় যদি গণনার চেয়ে কম হয় তবে অনুমানের জন্য ন্যূনতম নির্ধারণ করুন
  3. গণনার চেয়ে বড় যদি গণনার চেয়ে কম হয় তবে অনুমানের ক্ষেত্রে সর্বাধিক সেট করুন
  4. যদি গণনা বিজোড় সমাপ্ত হয় যখন সর্বনিম্ন এবং সর্বোচ্চ সমান হয়
  5. সর্বাধিক <= সর্বনিম্ন + অনুমান.ম্যাচ_কাউন্ট যখন গণনাটি সমাপ্ত হয়

যদি পরিসংখ্যানগুলি () এবং তুলনা () একটি ও (এন / ম্লগন / এম) বাছাই করে প্রাক-গণনা করা যায়, তবে প্রাক-এর জন্য ও (এন) এর মেমরির জটিলতার সাথে একটি হে (এন / এম) প্রাক-গণনা হিসাব। তারপরে আপনি স্থির সময়ে () তুলনা করতে পারতেন, সুতরাং পুরো জিনিসটি (প্রাক-গণনা সহ) O (N / MlogN / M) + O (লগএন) এ চলত

আমার যদি ভুল হয়ে থাকে তবে আমাকে জানাবেন!


হ্যাঁ আমি কেবল বাইনারি অনুসন্ধান করব। নেটওয়ার্ক ব্যান্ডউইথটি কেবলমাত্র প্রতিটি কম্পিউটারকে কয়েকবার কল করে সেভ করবে। এছাড়াও প্রতিটি মেশিনের একটি "পাইভট" থাকতে পারে যেখানে এটি সময় সাশ্রয়ের জন্য পিভটের দুপাশে সংখ্যার অদলবদল করে। (পিভটটি মাঝারিটির পূর্ববর্তী অনুমান হবে, সুতরাং পরবর্তী সময় কেবলমাত্র পিভটের একপাশে সমস্ত সংখ্যার মধ্য দিয়ে যেতে হবে)
রবার্ট কিং

0

এটি সম্পর্কে কীভাবে: - প্রতিটি নোডে 1 বিলিয়ন / 100 নম্বর নিতে পারে। প্রতিটি নোডে উপাদানগুলি বাছাই করা যায় এবং মাঝারি সন্ধান করা যেতে পারে। মিডিয়ানদের মাঝারি সন্ধান করুন। আমরা, সমস্ত নোডের মিডিয়ান-অফ-মিডিয়ানগুলির চেয়ে কম সংখ্যার সংখ্যাকে একত্রিত করে x%: y% বিভক্ত করতে পারি যা মিডিয়ান-অফ-মিডিয়ানরা তৈরি করে। এখন সমস্ত নোডকে মিডিয়ানদের মধ্যকের চেয়ে কম উপাদানগুলি মুছতে বলুন (30%: 70% বিভক্তির উদাহরণ গ্রহণ করে) .30% সংখ্যা মুছে ফেলা হয়েছে। 1 বিলিয়ন এর 70% হ'ল 700 মিলিয়ন। এখন 3 মিলিয়ন এরও কম নোড মুছে ফেলা সমস্ত নোডগুলি সেই অতিরিক্ত নোডগুলি একটি মূল কম্পিউটারে ফেরত পাঠাতে পারে। প্রধান কম্পিউটারটি এমনভাবে পুনরায় বিতরণ করে যে এখন সমস্ত নোডের প্রায় সমান সংখ্যক নোড (7 মিলিয়ন) থাকবে। এখন যে সমস্যাটি 700 মিলিয়ন সংখ্যায় কমে গেছে .... যতক্ষণ না আমাদের একটি ছোট সেট থাকে যা একটি কমপ্লেক্সে গণনা করা যায়।


সংক্ষেপে আমরা সর্বদা কমপক্ষে 30% দ্বারা সেট করা সমস্যাটি হ্রাস করছি এবং আমরা এর মাধ্যমে অনেকগুলি সমান্তরাল কম্পিউটিং অর্জন করছি। প্রতিটি নোড 10 মিলিয়ন দিয়ে শুরু হয় এবং প্রতিটি পুনরাবৃত্তিতে 30% দ্বারা সেট করা ডেটা হ্রাস করে।
অ্যানি

প্রথম পুনরাবৃত্তিতে আমরা 500 মিলিয়নতম সংখ্যার সন্ধান করি। দ্বিতীয় পুনরাবৃত্তির - যদি সংখ্যার নম্বর মুছে ফেলা হয়েছে 300million তারপর আমরা 200millionth সংখ্যার জন্য এবং তাই চেহারা ... হয়
anony

2
দেখে মনে হচ্ছে এটি সঠিক পথে রয়েছে, তবে কীভাবে আপনার 30% / 70% বিভাজন দিয়ে দুর্ঘটনা করে মিডিয়াকে ফেলে দেওয়া এড়ানো যায় আপনি খুব পরিষ্কারভাবে ব্যাখ্যা করেন না। নিম্নলিখিত কাউন্টারেরেক্সামালটি ধরুন: ধরুন আপনার প্রথম 29% সমস্ত শূন্য এবং অন্য সমস্ত ব্লক 1000 এর গণনা করা হয়েছে এবং প্রতিটি ব্লকের সেট শেষের চেয়ে এক বেশি। 30 তম পার্সেন্টাইল মিডিয়ান সমস্ত 29% উপাত্তকে ফেলে দেবে, এবং কেবলমাত্র 61% এর অর্ধেকের নীচে, যা 29 + 30% = 59% তথ্য। উফফ, আমরা কেবল সত্যিকারের মিডিয়ান বের করে দিয়েছি! সুতরাং আপাতভাবে আপনি এটি বোঝাতে চাইছেন না, বা কমপক্ষে আপনি এটি ব্যাখ্যা করেছেন তার চেয়ে বেশি চালাক।
রেক্স কেরার

0

আসুন প্রথমে একটি একক মেশিনে কীভাবে n সংখ্যার মধ্যস্থতা খুঁজে বের করা যায় সে সম্পর্কে কাজ করা যাক: আমি মূলত বিভাজন কৌশলটি ব্যবহার করছি।

সমস্যা: নির্বাচন (এন, এন / ২): ন্যূনতম সংখ্যা থেকে n / 2 তম সংখ্যাটি সন্ধান করুন।

আপনি মাঝারি উপাদান কে এবং পার্টিশন ডেটাটিকে 2 টি সাব অ্যারেতে বেছে নিন। 1 ম এ সমস্ত উপাদান রয়েছে <কে এবং 2 য় সমস্ত উপাদান রয়েছে> = কে।

যদি মাপের (প্রথম উপ-অ্যারে)> = n / 2, আপনি জানেন যে এই উপ-অ্যারেটিতে মিডিয়ান রয়েছে। তারপরে আপনি ২ য় সাব-অ্যারে ফেলে দিতে পারেন। এই সমস্যা নির্বাচনটি সমাধান করুন (1 ম সাব-অ্যারে, এন / 2 এর আকার)

অন্যথায়, এই 1 ম subarray ফেলে দিন এবং নির্বাচন সমাধান করুন (2 য় subarray, n / 2 - মাপের (1 ম subarray))

এটি পুনরাবৃত্তি করুন।

সময়ের জটিলতা হ'ল (এন) প্রত্যাশিত সময়।

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

এই অ্যালগরিদম মানচিত্র হ্রাস ব্যবহার করে খুব ঝরঝরে প্রয়োগ করা যেতে পারে?

এটা দেখতে কেমন?


0

আমি মনে করি স্টিভ জেসপের উত্তরটি সবচেয়ে দ্রুত হবে।

নেটওয়ার্ক ডেটা ট্রান্সফারের আকার যদি বাধা হয় তবে এখানে অন্য একটি পদ্ধতি রয়েছে।

Divide the numbers into 100 computers (10 MB each). 
Loop until we have one element in each list     
    Find the meadian in each of them with quickselect which is O(N) and we are processing in parallel. The lists will be partitioned at the end wrt median.
    Send the medians to a central computer and find the median of medians. Then send the median back to each computer. 
    For each computer, if the overall median that we just computed is smaller than its median, continue in the lower part of the list (it is already partitioned), and if larger in the upper part.
When we have one number in each list, send them to the central computer and find and return the median.

প্রতিটি 32 এমবি, আপনার মানে?
ডিসি

তালিকার নীচের অংশে চালিয়ে যাওয়া বলতে কী বোঝ?
রুথভিক ভায়লা

0

আমি এটি এইভাবে করব:

শুরুতে সমস্ত 100 সর্বোচ্চ এবং সর্বনিম্ন সংখ্যা সন্ধান করতে কাজ করে; কম্পিউটারের প্রত্যেকটির ডাটাবেস / ফাইলের অংশ থাকে যা এটি প্রশ্ন করে;

যখন সর্বাধিক এবং সর্বনিম্ন সংখ্যাগুলি পাওয়া যায়, তখন একটি কম্পিউটার ডেটা পড়ে এবং প্রতিটি সংখ্যা সমানভাবে, বাকি 99 টিতে বিতরণ করে; সংখ্যা সমান বিরতি দিয়ে বিতরণ করা হয়; (একটি -100 মিলিয়ন থেকে 0, অন্যটি - 0 থেকে 100 মিলিয়ন ইত্যাদি হতে পারে);

নম্বর পাওয়ার সময়, 99 টি কম্পিউটারের প্রতিটি ইতিমধ্যে সেগুলি সাজিয়েছে;

তারপরে, মিডিয়ানটি সন্ধান করা সহজ ... প্রতিটি কম্পিউটারে কত সংখ্যক সংখ্যা রয়েছে তা দেখুন, তাদের সমস্তগুলি যুক্ত করুন (সংখ্যাটি নিজেরাই নয়, কতগুলি সংখ্যা রয়েছে তার যোগফল), 2 দিয়ে ভাগ করুন; কোন কম্পিউটারে সংখ্যাটি এবং কোন সূচকে গণনা করুন;

:) ভয়েলা

পিএস মনে হচ্ছে এখানে অনেক বিভ্রান্তি রয়েছে; মিডিয়ান - সংখ্যার একটি তালিকাবদ্ধ তালিকার মধ্যবর্তী সংখ্যা!


0

মিডিয়ানটি সন্ধানের জন্য আপনি টুর্নামেন্ট ট্রি পদ্ধতি ব্যবহার করতে পারেন। আমরা 1000 লিভ নোড সহ একটি গাছ তৈরি করতে পারি যে প্রতিটি লিফ নোড একটি অ্যারে হয়। তারপরে আমরা বিভিন্ন অ্যারেগুলির মধ্যে n / 2 টুর্নামেন্ট পরিচালনা করি n

http://www.geeksforgeeks.org/tournament-tree-and-binary-heap/


0

যদি সংখ্যাগুলি পৃথক না হয় এবং কেবলমাত্র একটি নির্দিষ্ট ব্যাপ্তির অন্তর্ভুক্ত হয়, তবে এগুলিই পুনরাবৃত্তি হয়, তবে আমার মনে আসে একটি সহজ সমাধান 99 মেশিনের মধ্যে সংখ্যা সমানভাবে বিতরণ করা এবং একটি মেশিনকে মাস্টার হিসাবে রাখা। এখন প্রতিটি মেশিন তার প্রদত্ত সংখ্যাগুলির উপরে পুনরাবৃত্তি করে এবং একটি হ্যাশ সেটে প্রতিটি সংখ্যার গণনা সঞ্চয় করে। প্রতিবার নির্দিষ্ট কম্পিউটারে বরাদ্দকৃত সংখ্যার সংখ্যায় পুনরাবৃত্তি হয়, এটি হ্যাশ সেটে তার গণনা আপডেট করে।

সমস্ত মেশিনগুলি তার হ্যাশ সেটটি মাস্টার মেশিনে ফেরত দেয়। মাস্টার মেশিনটি হ্যাশ সেটগুলিকে একত্রিত করে, একটি হ্যাশ সেটে পাওয়া একই কীটির গণনা যোগ করে। উদাহরণস্বরূপ, মেশিন # 1 এর হ্যাশ সেটটিতে ("1", 7) এন্ট্রি ছিল এবং মেশিন # 2 এর হ্যাশ সেটটিতে ("1", 9) এন্ট্রি ছিল, সুতরাং হ্যাশ সেটগুলিকে সংযুক্ত করার সময় মাস্টার মেশিনটি একটি প্রবেশিকা তৈরি করে ("1", 16), এবং আরও অনেক কিছু।

একবার হ্যাশ সেটগুলি মার্জ হয়ে গেলে, কেবল কীগুলি বাছাই করুন, এবং এখন আপনি বাছাই করা হ্যাশ সেট থেকে সহজেই (n / 2) তম আইটেম এবং (এন + 2/2) ম আইটেমটি সহজেই খুঁজে পেতে পারেন।

বিলিয়ন সংখ্যা পৃথক হলে এই পদ্ধতিটি উপকারী হবে না।


0

ঠিক আছে, ধরুন আপনি জানেন যে স্বতন্ত্র পূর্ণসংখ্যার সংখ্যা (বলুন) 4 বিলিয়ন, তারপরে আপনি তাদের 64k বালতিতে বালতি দিতে পারেন এবং ক্লাস্টারের প্রতিটি মেশিন থেকে প্রতিটি বালতির জন্য বিতরণ গণনা পেতে পারেন (100 কম্পিউটার)। এই সমস্ত সংখ্যা একত্রিত করুন। এখন, বালতিটি আবিষ্কার করুন যার মাঝারিটি রয়েছে এবং এই সময়টি কেবলমাত্র আপনার টার্গেট বালতিতে থাকা 64k উপাদানগুলির জন্য বালতি জিজ্ঞাসা করুন। এটির জন্য আপনার "ক্লাস্টার" সম্পর্কে ও (1) (বিশেষত 2) টি প্রশ্নের প্রয়োজন। : ডি


0

ইতিমধ্যে অন্যদের দ্বারা উত্থাপিত সমস্ত কিছুর পরেও আমার পয়সা মূল্য:

একটি একক মেশিনে মধ্যস্থ সন্ধান করা হ'ল ও (এন): https://en.wikedia.org/wiki/Selection_algorithm

100 টি মেশিনে এন নম্বর প্রেরণ করা ও (এন)। সুতরাং, ১০০ মেশিনকে আকর্ষণীয় করে তুলতে, হয় যোগাযোগটি তুলনামূলকভাবে দ্রুত হওয়া উচিত, বা এন এত বড় যে কোনও একক মেশিন এটি পরিচালনা করতে পারে না যখন এন / 100 করণীয় হয়, বা আমরা উদ্বেগ ছাড়াই গাণিতিক সমস্যাটি বিবেচনা করতে চাই তথ্য যোগাযোগ.

জিনিসগুলি সংক্ষিপ্ত করার জন্য আমি ধরে নিই যে যুক্তিসঙ্গত সীমাবদ্ধতার মধ্যে আমরা দক্ষতা বিশ্লেষণকে প্রভাবিত না করেই সংখ্যাগুলি প্রেরণ / বিতরণ করতে পারি।

তারপরে নীচের পদ্ধতির বিষয়টি বিবেচনা করুন, যেখানে কোনও মেশিনকে কিছু সাধারণ প্রক্রিয়াজাতকরণের জন্য "মাস্টার" হিসাবে নিয়োগ দেওয়া হয়েছে। এটি তুলনামূলকভাবে দ্রুত হবে, সুতরাং "মাস্টার" প্রতিটি মেশিন সম্পাদন করে এমন সাধারণ কাজগুলিতেও অংশ নেয়।

  1. প্রতিটি মেশিন N / 100 নম্বর পেয়ে থাকে, তার নিজস্ব মিডিয়ান গণনা করে এবং সেই তথ্য মাস্টারকে প্রেরণ করে।
  2. মাস্টার সমস্ত স্বতন্ত্র মিডিয়ানের একটি বাছাই করা তালিকা তৈরি করে এবং এটি প্রতিটি মেশিনে প্রেরণ করে, বাল্টির আদেশকৃত ক্রম (প্রতিটি মেশিনে একই) নির্ধারণ করে, প্রতিটি মাঝারি মানের জন্য একটি (একক মানের মান বালতি) এবং প্রতিটি ব্যবধানের জন্য একটি করে সংলগ্ন মিডিয়ান অবশ্যই নিম্নতম এবং উচ্চতর স্তরের বালতিগুলি নিম্নতম মধ্যকের নীচে এবং উচ্চতমেরও উপরে রয়েছে।
  3. প্রতিটি মেশিন প্রতিটি বালতিতে কত নম্বর পড়ে তা গণনা করে এবং সেই তথ্যটি মাস্টারের কাছে ফিরে যোগাযোগ করে।
  4. মাস্টার নির্ধারণ করে যে কোন বালতিটি মাঝারি রয়েছে, কতগুলি নিম্নতর মান (মোট) এই বালতির নীচে পড়ে এবং কত উপরে many
  5. নির্বাচিত বালতিটি যদি একটি একক মানের বালতি হয় (মিডিয়ানদের মধ্যে একটি) বা নির্বাচিত বালতিটি কেবলমাত্র 1 (এন বিজোড়) বা 2 (এন এমনকি) মান সম্পন্ন করে থাকে contains অন্যথায় আমরা উপরের পদক্ষেপগুলি নিম্নলিখিত (স্পষ্ট) পরিবর্তনের সাথে পুনরাবৃত্তি করি:
  6. কেবলমাত্র নির্বাচিত বালতি থেকে প্রাপ্ত নম্বরগুলি (পুনরায়) মাস্টার থেকে 100 টি মেশিনে বিতরণ করা হয়েছে এবং তদতিরিক্ত
  7. আমরা মিডিয়ান গণনা করতে যাচ্ছি না (প্রতিটি মেশিনে), তবে কে-থের মান, যেখানে আমরা বিবেচনা করব যে কতগুলি উচ্চতর সংখ্যা মোট থেকে বাদ দেওয়া হয়েছে এবং কতগুলি নিম্ন সংখ্যা রয়েছে। ধারণাগতভাবে প্রতিটি মেশিনের ফেলে দেওয়া কম / উচ্চ সংখ্যারও তার অংশ থাকে এবং সেটটিকে নতুন ধারণার গণনা করার সময় এটি বিবেচনায় রাখে (ধারণাগতভাবে) বাতিল হওয়া সংখ্যার (এর অংশ) অন্তর্ভুক্ত থাকে।

টাইম-জটিলতা:

  1. কিছুটা ভাবনা আপনাকে বোঝাবে যে প্রতিটি পদক্ষেপে বিশ্লেষণের মোট মান সংখ্যা কমপক্ষে দুটি দ্বারা হ্রাস করা হয় (2 এটি বরং অসুস্থ ক্ষেত্রে হবে; আপনি উল্লেখযোগ্যভাবে আরও ভাল হ্রাস আশা করতে পারেন)। এটি থেকে আমরা পাই:
  2. ধরে নিই যে মিডিয়ান (বা কে-থ মান), যা হে (এন), সন্ধান করতে সি * এন সময় লাগে যেখানে প্রিফেক্টর সি এর সাথে খুব বেশি বুনো পরিবর্তিত হয় না যাতে আমরা এটিকে মুহূর্তের জন্য স্থির হিসাবে নিতে পারি, আমরা সর্বাধিক 2 * সি * এন / 100 সময়ে আমাদের চূড়ান্ত ফলাফলটি পাবেন। 100 টি মেশিন ব্যবহার করা আমাদের অতএব 100/2 (কমপক্ষে) এর একটি গতির গতির কারণ দেয়।
  3. প্রথমদিকে যেমন মন্তব্য করা হয়েছিল: মেশিনগুলির মধ্যে সংখ্যার যোগাযোগের সাথে জড়িত সময়টি কেবল একটি মেশিনে সমস্ত কিছু করা আরও আকর্ষণীয় করে তুলতে পারে। তবে, যদি আমরা বিতরণিত পদ্ধতির দিকে যাই, তবে সমস্ত পদক্ষেপে একসাথে জানাতে হবে এমন মোট সংখ্যার সংখ্যা 2 * এন (প্রথমবারের জন্য, এন </ এন / 2 দ্বিতীয়বারের বেশি হবে না, <= তার অর্ধেক) তৃতীয়, এবং তাই)।

-1
  1. 1 বিলিয়ন সংখ্যাকে 100 মেশিনে ভাগ করুন। প্রতিটি মেশিনে 10 ^ 7 নম্বর থাকবে।

  2. একটি মেশিনে প্রতিটি আগত সংখ্যার জন্য, একটি ফ্রিকোয়েন্সি মানচিত্রে নম্বর, নম্বর -> গণনায় সংরক্ষণ করুন। প্রতিটি মেশিনে ন্যূনতম নম্বরটিও সঞ্চয় করুন।

  3. প্রতিটি মেশিনের মাঝারি সন্ধান করুন: প্রতিটি মেশিনের ন্যূনতম সংখ্যা থেকে শুরু করে মিডিয়ান সূচক না পাওয়া পর্যন্ত গণনাগুলি যোগ করুন। প্রতিটি মেশিনের মাঝারিটি প্রায় হবে। 5 * 10 ^ 6 এর চেয়ে কম এবং বৃহত্তর।

  4. সমস্ত মধ্যমাধ্যমের মাঝারি সন্ধান করুন, যা প্রায় কম ও কম হবে। 50 * 10 ^ 7 সংখ্যা, যা 1 বিলিয়ন সংখ্যার মধ্যম।

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

[min number] - 8 count
[min+1 number] - 7 count
[min+2 number] - 5 count

উপরেরটি বিট অ্যারে হিসাবে সংরক্ষণ করা যেতে পারে:

[min number] - 10000000
[min+1 number] - 1000000
[min+2 number] - 10000

মনে রাখবেন যে মোটামুটি এটির জন্য প্রতিটি মেশিনের জন্য প্রায় 10 ^ 7 বিট লাগবে, যেহেতু প্রতিটি মেশিন কেবল 10 ^ 7 নম্বর পরিচালনা করে। 10 ^ 7 বেটস = 1.25 * 10 ^ 6 বাইট, যা 1.25 এমবি

সুতরাং উপরোক্ত পদ্ধতির সাথে প্রতিটি যন্ত্রের স্থানীয় মিডিয়ান গণনা করার জন্য 1.25MB স্থানের প্রয়োজন হবে। এবং মিডিয়ানদের মিডিয়ানগুলি এই 100 স্থানীয় মেডিয়ান থেকে গণনা করা যেতে পারে, যার ফলস্বরূপ 1 বিলিয়ন সংখ্যার মাঝারি হয়।


সংখ্যাগুলি যদি ভাসমান হয়?
Sklivvz

-1

আমি আনুমানিক মিডিয়ান গণনা করার জন্য একটি পদ্ধতির পরামর্শ দিই। :) এই এক বিলিয়ন সংখ্যা যদি এলোমেলোভাবে থাকে তবে আমি মনে করি যে আমি এলোমেলোভাবে এক বিলিয়ন সংখ্যার 1/100 বা 1/10 বাছাই করতে পারি, তাদের 100 টি মেশিন দিয়ে বাছাই করতে পারি, তারপরে তার মধ্যকটি বেছে নিতে পারি। বা আসুন 100 টি অংশে বিলিয়ন সংখ্যা বিভক্ত করুন, প্রতিটি মেশিন এলোমেলোভাবে প্রতিটি অংশের 1/10 বেছে নিন, সেগুলির মধ্যম গণনা করুন। এর পরে আমাদের 100 টি সংখ্যা রয়েছে এবং আমরা 100 সংখ্যাটি সহজতর করে গণনা করতে পারি। কেবলমাত্র একটি পরামর্শ, আমি নিশ্চিত নই যে এটি গাণিতিকভাবে সঠিক কিনা। তবে আমি মনে করি আপনি ফলাফলটি কোনও অতি-অ-গণিত ম্যানেজারকে প্রদর্শন করতে পারেন।


এটি স্পষ্টতই সঠিক নয়, এবং আমি
দৃ recommend়ভাবে

হাহা ঠিক আছে, যদিও এটি আপনার উত্তরটি ভুল হিসাবে সত্যটি পরিবর্তন করে না। এটি প্রমাণ করা খুব সহজ
Dici

ঠিক আছে, পরিসংখ্যান সম্পর্কে কিছু বক্তৃতা পড়ার পরে, আমি মনে করি ধারণাটি এক বিলিয়ন সংখ্যার এলোমেলোভাবে 1/100 বা এমনকি 1/1000 বাছাই করে এবং তাদের মধ্যম গণনা করা এত খারাপ নয়। এটি কেবল একটি আনুমানিক গণনা।
অলসব্যয়

-3

স্টিভ জেসপের উত্তরটি ভুল:

নিম্নলিখিত চারটি দল বিবেচনা করুন:

{2, 4, 6, 8, 10

{21, 21, 24, 26, 28

{12, 14, 30, 32, 34}

{16, 18, 36, 38, 40}

মিডিয়ানটি 21, যা দ্বিতীয় গ্রুপে রয়েছে।

চারটি দলের মধ্যস্থতাকারী হ'ল 6, 24, 30, 36, মোট মধ্যমা 27 হয়।

প্রথম লুপের পরে, চারটি গ্রুপ হয়ে যাবে:

{6, 8, 10}

{24, 26, 28}

{12, 14, 30}

{16, 18, 36}

21 ইতিমধ্যে ভুলভাবে বাতিল করা হয়েছে।

এই অ্যালগরিদম কেবল যখন দুটি গ্রুপ থাকে তখন কেসটিকে সমর্থন করে।

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