এটি স্থিতিশীল এবং ও (এন) এর একটি সময়ের জটিলতা রয়েছে। এটি কুইকোর্ট এবং মার্জেসোর্টের মতো অ্যালগরিদমের চেয়ে দ্রুত হওয়া উচিত, তবুও আমি এর ব্যবহারটি খুব কমই দেখতে পেলাম।
এটি স্থিতিশীল এবং ও (এন) এর একটি সময়ের জটিলতা রয়েছে। এটি কুইকোর্ট এবং মার্জেসোর্টের মতো অ্যালগরিদমের চেয়ে দ্রুত হওয়া উচিত, তবুও আমি এর ব্যবহারটি খুব কমই দেখতে পেলাম।
উত্তর:
র্যাডিক্স সাজানোর থেকে পৃথক, কুইকসোর্ট সর্বজনীন, অন্যদিকে রেডিক্স সারণি দৈর্ঘ্যের পূর্ণসংখ্য কীগুলির জন্য কেবল কার্যকর।
এছাড়াও আপনাকে বুঝতে হবে যে ও (এফ (এন)) এর অর্থ হ'ল কে * ফ (এন) এর ক্রম, যেখানে কে কিছু নির্বিচারে ধ্রুবক। র্যাডিক্স বাছাইয়ের জন্য এই কে বেশ বড় হতে পারে (সংখ্যায় বিট সংখ্যা ন্যূনতম ক্রম অনুসারে সাজানো), অন্যদিকে কুইকোর্টে সব ধরণের অ্যালগরিদম এবং এন * লগ (এন) এর গড় জটিলতার মধ্যে সবচেয়ে কম কে রয়েছে। সুতরাং বাস্তব জীবনের দৃশ্যে কুইকোর্টটি র্যাডিক্স বাছাইয়ের তুলনায় খুব দ্রুত হবে।
সর্বাধিক বাছাই করা অ্যালগরিদমগুলি সাধারণ-উদ্দেশ্য। একটি তুলনা ফাংশন দেওয়া, তারা যে কোনও বিষয়ে কাজ করে এবং কুইকোর্ট এবং হিপসোর্টের মতো অ্যালগরিদমগুলি ও (1) অতিরিক্ত মেমরির সাথে বাছাই করবে।
রেডিক্স বাছাই করা আরও বিশেষায়িত। আপনার একটি নির্দিষ্ট কী দরকার যা অভিধানিক ক্রমে রয়েছে। কীতে প্রতিটি সম্ভাব্য চিহ্নের জন্য আপনার একটি বালতি প্রয়োজন, এবং বালতিগুলিকে প্রচুর রেকর্ড ধারণ করতে হবে। (পর্যায়ক্রমে, আপনার বালতিগুলির একটি বড় অ্যারের প্রয়োজন যা প্রতিটি সম্ভাব্য মূল্যের মানটি ধরে রাখবে)) আপনার রাডিক্স সাজানোর জন্য অনেক বেশি মেমরির প্রয়োজন হতে পারে এবং আপনি এলোমেলোভাবে এটি ব্যবহার করতে যাচ্ছেন। এগুলির কোনওটিই আধুনিক কম্পিউটারগুলির পক্ষে ভাল নয়, যেহেতু আপনি কোইকসোর্টের মতো পৃষ্ঠা ত্রুটিগুলি পেয়ে যাবেন ক্যাশে মিস করবে।
শেষ অবধি, লোকেরা সাধারণত তাদের নিজস্ব সাজানো অ্যালগরিদমগুলি আর লেখেন না। বেশিরভাগ ভাষায় বাছাই করার জন্য লাইব্রেরির সুবিধা রয়েছে এবং সাধারনত সঠিক জিনিস হ'ল এগুলি ব্যবহার করা। যেহেতু র্যাডিক্স সাজ্ট সর্বজনীনভাবে প্রযোজ্য নয়, সাধারণত আসল ব্যবহারের জন্য উপযুক্তভাবে তৈরি করতে হয় এবং প্রচুর অতিরিক্ত মেমরি ব্যবহার করে তাই এটি একটি লাইব্রেরির ফাংশন বা টেম্পলেটটিতে রাখা শক্ত।
O(n^2)
কারণে সবচেয়ে খারাপ ক্ষেত্রে মেমরির প্রয়োজন n
। যদি বাস্তবায়নের ক্ষেত্রে লেজ পুনরাবৃত্তি অপ্টিমাইজেশন ব্যবহার করা হয় তবে এটিকে ঠিক কম করা যেতে পারে O(n)
কারণ সঠিক পার্টিশনে কল করার জন্য অতিরিক্ত স্থানের প্রয়োজন হবে না। ( en.wikedia.org/wiki/Quicksort#Space_complexity )
S(n) \in O(n)
রেডিক্সের সাথে বাছাইয়ের জন্য স্থান প্রয়োজন , যেমন হিপ বা দ্রুত সাজানোর জন্য একই।
n^2
আর O(log n)
এটি বেশ বিরল যে আপনি কীগুলি বাছাই করেছেন তা আসলে একটি পরিচিত, স্পারস রেঞ্জের পূর্ণসংখ্যা। সাধারণত আপনার বর্ণানুক্রমিক ক্ষেত্রগুলি থাকে যা দেখে মনে হয় তারা তুলনামূলক বাছাইয়ের সমর্থন করবে তবে আসল-ওয়ার্ল্ড স্ট্রিংগুলি বর্ণমালা জুড়ে সমানভাবে বিতরণ করা হয় না, এটি তাত্ত্বিকভাবে এটির মতো কাজ করে না।
অন্যান্য সময়, মানদণ্ডটি কেবলমাত্র কার্যকরভাবে সংজ্ঞায়িত করা হয় (দুটি রেকর্ড দেওয়া হলে আপনি প্রথমে কোনটি আসতে পারেন তা নির্ধারণ করতে পারেন, তবে বিচ্ছিন্ন রেকর্ডটি কীভাবে 'দূরে' রয়েছে তা আপনি মূল্যায়ন করতে পারবেন না)। সুতরাং পদ্ধতিটি প্রায়শই প্রযোজ্য নয়, আপনার বিশ্বাসের তুলনায় কম প্রযোজ্য বা ও (এন * লগ (এন)) এর চেয়ে কোনও দ্রুত নয়।
আমি এটি সর্বদা ব্যবহার করি, তুলনা-ভিত্তিক প্রকারের তুলনায় আসলে বেশি, তবে আমি স্বীকার করছি যে একটি অডব্লাল যা অন্য যে কোনও কিছুর চেয়ে সংখ্যা নিয়ে বেশি কাজ করে (আমি সবেই স্ট্রিং দিয়ে কাজ করি, এবং তারা সাধারণত যদি অভ্যন্তরীণ হয় তবে ঠিক কোন বিন্দুতে ডুপ্লিকেটগুলি এবং গণনা সেট ছেদগুলি ফিল্টার করার জন্য বাছাই করা আবার কার্যকর হতে পারে; আমি কার্যত কখনই অভিধান সংক্রান্ত তুলনা করি না)।
একটি মৌলিক উদাহরণটি অনুসন্ধান বা মধ্য বিভাজনের অংশ হিসাবে নির্দিষ্ট মাত্রার দ্বারা রেডিক্স বাছাই করা পয়েন্ট বা কাকতালীয় বিন্দু, গভীরতা বাছাইকারী টুকরোগুলি সনাক্ত করার একটি দ্রুত উপায় বা আরও ক্যাশে-বান্ধব অ্যাক্সেস সরবরাহ করতে একাধিক লুপগুলিতে ব্যবহৃত সূচকগুলির একটি অ্যারে বাছাই করে রেডিক্সকে নির্দেশ করে points নিদর্শন (কেবল আবার ফিরে যেতে এবং একই স্মৃতিটিকে ক্যাশে লাইনে পুনরায় লোড করার জন্য স্মৃতিতে পিছনে পিছনে যাওয়া নয়)। কমপক্ষে আমার ডোমেনে (কম্পিউটার গ্রাফিক্স) একটি খুব প্রশস্ত অ্যাপ্লিকেশন রয়েছে কেবলমাত্র নির্দিষ্ট আকারের 32-বিট এবং 64-বিট সংখ্যাসূচক কীগুলিতে বাছাই করার জন্য।
একটা জিনিস আমি পিচ করতে চেয়েছিলাম এবং তা হ'ল রেডিক্স সারণি ভাসমান-পয়েন্ট সংখ্যা এবং নেতিবাচক ক্ষেত্রে কাজ করতে পারে, যদিও এটি সম্ভব হিসাবে পোর্টেবল এমন একটি এফপি সংস্করণ লিখতে অসুবিধা হয়। এটি ও (এন * কে) থাকাকালীন কে কে কী আকারের বাইট সংখ্যাটি হতে হবে (উদাহরণস্বরূপ: বালতিতে 2 ^ 8 এন্ট্রি থাকলে একটি মিলিয়ন 32-বিট পূর্ণসংখ্যার সাধারণত 4 বাইট-আকারের পাসগুলি লাগে )। মেমোরি অ্যাক্সেস প্যাটার্নটি কুইকোর্টের তুলনায় অনেক বেশি ক্যাশে-বান্ধব হতে থাকে যদিও এর জন্য সাধারণত একটি সমান্তরাল অ্যারে এবং একটি ছোট বালতি অ্যারের প্রয়োজন হয় (দ্বিতীয়টি সাধারণত স্ট্যাকের উপর ঠিক জরিমানা করতে পারে)। কিউএস বিক্ষিপ্ত এলোমেলো-অ্যাক্সেস নিদর্শনগুলির সাথে মিলিয়ন ইন্টিজারের অ্যারে বাছাই করতে 50 মিলিয়ন অদলবদল করতে পারে। 4 টি লিনিয়ারে ক্যাড-ফ্রেন্ডলি ডেটা ছাড়িয়ে দেয় মূল সূত্রটি বাছাই করতে পারে।
তবে ভাসমান-পয়েন্টের পাশাপাশি নেতিবাচক সংখ্যায় একটি ছোট কে দিয়ে এটি করতে সক্ষম হওয়ার সচেতনতার অভাব খুব ভালভাবে রেডিক্স ধরণের জনপ্রিয়তার অভাবকে অবদান রাখতে পারে।
লোকেরা কেন এটি প্রায়শই ব্যবহার করে না সে সম্পর্কে আমার মতামত হিসাবে, এটি অনেকগুলি ডোমেনের সাথে সাধারণত সংখ্যার বাছাই বা সার্চ কী হিসাবে ব্যবহার করার প্রয়োজন নাও করতে পারে। তবে, কেবলমাত্র আমার ব্যক্তিগত অভিজ্ঞতার ভিত্তিতে, আমার প্রাক্তন সহকর্মীরাও এটি পুরোপুরি উপযুক্ত ছিল এমন ক্ষেত্রে এটি ব্যবহার করেনি এবং আংশিক কারণ তারা এফপি এবং নেতিবাচক ক্ষেত্রে কাজ করতে পারে তা সম্পর্কে তারা অবগত ছিলেন না। সুতরাং এটিকে বাদ দিয়ে কেবলমাত্র সংখ্যার ধরণের ক্ষেত্রে কাজ করে, প্রায়শই এটি সাধারণত প্রয়োগের তুলনায় আরও কম প্রয়োগযোগ্য বলে মনে করা হয়। আমার যদি এটি ভাসমান-পয়েন্ট সংখ্যা এবং নেতিবাচক পূর্ণসংখ্যার উপর কাজ না করে তবে আমি এর জন্য প্রায় ততটা ব্যবহার করতে পারতাম না।
কিছু মানদণ্ড:
Sorting 10000000 elements 3 times...
mt_sort_int: {0.135 secs}
-- small result: [ 12 17 17 22 52 55 67 73 75 87 ]
mt_radix_sort: {0.228 secs}
-- small result: [ 12 17 17 22 52 55 67 73 75 87 ]
std::sort: {1.697 secs}
-- small result: [ 12 17 17 22 52 55 67 73 75 87 ]
qsort: {2.610 secs}
-- small result: [ 12 17 17 22 52 55 67 73 75 87 ]
এবং এটি ঠিক আমার নিখুঁত বাস্তবায়নের সাথেই ( mt_sort_int
এটিও মূল অঙ্কটি বাছাই করে তবে কোডের একটি দ্রুত শাখা দিয়ে দেওয়া হয় যে এটি কীটি একটি পূর্ণসংখ্যা হিসাবে ধরে নিতে পারে)। কল্পনা করুন বিশেষজ্ঞদের দ্বারা লিখিত একটি মানক বাস্তবায়ন কত দ্রুত হতে পারে।
কেবলমাত্র যখন আমি সি ++ এর চেয়ে দ্রুত তুলনা-ভিত্তিক তুলনামূলকভাবে ভিত্তিক রেডিক্সের সৃজনটি পেয়েছিলাম তা std::sort
সত্যিই খুব অল্প সংখ্যক উপাদানের জন্য ছিল, 32 বলুন, আমি বিশ্বাস করি যে বিন্দুটি std::sort
হিপস্পোর্টস বা অল্প সংখ্যক উপাদানের জন্য ক্ষুদ্রতর সংখ্যার জন্য উপযুক্তভাবে ব্যবহার করা শুরু করে or সন্নিবেশ বাছাই, যদিও এই সময়ে আমার বাস্তবায়নটি কেবল ব্যবহার করে std::sort
।
আরও একটি কারণ: এই দিনগুলিকে বাছাই করা সাধারণত ব্যবহারকারী সরবরাহকারী বাছাই করা রুটিনের সাথে সংযোজক সরবরাহকারী সাজানো যুক্তির সাথে সংযুক্ত থাকে। র্যাডিক্স সাজানোর সাহায্যে এটি যথেষ্ট জটিল হয়ে উঠবে এবং আরও খারাপ হয়ে যায় যখন ভাসিয়েবল দৈর্ঘ্যের একাধিক কী অনুসারে বাছাই করা রুটিন কাজ করে। (বলুন, নাম এবং জন্ম তারিখ।)
বাস্তব বিশ্বে আমি আসলে একবারে একটি রেডিক্স সাজ্ট বাস্তবায়ন করেছি। এটি পুরানো দিনগুলিতে ছিল যখন স্মৃতি সীমাবদ্ধ ছিল, আমি আমার সমস্ত ডেটা একবারে স্মৃতিতে আনতে পারিনি। এর অর্থ হ'ল ডেটিতে অ্যাক্সেসের সংখ্যা ও (এন) বনাম ও (এন লগ এন) এর চেয়ে অনেক বেশি গুরুত্বপূর্ণ। আমি প্রতিটি রেকর্ডটি একটি বিনকে বরাদ্দকৃত ডেটা জুড়ে একটি পাস করেছি (একটি লিখিত তালিকা যা রেকর্ডগুলি ছিল কোনটি বিনে আসলে কিছুই চলছিল না)) প্রতিটি খালি বিনের জন্য (আমার সাজানোর কীটি পাঠ্য ছিল, প্রচুর পরিমাণে থাকবে) খালি বিনা) আমি পরীক্ষা করেছিলাম যে আমি আসলে ডেটা মেমরিতে আনতে পারি - যদি হ্যাঁ, এটি এনে কোয়েকার্স্ট ব্যবহার করতে পারি। যদি না হয় তবে বিনের মধ্যে কেবলমাত্র আইটেম রয়েছে এমন একটি টেম্প ফাইল তৈরি করুন এবং রুটিনকে পুনরাবৃত্তভাবে কল করুন। (অনুশীলনে কয়েকটি বিনগুলি উপচে পড়বে)) এর ফলে নেটওয়ার্ক স্টোরেজে দুটি সম্পূর্ণ পঠন এবং একটি সম্পূর্ণ লেখার কারণ হতে পারে এবং এটি স্থানীয় স্টোরেজে 10% এর মতো হয়ে থাকে।
এই দিনগুলিতে এ জাতীয় বড় ডেটা ইস্যুগুলি চালানো খুব বেশি শক্ত, আমি সম্ভবত এর আগে আর কখনও লিখব না। (এই দিনগুলিতে যদি আমি একই ডেটাটির মুখোমুখি হতাম তবে আমি কেবল 64৪-বিট ওএস নির্দিষ্ট করে দেব, আপনি যদি সেই সম্পাদকটিতে ছিটকে পড়েন তবে র্যাম যুক্ত করুন))
যদি আপনার সমস্ত পরামিতি সমস্ত পূর্ণসংখ্যার হয় এবং আপনার যদি 1024 এর বেশি ইনপুট প্যারামিটার থাকে তবে রেডিক্স সাজানোর কাজটি সর্বদা দ্রুত হয়।
কেন?
Complexity of radix sort = max number of digits x number of input parameters.
Complexity of quick sort = log(number of input parameters) x number of input parameters
সুতরাং Radix সাজানোর দ্রুত হয় যখন
log(n)> max num of digits
জাভাতে সর্বোচ্চ পূর্ণসংখ্যা 2147483647 Which যা 10 সংখ্যা দীর্ঘ digit
সুতরাং Radix বাছাই সর্বদা দ্রুত হয়
log(n)> 10
অতএব র্যাডিক্স বাছাই সর্বদা দ্রুত হয়
n>1024