কোনটি বাছাই করা অ্যালগরিদম বেশিরভাগ সাজানো ডেটাতে সেরা কাজ করে?
কোনটি বাছাই করা অ্যালগরিদম বেশিরভাগ সাজানো ডেটাতে সেরা কাজ করে?
উত্তর:
অ্যানিমেটেড gifs দেখার অত্যন্ত বৈজ্ঞানিক পদ্ধতির উপর ভিত্তি করে আমি বলব সন্নিবেশ এবং বুদ্বুদ প্রকারগুলি ভাল প্রার্থী।
কেবলমাত্র কয়েকটি আইটেম => সংক্ষেপণ সর্ট
আইটেমগুলি বেশিরভাগই ইতিমধ্যে বাছাই করা হয় => অন্তর্ভুক্তকরণ সর্ট
সবচেয়ে খারাপ পরিস্থিতি সম্পর্কে উদ্বেগিত => হিপ সার্ট
একটি ভাল গড়-কেস ফলাফল => QUICKSORT- এ আগ্রহী
আইটেমগুলি ঘন মহাবিশ্ব => বুকেট সর্ট থেকে আঁকা
যথাসম্ভব কম কোড লেখার আকাঙ্ক্ষা => অন্তর্ভুক্তকরণ সর্ট
টিমসোর্ট হ'ল "একটি অভিযোজিত, স্থিতিশীল, প্রাকৃতিক সংশ্লেষ" সহ " বহু ধরণের আংশিক অর্ডার করা অ্যারেগুলিতে অতিপ্রাকৃত কর্মক্ষমতা (এলজি (এন! এর চেয়ে কম প্রয়োজন, এবং N-1 হিসাবে কম)"। পাইথনের অন্তর্নির্মিতsort()
এই অ্যালগরিদমটি কিছু সময়ের জন্য ব্যবহার করেছে, দৃশ্যত ভাল ফলাফল সহ। এটি বিশেষত ইনপুটটিতে আংশিকভাবে সাজানো উপসর্গগুলি সনাক্ত এবং সুবিধা গ্রহণের জন্য ডিজাইন করা হয়েছে, যা প্রায়শই বাস্তব ডেটাসেটে ঘটে। সত্যিকারের বিশ্বে এটি প্রায়শই ঘটে যে তালিকার আইটেমগুলিতে অদলবদলের তুলনায় তুলনাগুলি অনেক বেশি ব্যয়বহুল, যেহেতু একটি সাধারণত পয়েন্টারগুলিকে অদলবদল করে, যা প্রায়শই টাইমসোর্টকে একটি সেরা পছন্দ করে তোলে। তবে, যদি আপনি জানেন যে আপনার তুলনাগুলি সবসময় খুব সস্তা হয় (উদাহরণস্বরূপ, 32-বিট ইন্টিজারগুলি সাজানোর জন্য খেলনা প্রোগ্রাম লিখতে), তবে অন্যান্য অ্যালগরিদমগুলি সম্ভবত আরও ভাল সম্পাদন করার সম্ভাবনা রয়েছে। টাইমসোর্টের সুবিধা নেওয়ার সবচেয়ে সহজ উপায়টি অবশ্যই পাইথন ব্যবহার করা, তবে পাইথন যেহেতু ওপেন সোর্স তাই আপনি কোডও ধার নিতে পারবেন। পর্যায়ক্রমে, উপরের বর্ণনায় আপনার নিজের প্রয়োগটি লেখার জন্য পর্যাপ্ত বিবরণের চেয়ে বেশি রয়েছে।
lg(n!)
প্রায় সাজানো অ্যারেতে তুলনামূলক তুলনায় টাইমসোর্টটি অনেক দ্রুত O(n)
! | @behrooz: কোন তুলনা সাজানোর চেয়ে ভাল গড় ক্ষেত্রে থাকতে পারে O(n log n)
, এবং lg(n!)
হয় O(n log n)
। তাই টাইমসোর্টের সবচেয়ে খারাপ পরিস্থিতি অনায়াসেই অন্য কোনও তুলনা বাছাইয়ের চেয়ে খারাপ নয়। তদুপরি এর সর্বোত্তম কেস অন্য তুলনা বাছাইয়ের চেয়ে ভাল বা সমান।
নিম্নলিখিত আচরণের সাথে সন্নিবেশ সাজান:
k
স্লটগুলির প্রতিটি উপাদানের জন্য 1..n
, প্রথমে পরীক্ষা করে দেখুন el[k] >= el[k-1]
। যদি তা হয় তবে পরবর্তী উপাদানটিতে যান। (স্পষ্টতই প্রথম উপাদানটি এড়িয়ে যান))1..k-1
হয় তবে সন্নিবেশের অবস্থানটি নির্ধারণ করতে উপাদানগুলিতে বাইনারি-অনুসন্ধান ব্যবহার করুন , তারপরে উপাদানগুলি স্কুট করুন। (আপনি এই শুধুমাত্র যদি কি হতে পারে k>T
যেখানে T
; ছোট কিছু থ্রেশহোল্ড মান k
এই Overkill হয়।)এই পদ্ধতিটি কমপক্ষে তুলনা করে।
অন্তর্মুখী সাজানোর চেষ্টা করুন। http://en.wikipedia.org/wiki/Introsort
এটি কুইকোর্ট ভিত্তিক, তবে এটি প্রায় বাছাই করা তালিকার জন্য কুইকোর্টের সবচেয়ে খারাপ ক্ষেত্রে আচরণটি এড়ায়।
কৌশলটি হ'ল এই বাছাই-অ্যালগরিদমগুলি এমন কেসগুলি সনাক্ত করে যেখানে কুইকোর্টটি সবচেয়ে খারাপ ক্ষেত্রে মোডে যায় এবং স্যুইচ বা মার্জ সাজানোর দিকে স্যুইচ করে। কিছু বাছাই করা পার্টিশন পদ্ধতি দ্বারা প্রায় বাছাই করা পার্টিশন সনাক্ত করা যায় এবং সন্নিবেশ সাজানোর মাধ্যমে ছোট পার্টিশন পরিচালনা করা হয়।
আরও বেশি কোড এবং জটিলতার জন্য আপনি সমস্ত বড় বাছাইকরণ অ্যালগরিদমগুলির মধ্যে সেরা পান। এবং আপনি নিশ্চিত হতে পারেন যে আপনি কখনই আপনার ডেটা দেখতে কেমন তা বিবেচনা করে সবচেয়ে খারাপ ক্ষেত্রে আচরণ করবেন না।
আপনি যদি কোনও সি ++ প্রোগ্রামার হন তবে আপনার এসটিডি :: বাছাই অ্যালগরিদমটি পরীক্ষা করে দেখুন। এটি ইতিমধ্যে অভ্যন্তরীণভাবে অন্তর্মুখী বাছাই করতে পারে।
স্প্লেসর্ট স্প্লে গাছের উপর ভিত্তি করে একটি অস্পষ্ট বাছাই পদ্ধতি , এক ধরণের অভিযোজিত বাইনারি গাছের । স্প্লেসর্ট কেবল আংশিকভাবে বাছাই করা ডেটার জন্যই ভাল নয়, তবে আংশিকভাবে বিপরীত-সাজানো ডেটা বা সত্যই যে কোনও উপায়ে যে কোনও ধরণের প্রাক-বিদ্যমান ক্রম রয়েছে। এটি সাধারণ ক্ষেত্রে ও (এনলগন) এবং ও (এন) ক্ষেত্রে ডেটাটি কোনওভাবে সাজানো হয় (ফরোয়ার্ড, বিপরীত, অঙ্গ-পাইপ ইত্যাদি),
সন্নিবেশ সাজানোর ক্ষেত্রে এটির দুর্দান্ত সুবিধাটি হ'ল ডেটি একেবারে সাজানো না গেলে এটি ও (N ^ 2) আচরণে ফিরে আসে না, সুতরাং আপনার ব্যবহারের আগে ডেটা আংশিকভাবে সাজানো হয়েছে তা আপনার একেবারে নিশ্চিত হওয়া উচিত নয় data ।
এর অসুবিধা হ'ল স্প্লে গাছের কাঠামোর অতিরিক্ত স্থান ওভারহেড, সেইসাথে স্প্লে গাছটি তৈরি ও ধ্বংস করার জন্য প্রয়োজনীয় সময়। তবে আপনি যে ডেটা এবং প্রাক-বাছাইয়ের প্রত্যাশা করেছেন তার পরিমাণের উপর নির্ভর করে গতি বাড়ানোর জন্য ওভারহেড উপযুক্ত হতে পারে।
স্প্লেসোর্ট সম্পর্কিত একটি কাগজ সফ্টওয়্যার - অনুশীলন ও অভিজ্ঞতাতে প্রকাশিত হয়েছিল।
ডিজকস্ট্রার স্মুডসোর্টটি ইতিমধ্যে সাজানো ডেটাতে দুর্দান্ত ধরণের। এটি হিপসোর্ট বৈকল্পিক যা ও (এন এলজি এন) সবচেয়ে খারাপ ক্ষেত্রে এবং ও (এন) সেরা ক্ষেত্রে চলে। আমি একটি বিশ্লেষণ লিখেছি অ্যালগরিদমের , যদি আপনি আগ্রহী হন তবে এটি কীভাবে কাজ করে।
প্রাকৃতিক সংশ্লেষ এটির জন্য আর একটি ভাল ভাল - এটি নীচের অংশে একত্রীকরণের বৈকল্পিক যা ইনপুটটিকে একাধিক বিভিন্ন সাজানো রেঞ্জের সংমিশ্রণ হিসাবে বিবেচনা করে কাজ করে, তারপরে মার্জ অ্যালগরিদমকে তাদের সাথে যুক্ত হওয়ার জন্য ব্যবহার করে। সমস্ত ইনপুট পরিসর বাছাই না করা পর্যন্ত আপনি এই প্রক্রিয়াটি পুনরাবৃত্তি করুন। এটি ইতিমধ্যে ও (এন) সময়ে চলে যদি ডেটা ইতিমধ্যে সাজানো হয় এবং ও (এন এলজি এন) সবচেয়ে খারাপ ক্ষেত্রে- এটি অত্যন্ত মার্জিত, যদিও অনুশীলনে এটি টিমসোর্ট বা স্মুডসোর্টের মতো কিছু অন্যান্য অভিযোজিত ধরণের মতো ভাল নয়।
সন্নিবেশ সাজানোর সময় লাগে O (n + বিপর্যয়ের সংখ্যা)।
একটি বিপর্যয় একজোড়া হয় (i, j)
যেমন যেi < j && a[i] > a[j]
। তা হল, একটি আউট অফ-অর্ডার জুটি।
"প্রায় বাছাই করা" হওয়ার একটি পরিমাপ হ'ল বিপর্যয়ের সংখ্যা --- কেউ কিছু বিপর্যয় সহ ডেটা বোঝাতে "প্রায় বাছাই করা ডেটা" নিতে পারে। যদি কেউ জেনে থাকে যে বিবর্তনের সংখ্যাটি লিনিয়ার হতে পারে (উদাহরণস্বরূপ, আপনি কেবলমাত্র সাজানো তালিকায় ও (1) উপাদান যুক্ত করেছেন), সন্নিবেশ সাজানোর ক্ষেত্রে ও (এন) সময় লাগে।
যেমনটি সবাই বলেছে, নিষ্পাপ কুইকোর্টের বিষয়ে সতর্ক থাকুন - এতে বাছাই করা বা প্রায় বাছাই করা ডেটাতে O (N ^ 2) পারফরম্যান্স থাকতে পারে। তবুও, পিভট নির্বাচনের জন্য উপযুক্ত অ্যালগরিদম সহ (যেকোন এলোমেলো বা মাঝারি-তিনটি - কুইকোর্টের জন্য একটি পিভট চয়ন করা দেখুন ) এর , কুইকোর্ট এখনও সান্নিধ্যে কাজ করবে।
সাধারণভাবে, সারণি সারণির মতো অ্যালগরিদমগুলি বেছে নেওয়ার ক্ষেত্রে সমস্যাটি সিদ্ধান্ত নেওয়ার সময় যখন ডেটা যথেষ্ট পরিমাণে অর্ডারের বাইরে থাকে যে কুইকসোর্ট সত্যিই দ্রুত হবে।
আমি এখানে সমস্ত উত্তর থাকার ভান করব না, কারণ আমি মনে করি যে আসল উত্তরগুলি পেতে আলগোরিদিমগুলি কোডিং করতে এবং প্রতিনিধি ডেটার নমুনাগুলির বিরুদ্ধে সেগুলি লেখার প্রয়োজন হতে পারে। তবে আমি সারা সন্ধ্যা এই প্রশ্নটি নিয়ে ভাবছিলাম, এবং এখন পর্যন্ত আমার কাছে যা ঘটেছিল তা এখানেই রয়েছে এবং কোনটি কোথায় সবচেয়ে ভাল কাজ করে সে সম্পর্কে কিছু অনুমান।
N কে আইটেমের মোট সংখ্যা হতে দিন, M-এর বাইরে থাকা অর্ডার।
বুদ্বুদ সাজানোর জন্য সমস্ত এন আইটেমগুলিতে 2 * এম + 1 পাসের মতো কিছু তৈরি করতে হবে। এম যদি খুব ছোট হয় (0, 1, 2?), আমার মনে হয় এটি মারতে খুব কঠিন হবে।
যদি এম ছোট হয় (লগ এন এর চেয়ে কম বলুন), সন্নিবেশ সাজানোর দুর্দান্ত গড় পারফরম্যান্স থাকবে। যাইহোক, যদি এমন কোন কৌশল না দেখি যা আমি না দেখি তবে এটির মধ্যে খুব খারাপ পরিস্থিতি রয়েছে। (ঠিক আছে? যদি ক্রমে শেষ আইটেমটি প্রথম আসে, তবে আপনাকে প্রতিটি আইটেম sertোকাতে হবে, যতদূর আমি দেখতে পাচ্ছি, যা কার্যকারিতাটি মেরে ফেলবে)) আমি অনুমান করছি যে এর জন্য আরও একটি নির্ভরযোগ্য বাছাই করা অ্যালগরিদম আছে out কেস, কিন্তু আমি জানি না এটি কী।
যদি এম বড় হয় (লগ এন এর চেয়ে সমান বা দুর্দান্ত বলুন), অন্তঃনির্দেশক সাজান প্রায় অবশ্যই সেরা।
এই সমস্ত ব্যতীত: যদি আপনি যদি আগেই অবধি জানেন যে কোন উপাদানগুলি অনুসৃত নয়, তবে আপনার সেরা বাজি হ'ল items আইটেমগুলি টেনে আনা, অন্তর্মুখী বাছাই করে বাছাই করা এবং দুটি সাজানো তালিকাগুলি এক সাথে সাজানো তালিকায় একত্রীকরণ করা। কোন আইটেমগুলি ক্রমহীন রয়েছে তা যদি আপনি তাড়াতাড়ি বুঝতে পারতেন তবে এটিও একটি ভাল সাধারণ সমাধান হতে পারে - তবে আমি এটি করার কোনও সহজ উপায় বের করতে সক্ষম হইনি।
আরও চিন্তাভাবনা (রাতারাতি): যদি এম + 1 <এন / এম হয়, তবে আপনি ক্রমানুসারে একটানা N / M রানের সন্ধানের জন্য তালিকাটি স্ক্যান করতে পারেন এবং তারপরে খুঁজে বের করার জন্য উভয় দিকেই রানটি প্রসারিত করুন can -অর্ডার আইটেম। এটি সর্বাধিক 2N তুলনা করবে। তারপরে আপনি সাজানো আইটেমগুলি বাছাই করতে পারেন এবং দুটি তালিকায় বাছাই করা মার্জ করতে পারেন। মোট তুলনা 4N + এম লগ 2 (এম) এর মতো কিছু থেকে কম হওয়া উচিত, যা কোনও অ-বিশেষায়িত বাছাই করার রুটিনকে পরাজিত করতে পারে বলে আমি মনে করি। (এমনকি আরও ভেবেছিলেন: এটি আমার ভাবনার চেয়ে কৌশলযুক্ত, তবে আমি এখনও মনে করি এটি যথাযথভাবে সম্ভব))
প্রশ্নের অন্য ব্যাখ্যাটি হ'ল প্রচুর-অ-অর্ডার আইটেম থাকতে পারে তবে তালিকায় তাদের কোথায় থাকা উচিত সেগুলির খুব কাছে। (একটি সাজানো তালিকা দিয়ে শুরু করে এবং তারপরে যে জিনিসটি আসে তার সাথে অন্য আইটেমকে অদলবলে কল্পনা করুন) সেক্ষেত্রে আমি মনে করি বুদ্বুদ সাজানো খুব ভাল সম্পাদন করে - আমি মনে করি যে কোনও আইটেম স্থানের বাইরে পাসের সংখ্যা আনুপাতিক হবে) হয়। সন্নিবেশ সাজানোর কাজটি খারাপভাবে কাজ করবে, কারণ প্রতিটি আদেশের বাইরে আইটেম একটি সন্নিবেশকে ট্রিগার করবে। আমি অন্তর্মুখী বাছাই বা এর মতো কিছু খুব ভালভাবে কাজ করবে বলে সন্দেহ করি।
অ্যালগরিদম বাছাই করার জন্য যদি আপনার নির্দিষ্ট প্রয়োগের প্রয়োজন হয়, ডেটা স্ট্রাকচার বা উপরের কোনও লিঙ্ক রয়েছে এমন যে কোনও কিছু, আমি আপনাকে সুপারিশ করতে পারি কোডপ্লেক্সে "ডেটা স্ট্রাকচারস এবং অ্যালগরিদম" প্রকল্পটি ?
চাকাটিকে পুনরায় উদ্ভাবন না করে এতে আপনার প্রয়োজনীয় সমস্ত কিছু থাকবে।
শুধু আমার সামান্য লবণ দানা।
উত্তরের জন্য এই উদ্দেশ্যটির জন্য অ্যালগোরিদমকে বাছাই করার এই দুর্দান্ত সংগ্রহটি জিনোম বাছাইয়ের অভাব বলে মনে হচ্ছে , এটিও উপযুক্ত হবে এবং সম্ভবত কমপক্ষে বাস্তবায়ন প্রচেষ্টা প্রয়োজন।
বুদ্বুদ-বাছাই (বা আরও নিরাপদ, দ্বি-নির্দেশমূলক বুদ্বুদ সাজানোর) সম্ভবত বেশিরভাগ বাছাই করা তালিকার জন্য আদর্শ, যদিও আমি একটি টুইড কং-সাজানোর বাজি ধরছি (অনেক কম প্রাথমিক শূন্যের আকার সহ) তালিকাটি দ্রুত ব্যর্থ হলে 'কিছুটা দ্রুত হবে টি পুরোপুরিভাবে সাজানো s চিরুনি বাছাই বুদ্বুদ সাজানোর অবক্ষয়।
ভাল এটি ব্যবহারের ক্ষেত্রে নির্ভর করে। কোন উপাদানগুলি পরিবর্তন করা হয়েছে তা যদি আপনি জানেন তবে সরিয়ে ফেলুন এবং সন্নিবেশ করানো আমার পক্ষে যতটা উদাসীন তা সেরা ক্ষেত্রে হবে।
বুদ্বুদ বাছাই অবশ্যই বিজয়ী রাডার উপরের একটি সন্নিবেশ সাজানোর হবে।
কুইকসোর্ট থেকে দূরে থাকুন - প্রাক-সাজানো ডেটার জন্য এটি অত্যন্ত অদক্ষ। সন্নিবেশ সাজানোর কাজটি যথাসম্ভব কয়েকটি মান সরিয়ে প্রায় সাজানো ডেটা ভালভাবে পরিচালনা করে।