স্কিটির এই উদ্ধৃতি থেকে শুরু:
এটি আমার পছন্দ মতো বদলে যাওয়া নয়, বেশিরভাগ কারণেই এটি কোনও কারণ ছাড়াই এটি O (n লগ এন) হয় যখন কোনও ও (এন) স্থানান্তর কার্যকর করা সহজ হয়। প্রশ্নের উপাদানটি মূলত প্রতিটি উপাদানকে একটি এলোমেলো ( আশাকরি অনন্য! ) নম্বর দিয়ে তার পরে সেই সংখ্যা অনুসারে উপাদানগুলি অর্ডার করে "কাজ করে" ।
আমি আশাবাদী অনন্য কারণ ব্যাখ্যা করার জন্য কিছুটা এগিয়ে যাব !
এখন, গণনার কাছ থেকে Oআর্ডার বাই :
এই পদ্ধতিটি একটি স্থিতিশীল বাছাই করে; তা হল, যদি দুটি উপাদানের কীগুলি সমান হয় তবে উপাদানগুলির ক্রম সংরক্ষণ করা হবে
এই অত্যন্ত গুরুত্বপূর্ণ! যদি দুটি উপাদান একই র্যান্ডম সংখ্যাটি "গ্রহণ" করে তবে কী ঘটে? এটি ঘটে যে তারা একই ক্রমে থাকে তবে তারা অ্যারেতে থাকে। এখন, এটি হওয়ার সম্ভাবনা কী? ঠিক গণনা করা কঠিন, তবে জন্মদিনের সমস্যাটিও হ'ল ঠিক এই সমস্যা।
এখন, এটা কি বাস্তব? এটা সত্যি?
সর্বদা হিসাবে, যখন সন্দেহ হয়, প্রোগ্রামের কয়েকটি লাইন লিখুন: http://pastebin.com/5CDnUxPG
কোডের এই সামান্য ব্লকটি ফিশার-ইয়েটস অ্যালগরিদমকে পিছনে সম্পন্ন করে ফিশার-ইয়েটস অ্যালগরিদম ব্যবহার করে নির্দিষ্ট সময়ের জন্য 3 টি উপাদানের একটি অ্যারেরকে বদলে দেয় ( উইকির পৃষ্ঠায় দুটি সিউডো কোড অ্যালগোরিদম রয়েছে ... তারা সমতুল্য উত্পাদন করে ফলাফল, তবে একটি প্রথম থেকে শেষ এলিমেন্টে করা হয়, অন্যটি শেষ থেকে প্রথম উপাদান পর্যন্ত করা হয়), http://blog.codinghorror.com/the-danger-of-naivete/ এর মজাদার ভুল অ্যালগরিদম এবং ব্যবহার করে .OrderBy(x => r.Next())
এবং .OrderBy(x => r.Next(someValue))
।
এখন, র্যান্ডম.নেক্সট হ'ল
একটি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা যা 0 এর চেয়ে বড় বা সমান এবং ম্যাক্সভ্যালু থেকে কম।
সুতরাং এটি সমতুল্য
OrderBy(x => r.Next(int.MaxValue))
এই সমস্যাটি বিদ্যমান কিনা তা পরীক্ষা করার জন্য, আমরা অ্যারেটি বড় করতে পারি (খুব ধীরে ধীরে কিছু) বা এলোমেলো সংখ্যা জেনারেটরের সর্বাধিক মান হ্রাস করতে পারি ( int.MaxValue
"বিশেষ" সংখ্যা নয় ... এটি কেবল একটি খুব বড় সংখ্যা)। শেষ পর্যন্ত, যদি অ্যালগরিদম স্থিতিশীলতার দ্বারা পক্ষপাতী না হয় OrderBy
, তবে মানগুলির যে কোনও পরিসীমা একই ফলাফল দেয়।
প্রোগ্রামটি পরে 1 ... 4096 পরিসরে কিছু মান পরীক্ষা করে। ফলাফলটির দিকে তাকালে এটি পুরোপুরি স্পষ্ট যে কম মানগুলির জন্য (<128), অ্যালগরিদমটি খুব পক্ষপাতদুষ্ট (4-8%)। 3 টি মান সহ আপনার কমপক্ষে প্রয়োজন r.Next(1024)
। আপনি যদি অ্যারেটিকে বড় (4 বা 5) করেন তবে r.Next(1024)
তা যথেষ্ট নয়। আমি বদলে যাওয়া এবং গণিতে বিশেষজ্ঞ নই, তবে আমি মনে করি অ্যারের প্রতিটি দৈর্ঘ্যের অতিরিক্ত দৈর্ঘ্যের জন্য আপনার সর্বাধিক মানের জন্য 2 অতিরিক্ত বিট প্রয়োজন (কারণ জন্মদিনের প্যারাডক্সটি স্কয়ারটি (সংখ্যাসমূহ) এর সাথে সংযুক্ত, তাই) যদি সর্বোচ্চ মান 2 ^ 31 হয় তবে আমি বলব যে আপনি 2 ^ 12/2 ^ 13 বিট (4096-8192 উপাদান) পর্যন্ত অ্যারে বাছাই করতে সক্ষম হবেন