জনের ইতিমধ্যে তত্ত্বটি আবৃত করার পরে , এখানে একটি বাস্তবায়ন দেওয়া হল:
function shuffle(array) {
var tmp, current, top = array.length;
if(top) while(--top) {
current = Math.floor(Math.random() * (top + 1));
tmp = array[current];
array[current] = array[top];
array[top] = tmp;
}
return array;
}
অ্যালগরিদম হল O(n)
, যেখানে বাছাই করা উচিত O(n log n)
। নেটিভ sort()
ফাংশনের তুলনায় জেএস কোড কার্যকর করার ওভারহেডের উপর নির্ভর করে এটি পারফরম্যান্সে একটি লক্ষণীয় পার্থক্যের দিকে নিয়ে যেতে পারে যা অ্যারের আকারের সাথে বাড়ানো উচিত।
বোবোবোবির উত্তরের মন্তব্যে , আমি বলেছি যে প্রশ্নে থাকা অ্যালগরিদম সমানভাবে বিতরণ করা সম্ভাবনাগুলি তৈরি করতে পারে না (বাস্তবায়নের উপর নির্ভর করে sort()
)।
আমার যুক্তি এই রেখাগুলি বরাবর যায়: বাছাই অ্যালগরিদমের জন্য একটি নির্দিষ্ট সংখ্যক c
তুলনা প্রয়োজন যেমন c = n(n-1)/2
বুদবুদোর জন্য। আমাদের এলোমেলো তুলনা ফাংশন প্রতিটি তুলনার ফলাফলকে 2^c
সমানভাবে সম্ভাব্য করে তোলে, তেমনি সমান সম্ভাব্য ফলাফলও রয়েছে। এখন, প্রতিটি ফলাফল n!
অ্যারের এন্ট্রিগুলির যে কোনও একের অনুক্রমের সাথে সামঞ্জস্য করতে হবে , যা সাধারণ ক্ষেত্রে এমনকি এমনকি বিতরণকে অসম্ভব করে তোলে। (এটি একটি সরলকরণ, কারণ তুলনামূলক প্রকৃত সংখ্যা নির্ধারিত হওয়া ইনপুট অ্যারের উপর নির্ভর করে, তবে দৃ the়তা এখনও রাখা উচিত))
জোন যেভাবে উল্লেখ করেছেন, এটিই ফিশার-ইয়েটসকে ব্যবহারের চেয়ে পছন্দ করার কোনও কারণ নয়, কারণ sort()
এলোমেলো সংখ্যার জেনারেটর অনুমানের ক্ষেত্রে সিউডো-এলোমেলো মানের একটি সীমাবদ্ধ মানচিত্রও তৈরি করবে n!
। তবে ফিশার-ইয়েটসের ফলাফলগুলি আরও ভাল হওয়া উচিত:
Math.random()
পরিসীমাতে একটি সিডো-এলোমেলো সংখ্যা তৈরি করে [0;1[
। জেএস ডাবল-স্পষ্টতা ভাসমান পয়েন্টের মানগুলি ব্যবহার করে, এটি 2^x
সম্ভাব্য মানগুলির সাথে মিলে যায় যেখানে 52 ≤ x ≤ 63
(আমি প্রকৃত সংখ্যাটি খুঁজে পেতে খুব অলস)। ব্যবহার করে উত্পন্ন সম্ভাব্যতা বিতরণ Math.random()
ভাল আচরণ বন্ধ করবে যদি পারমাণবিক ঘটনার সংখ্যা একই মাত্রার মাত্রায় হয়।
ফিশার-ইয়েটস ব্যবহার করার সময়, প্রাসঙ্গিক প্যারামিটারটি অ্যারের আকার হয়, যা 2^52
ব্যবহারিক সীমাবদ্ধতার কারণে কখনই যোগাযোগ করা উচিত নয় ।
এলোমেলো তুলনা ফাংশনটি বাছাই করার সময়, ফাংশনটি মূলত শুধুমাত্র যত্ন করে যদি রিটার্নের মানটি ইতিবাচক বা নেতিবাচক হয়, তাই এটি কখনও সমস্যা হবে না। তবে একটি অনুরূপটি রয়েছে: কারণ তুলনা ফাংশনটি ভাল আচরণ করা হয়েছে, 2^c
সম্ভাব্য ফলাফলগুলি যেমন বলা হয়েছে, তেমনি সমান সম্ভাবনাও রয়েছে। যদি c ~ n log n
তবে 2^c ~ n^(a·n)
কোথায় a = const
, যা এটি কমপক্ষে সম্ভব করে তোলে যা 2^c
একই পরিমাণে (বা তার চেয়েও কম) n!
এবং এইভাবে অসম বন্টনের দিকে পরিচালিত করে, এমনকি যদি সাজানোর অ্যালগরিদম যেখানে সমানভাবে অনুক্রমের উপরে মানচিত্র করা যায়। এর যদি কোনও ব্যবহারিক প্রভাব থাকে তবে তা আমার বাইরে।
আসল সমস্যাটি হ'ল বাছাই করা অ্যালগরিদমগুলি সমানভাবে অনুমোদনে মানচিত্রের গ্যারান্টিযুক্ত নয়। এটি দেখতে সহজ যে Mergesort এটি প্রতিসাম্য হিসাবে কাজ করে তবে বুবল্বোর্ট বা আরও গুরুত্বপূর্ণভাবে কুইকসোর্ট বা হিপসোর্টের মতো কিছু সম্পর্কে যুক্তিযুক্ত নয়।
নীচের লাইন: যতক্ষণ sort()
Mergesort ব্যবহার করা হয় ততক্ষণ আপনি কোণার কেস বাদে যথাযথভাবে নিরাপদ হওয়া উচিত (কমপক্ষে আমি আশা করি 2^c ≤ n!
এটি একটি কোণার কেস), যদি না হয় তবে সমস্ত বেট বন্ধ রয়েছে।