কুইকসোর্ট পার্টিশন: হোয়ের বনাম লোমুটো


82

কারমেনে এখানে দুটি কুইকোর্টের পার্টিশন পদ্ধতি উল্লেখ করা হয়েছে:

Hoare-Partition(A, p, r)
x = A[p]
i = p - 1
j = r + 1
while true
    repeat
        j = j - 1
    until A[j] <= x
    repeat
        i = i + 1
    until A[i] >= x
    if i < j
        swap( A[i], A[j] )
    else
        return j

এবং:

Lomuto-Partition(A, p, r)
x = A[r]
i = p - 1
for j = p to r - 1
    if A[j] <= x
        i = i + 1
        swap( A[i], A[j] )
swap( A[i +1], A[r] )
return i + 1

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

অন্য কোন বিশেষ ক্ষেত্রে একটি পার্টিশন পদ্ধতি অপরের চেয়ে উল্লেখযোগ্যভাবে উন্নত করে?


2
লোমেরো হোয়ারের চেয়ে ভাল এমন কোন পরিস্থিতিতে আমি ভাবতে পারি না । দেখে মনে হচ্ছে লোমুটো যখনই যখনই অতিরিক্ত অদলবদল করে A[i+1] <= x। একটি সাজানো অ্যারেতে (এবং যুক্তিসঙ্গতভাবে বেছে নেওয়া পিভট দেওয়া হয়) হোয়ের প্রায় কোনও অদলবদল করে না এবং লোমুটো একটি টন করে না (একবার জে যথেষ্ট পরিমাণে ছোট হয়ে যায় তখন সমস্ত কিছু A[j] <= x) আমি কী অনুপস্থিত?
লজিক

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

2
মনে রাখবেন যে এই দুটি অ্যালগরিদম একই কাজ করে না। হোয়ারের অ্যালগরিদম শেষে, পাইভটি এটি চূড়ান্ত স্থানে নেই। swap(A[p], A[j])উভয়ের জন্য একই আচরণ পেতে আপনি হোয়ারের শেষে একটি যুক্ত করতে পারেন ।
অরুলিয়ান ওমস

হোয়ারের বিভাজনগুলির i < j2 পুনরাবৃত্তি লুপগুলিও আপনার পরীক্ষা করা উচিত ।
অরুলিয়ান ওমস

@ অরলিওনওমস কোডটি সরাসরি বই থেকে অনুলিপি করা হয়েছে।
রবার্ট এস বার্নেস

উত্তর:


92

প্যাডোগোগিকাল ডাইমেনশন

এর সরলতার কারণে লোমুতোর বিভাজন পদ্ধতি কার্যকর করা সহজ হতে পারে। বাছাই করার বিষয়ে জন বেন্টলির প্রোগ্রামিং পার্লে একটি দুর্দান্ত উপাখ্যান রয়েছে :

“কুইকোর্টের বেশিরভাগ আলোচনায় দুটি আগমন সূচকের উপর ভিত্তি করে একটি বিভাজন স্কিম ব্যবহার করা হয় [...] [অর্থাত্ হোয়ারের]। যদিও এই স্কিমটির প্রাথমিক ধারণাটি সোজা, তবুও আমি বিশদটি সবসময়ই জটিল বলে খুঁজে পেয়েছি - আমি একবার দু'দিনের একটি ভাল অংশ একটি সংক্ষিপ্ত পার্টিশনের লুপে লুকিয়ে থাকা বাগের পিছনে পিছনে তাড়া করে কাটিয়েছি। প্রাথমিক খসড়ার পাঠক অভিযোগ করেছিলেন যে স্ট্যান্ডার্ড দ্বি-সূচক পদ্ধতিটি আসলে লোমুতোর চেয়ে সহজতর এবং তার বক্তব্যটি তৈরি করার জন্য কিছু কোড স্কেচ করেছে; আমি দুটি বাগ পেয়েছি দেখাশোনা বন্ধ করে দিয়েছি। "

পারফরম্যান্স মাত্রা

ব্যবহারিক ব্যবহারের জন্য, বাস্তবায়নের স্বাচ্ছন্দ্য দক্ষতার জন্য ত্যাগ করা হতে পারে। তাত্ত্বিক ভিত্তিতে, আমরা পারফরম্যান্সের তুলনা করার জন্য উপাদানগুলির তুলনা এবং অদলবদলের সংখ্যা নির্ধারণ করতে পারি। অতিরিক্তভাবে, আসল চলমান সময় অন্যান্য বিষয়গুলির দ্বারা প্রভাবিত হবে, যেমন ক্যাশিং কর্মক্ষমতা এবং শাখার ভুল p

নীচে যেমন দেখানো হয়েছে, অ্যালগরিদমগুলি অদলবদলের সংখ্যা বাদ দিয়ে এলোমেলো অনুক্রমের সাথে খুব অনুরূপ আচরণ করে । সেখানে হোমেরে তিনবারের মতো লোমুতো দরকার !

তুলনা সংখ্যা

উভয় পদ্ধতি ব্যবহার করে বাস্তবায়ন করা যায় তুলনা দৈর্ঘ্যের একটি অ্যারের পার্টিশন করার । এটি মূলত সর্বোত্তম, যেহেতু আমাদের প্রতিটি উপাদানকে কোথায় রাখা উচিত তা স্থির করার জন্য পাইভটের সাথে তুলনা করতে হবে।n1n

অদলবদলের সংখ্যা

অ্যারেতে থাকা উপাদানগুলির উপর নির্ভর করে অ্যালগরিদমের জন্য অদলবদলের সংখ্যা এলোমেলো। যদি আমরা এলোমেলোভাবে অনুমানের অনুমান করি , অর্থাৎ সমস্ত উপাদান পৃথক এবং উপাদানগুলির প্রতিটি ক্রমানুসারে সমান সম্ভাবনা থাকে তবে আমরা অদলবদলের প্রত্যাশিত সংখ্যা বিশ্লেষণ করতে পারি ।

শুধু আপেক্ষিক অর্ডার সংখ্যা, আমরা ধরে নিই যে উপাদান সংখ্যা । এটি নীচের আলোচনাকে আরও সহজ করে তোলে যেহেতু কোনও উপাদানের পদমর্যাদা এবং এর মান সমান হয়।1,,n

লোমুতোর পদ্ধতি

সূচী ভেরিয়েবল পুরো অ্যারে স্ক্যান করে এবং যখনই আমরা পাইভট চেয়ে ছোট উপাদান পাই, আমরা একটি অদলবদল করি। উপাদানের মধ্যে , ঠিক বেশী চেয়ে ছোট হয় , তাই আমরা পেতে অদলবদল যদি পিভট হয় ।jA[j]x1,,nx1xx1x

সামগ্রিক প্রত্যাশা তারপরে সমস্ত পিভটকে গড়ে গড়ে তোলে। Value প্রতিটি মান পিভট হওয়ার সমান সম্ভাবনা (যথা সহ ), তাই আমাদের কাছে{1,,n}1n

1nx=1n(x1)=n212.

গড়ে অদলবদল দৈর্ঘ্যের একটি অ্যারের পার্টিশন করার Lomuto এর পদ্ধতি সঙ্গে।n

Hoare এর পদ্ধতি

এখানে, বিশ্লেষণটি কিছুটা জটিল: এমনকি পাইভট স্থির করেও অদলবদলের সংখ্যা এলোমেলো থেকে যায়।x

আরো অবিকল: সূচকের এবং একে অপরের যতক্ষণ না তারা ক্রস, যা প্রতি রান সবসময় ঘটবে (হোয়ারে এর পার্টিশন আলগোরিদিম শুদ্ধি দ্বারা!)। এটি কার্যকরভাবে অ্যারেটিকে দুটি অংশে বিভক্ত করে: একটি বাম অংশ যা দ্বারা স্ক্যান করে এবং ডান অংশটি দ্বারা স্ক্যান করে ।ijxij

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

এক দেখাতে পারেন যে, এই জোড়া সংখ্যা hypergeometrically বিতরণ করা: জন্য বৃহৎ উপাদান আমরা এলোমেলোভাবে অ্যারের মধ্যে তাদের অবস্থানের আঁকা এবং -এ অবস্থানের বাম অংশ তদনুসারে, জোড়া প্রত্যাশিত সংখ্যা যে দেওয়া পিভট হয় ।Hyp(n1,nx,x1)nxx1(nx)(x1)/(n1)x

অবশেষে, হোয়েরের বিভাজনের জন্য সামগ্রিকভাবে প্রত্যাশিত অদলবদলগুলি পেতে আমরা সমস্ত পাইভট মানগুলির উপরে আবার গড়:

1nx=1n(nx)(x1)n1=n613.

(আরও বিস্তারিত বিবরণ আমার মাস্টারের থিসিস , পৃষ্ঠা 29 এ পাওয়া যাবে 29)

মেমরি অ্যাক্সেস প্যাটার্ন

উভয় অ্যালগরিদম অ্যারেতে দুটি পয়েন্টার ব্যবহার করে যা এটি ক্রমানুসারে স্ক্যান করে । অতএব উভয়ই প্রায় অনুকূল রিট ক্যাচিং আচরণ করে।

সমান উপাদান এবং ইতিমধ্যে সাজানো তালিকাগুলি

ভ্যান্ডারিং লজিকের দ্বারা ইতিমধ্যে উল্লিখিত হিসাবে, এলোগরিদমের কার্যকারিতা এলোমেলোভাবে অনুমতি ছাড়াই নয় এমন তালিকার জন্য আরও মারাত্মকভাবে পৃথক।

ইতিমধ্যে বাছাই করা একটি অ্যারেতে হোয়ারের পদ্ধতিটি কখনই বদল হয় না, কারণ কোনও ভুল জায়গায় যুক্ত জোড় নেই (উপরে দেখুন), যদিও লোমুতোর পদ্ধতিটি এখনও তার মোটামুটি স্বাপগুলি করে !n/2

সমান উপাদানের উপস্থিতি কুইকোর্টে বিশেষ যত্ন প্রয়োজন। (আমি নিজেই এই ফাঁদে পা দিলাম ; "অকাল অপ্টিমাইজেশান এর টেল" এর জন্য আমার মাস্টারের থিসিস পৃষ্ঠা 36 দেখুন) টি দ্বারা ভরা একটি অ্যারে হিসাবে চরম উদাহরণ হিসাবে বিবেচনা করুন । এই ধরণের অ্যারেতে, হোয়েরের পদ্ধতিটি প্রতিটি জোড়া উপাদানগুলির জন্য একটি অদলবদল করে - যা হোয়েরের বিভাজনের পক্ষে সবচেয়ে খারাপ ঘটনা - তবে এবং সবসময় অ্যারের মাঝখানে মিলিত হয়। সুতরাং, আমাদের অনুকূল পার্টিশন রয়েছে এবং মোট চলমান সময়টি রয়ে গেছে ।আমি জে ( এন লগ এন )0ijO(nlogn)

লোমুতোর পদ্ধতিটি সমস্ত অ্যারেতে অনেক বেশি নির্বোধ আচরণ করে : তুলনাটি সর্বদা সত্য হবে, তাই আমরা প্রতিটি একক উপাদানের জন্য অদলবদল করি ! তবে আরও খারাপ: লুপের পরে, আমাদের সর্বদা , সুতরাং আমরা সামগ্রিক কর্মক্ষমতাটিকে অবনমিত করে সবচেয়ে খারাপ কেস বিভাজন পর্যবেক্ষণ করি !i = n Θ ( n 2 )0A[j] <= xi=nΘ(n2)

উপসংহার

লোমুতোর পদ্ধতিটি সহজ এবং প্রয়োগ করা সহজ, তবে গ্রন্থাগার বাছাইয়ের পদ্ধতিটি প্রয়োগ করার জন্য ব্যবহার করা উচিত নয়।


16
বাহ, এটির একটি বিস্তারিত উত্তর। সুন্দরভাবে সম্পন্ন!
রাফায়েল

রাফেলের সাথে একমত হতে হবে, সত্যিই দুর্দান্ত উত্তর!
রবার্ট এস বার্নেস

1
আমি একটি ছোটখাটো ব্যাখ্যা করব, যেহেতু মোট উপাদানগুলির সাথে অনন্য উপাদানের অনুপাত কমতে থাকে, লোমের সাথে তুলনার সংখ্যা হোয়ারের তুলনায় দ্রুত গতিতে বৃদ্ধি পায়। এটি সম্ভবত লোমুতোর দিক থেকে দুর্বল বিভাজন এবং হোয়েরের অংশে ভাল গড় পার্টিশনের কারণে।
রবার্ট এস বার্নেস

দুটি পদ্ধতির দুর্দান্ত ব্যাখ্যা! ধন্যবাদ!
ভি কৌক

আপনি সহজেই লোমুতো পদ্ধতির একটি বৈকল্পিক তৈরি করতে পারেন যা পাইভটের সমান সমস্ত উপাদানগুলি বের করতে পারে এবং তাদের পুনরাবৃত্তি থেকে বেরিয়ে যেতে পারে, যদিও এটি নিশ্চিত না যে এটি গড় ক্ষেত্রে সহায়তা করে বা বাধা দেয় কিনা I
জাকুব নারেবস্কি

5

কিছু মন্তব্য চমৎকার সেবাস্তিয়ান উত্তরে যুক্ত হয়েছে।

আমি সাধারণভাবে পার্টিশন পুনঃস্থাপনের অ্যালগরিদম সম্পর্কে কথা বলতে যাচ্ছি এবং কুইকসোর্টের জন্য এর বিশেষ ব্যবহার সম্পর্কে নয় ।

স্থায়িত্ব

Lomuto এর এলগরিদম হল semistable : পরিতৃপ্ত না উপাদানের আপেক্ষিক অর্ডার সম্পৃক্ত সংরক্ষিত হয়। হোয়ারের অ্যালগরিদম অস্থির।

উপাদান অ্যাক্সেস প্যাটার্ন

লোমুতোর অ্যালগরিদম এককভাবে সংযুক্ত তালিকা বা অনুরূপ ফরোয়ার্ড-কেবল ডেটা স্ট্রাকচারের সাথে ব্যবহার করা যেতে পারে। হোয়ারের অ্যালগরিদমের দ্বিপাক্ষিকতা প্রয়োজন ।

তুলনা সংখ্যা

Lomuto এর এলগরিদম করণ বাস্তবায়ন করা যায় অ্যাপ্লিকেশন সম্পৃক্ত দৈর্ঘ্য একটি ক্রম পার্টিশন করার । (হোয়ারেরও)।n1এনn

তবে এটি করার জন্য আমাদের 2 টি সম্পত্তি ত্যাগ করতে হবে:

  1. বিভাজনযুক্ত ক্রমটি অবশ্যই খালি হবে না।
  2. অ্যালগরিদম পার্টিশন পয়েন্টটি ফিরিয়ে দিতে অক্ষম।

আমাদের যদি এই 2 টির কোনও বৈশিষ্ট্যের প্রয়োজন হয় তবে তুলনা করে অ্যালগরিদমটি প্রয়োগ করা ছাড়া আমাদের আর কোনও উপায় থাকবে না ।n

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.