Radix বাছাই কেন প্রায়শই ব্যবহার করা হয় না?


31

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


2
এখানে দেখুন: en.wikedia.org/wiki/Radix_sort# দক্ষতা ও (ন) এবং এটি ও (এন * লগ (এন)) এর চেয়ে ভাল নাও হতে পারে।
হতাশ

2
রেডিক্স সাজানোর ঘন ঘন নরম রিয়েল-টাইম সিস্টেমে যেমন গেমস হিসাবে ব্যবহৃত হয়। একটি অ্যালগোরিদম অন্যটিকে ছাড়িয়ে যায় বা না, যথারীতি সমস্যাটির সমস্ত পরামিতিগুলির উপর নির্ভর করে, কেবল জটিলতা আবদ্ধ নয়
awdz9nld

@ ফ্রিস্ট্রেটড উইথফর্মস ডিজাইনার সম্ভবত উইকি বদল হয়েছে? আমি আর log n লগ (এন) এর রেফারেন্সটি দেখতে পাচ্ছি না,
FWIW

বুস্টের এর একটি (স্থান বৈকল্পিক) রয়েছে: boost.org/doc/libs/1_62_0/libs/sort/doc/html/sort/sort_hpp.html তবে হ্যাঁ, আমি মনে করি লোকেরা এটি জানেন না যে এটি বিদ্যমান ... হয় বা তারা সকলেই "স্ট্যান্ডার্ড" বাছাই করা অ্যালগরিদম ব্যবহার করে যা যাই হোক না কেন, কাঠামোগত নির্মাতারা এখনও "জেনেরিক" ধরণগুলি পুনরায় ব্যবহার করার ঝোঁক রাখেন যা ততটা দক্ষ নয় ... সম্ভবত তারা ইনট বাছাইয়ের দিকে মনোনিবেশ করেন না সাধারণত, যেহেতু এটি বিরল ব্যবহারের ক্ষেত্রে?
রজারডপ্যাক

উত্তর:


38

র‌্যাডিক্স সাজানোর থেকে পৃথক, কুইকসোর্ট সর্বজনীন, অন্যদিকে রেডিক্স সারণি দৈর্ঘ্যের পূর্ণসংখ্য কীগুলির জন্য কেবল কার্যকর।

এছাড়াও আপনাকে বুঝতে হবে যে ও (এফ (এন)) এর অর্থ হ'ল কে * ফ (এন) এর ক্রম, যেখানে কে কিছু নির্বিচারে ধ্রুবক। র‌্যাডিক্স বাছাইয়ের জন্য এই কে বেশ বড় হতে পারে (সংখ্যায় বিট সংখ্যা ন্যূনতম ক্রম অনুসারে সাজানো), অন্যদিকে কুইকোর্টে সব ধরণের অ্যালগরিদম এবং এন * লগ (এন) এর গড় জটিলতার মধ্যে সবচেয়ে কম কে রয়েছে। সুতরাং বাস্তব জীবনের দৃশ্যে কুইকোর্টটি র‍্যাডিক্স বাছাইয়ের তুলনায় খুব দ্রুত হবে।


বর্ণিত জটিলতার বিষয়ে দ্রষ্টব্য: যদিও (এলএসডি) র‌্যাডিক্স সাজ্টে ও (এন * কে) এর জটিলতা রয়েছে, তবে এই ধ্রুবকটি সাধারণত ছোট হয়, সাধারণত এমনটি বেছে নেওয়া হয় (2 ^ (ডাব্লু / কে)) * সি এল 1 এর সাথে ফিট করে, যেখানে সি কাউন্টারের বাইটের আকার, ডাব্লু কীটি বাছাই করা হচ্ছে। বেশিরভাগ বাস্তবায়ন x86- এ 32-বিট শব্দের জন্য কে = [3,4] চয়ন করে। টেম্পোরাল সুসংহততা (কাছাকাছি বাছাই করা) কে কাজে লাগাতে কে কে অভিযোজিতও করা যেতে পারে, কারণ প্রতিটি রেডিক্স পৃথকভাবে বাছাই করা হয়।
awdz9nld

11
সর্বজনীনতার উপর দ্রষ্টব্য: রেডিক্স বাছাই ভাসমান-পয়েন্ট কীগুলির পাশাপাশি চলক দৈর্ঘ্যের পূর্ণসংখ্য কীগুলিতে পরিচালনা করতে সম্পূর্ণ সক্ষম
awdz9nld

20

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

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

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


আসলে, কুইকসোর্টের বাম এবং ডান পার্টিশনগুলিতে পুনরাবৃত্ত কলগুলির O(n^2)কারণে সবচেয়ে খারাপ ক্ষেত্রে মেমরির প্রয়োজন n। যদি বাস্তবায়নের ক্ষেত্রে লেজ পুনরাবৃত্তি অপ্টিমাইজেশন ব্যবহার করা হয় তবে এটিকে ঠিক কম করা যেতে পারে O(n)কারণ সঠিক পার্টিশনে কল করার জন্য অতিরিক্ত স্থানের প্রয়োজন হবে না। ( en.wikedia.org/wiki/Quicksort#Space_complexity )
কেওস

আপনার কেবলমাত্র S(n) \in O(n)রেডিক্সের সাথে বাছাইয়ের জন্য স্থান প্রয়োজন , যেমন হিপ বা দ্রুত সাজানোর জন্য একই।
ভেলদা

@ স্প্লিন্টারফচোস সম্ভবত উইকি বদলেছে? এটি n^2আর O(log n)
কুইকোর্টের

আমি মনে করি না এটি "অনেক" বেশি স্মৃতি, সম্ভবত 2 * এন (ঠিক আছে এটি অনেক বেশি তবে সম্ভবত অসম্ভব) না? এবং বালতিগুলি এত ছোট (ধরে নিলে আপনি বাইটগুলিতে বিভাজন করছেন এবং পুনরাবৃত্তি করছেন) যা এটি ক্যাশে ভালভাবে ফিট করতে পারে?
রজারডপ্যাক

5

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

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


র‌্যাডিক্স সাজানোর যেকোন পরিসরে পূর্ণসংখ্যা (বা স্ট্রিং)
হ্যান্ডসেল

4

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

একটি মৌলিক উদাহরণটি অনুসন্ধান বা মধ্য বিভাজনের অংশ হিসাবে নির্দিষ্ট মাত্রার দ্বারা রেডিক্স বাছাই করা পয়েন্ট বা কাকতালীয় বিন্দু, গভীরতা বাছাইকারী টুকরোগুলি সনাক্ত করার একটি দ্রুত উপায় বা আরও ক্যাশে-বান্ধব অ্যাক্সেস সরবরাহ করতে একাধিক লুপগুলিতে ব্যবহৃত সূচকগুলির একটি অ্যারে বাছাই করে রেডিক্সকে নির্দেশ করে 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


1
এলাকার অভিজ্ঞতার সাথে মানুষের মতামত শুনে সর্বদা সুন্দর।
ফ্রাঙ্ক হিলেমান

এমটি_টি মাল্টি থ্রেডেড বাস্তবায়নগুলি প্রদর্শিত হচ্ছে: সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেক্সঞ্জ

1

আরও একটি কারণ: এই দিনগুলিকে বাছাই করা সাধারণত ব্যবহারকারী সরবরাহকারী বাছাই করা রুটিনের সাথে সংযোজক সরবরাহকারী সাজানো যুক্তির সাথে সংযুক্ত থাকে। র‌্যাডিক্স সাজানোর সাহায্যে এটি যথেষ্ট জটিল হয়ে উঠবে এবং আরও খারাপ হয়ে যায় যখন ভাসিয়েবল দৈর্ঘ্যের একাধিক কী অনুসারে বাছাই করা রুটিন কাজ করে। (বলুন, নাম এবং জন্ম তারিখ।)

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

এই দিনগুলিতে এ জাতীয় বড় ডেটা ইস্যুগুলি চালানো খুব বেশি শক্ত, আমি সম্ভবত এর আগে আর কখনও লিখব না। (এই দিনগুলিতে যদি আমি একই ডেটাটির মুখোমুখি হতাম তবে আমি কেবল 64৪-বিট ওএস নির্দিষ্ট করে দেব, আপনি যদি সেই সম্পাদকটিতে ছিটকে পড়েন তবে র‌্যাম যুক্ত করুন))


মাঝে মাঝে উল্লিখিত র‌্যাডিক্স সাজানোর ক্ষেত্রে অন্যতম অসুবিধাগুলি বিবেচনা করে আকর্ষণীয় হ'ল "এটি আরও বেশি জায়গা নেয়"। এখনও এটিকে ঘিরে আমার মাথা মোড়ানোর চেষ্টা করা হচ্ছে ...
রজারডপ্যাক

1
@ আরগারডপ্যাক এটি নয় যে আমার পদ্ধতির কম স্থান ব্যবহার হয়েছিল, এটি ডেটাতে অ্যাক্সেস কম ব্যবহার করে। কোড এবং k৪ কেবির স্ট্রাকচার সীমা সহ মোট মেমরি ব্যবহারের ১ under এমবি এর কিছুটা কমপ্লাইলার সীমা (এটি ডস সুরক্ষিত মোড ছিল, উইন্ডোজ নয়) নিয়ে কাজ করার সময় আমি একটি গিগাবাইটের আশেপাশের একটি ফাইল বাছাই করছিলাম।
লরেন পেচটেল

-1

যদি আপনার সমস্ত পরামিতি সমস্ত পূর্ণসংখ্যার হয় এবং আপনার যদি 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


বাস্তবায়নের বিশদগুলিতে লুকানো ধ্রুবক রয়েছে, তবে মূলত আপনি বলছেন "বৃহত্তর ইনপুট র‌্যাডিক্স সাজানোর জন্য দ্রুততর" যা ... হওয়া উচিত! এটির জন্য ব্যবহারের ক্ষেত্রে সন্ধান করা কেবল শক্ত but তবে আপনি যখন পারেন ...
রোজারডপ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.