ازگر میں ڈھیروں کی رہنمائی

ازگر میں ڈھیروں کی رہنمائی

تعارف

ایک ہلچل سے بھرے ہوائی اڈے کا تصور کریں جہاں ہر منٹ میں پروازیں اڑان بھرتی اور اترتی ہیں۔ جس طرح ہوائی ٹریفک کنٹرولرز ہنگامی بنیادوں پر پروازوں کو ترجیح دیتے ہیں، اسی طرح ہیپس ہمیں مخصوص معیار کی بنیاد پر ڈیٹا کا انتظام کرنے اور اس پر کارروائی کرنے میں مدد کرتے ہیں، اس بات کو یقینی بناتے ہوئے کہ ڈیٹا کا سب سے زیادہ "فوری" یا "اہم" حصہ ہمیشہ سب سے اوپر قابل رسائی ہو۔

اس گائیڈ میں، ہم زمین سے ڈھیروں کو سمجھنے کے لیے ایک سفر کا آغاز کریں گے۔ ہم ڈھیر کیا ہیں اور ان کی موروثی خصوصیات کو ظاہر کرکے شروع کریں گے۔ وہاں سے، ہم ازگر کے اپنے ہیپس کے نفاذ میں غوطہ لگائیں گے۔ heapq ماڈیول، اور اس کی خصوصیات کے بھرپور سیٹ کو دریافت کریں۔ لہذا، اگر آپ نے کبھی سوچا ہے کہ ڈیٹا کے ایک متحرک سیٹ کو مؤثر طریقے سے کیسے منظم کیا جائے جہاں سب سے زیادہ (یا سب سے کم) ترجیحی عنصر کی کثرت سے ضرورت ہوتی ہے، تو آپ علاج کے لیے تیار ہیں۔

ہیپ کیا ہے؟

ڈھیروں کے استعمال میں غوطہ لگانے سے پہلے آپ جس چیز کو سمجھنا چاہیں گے وہ ہے۔ ایک ڈھیر کیا ہے. اعداد و شمار کے ڈھانچے کی دنیا میں ایک ڈھیر درخت پر مبنی پاور ہاؤس کے طور پر نمایاں ہے، خاص طور پر ترتیب اور درجہ بندی کو برقرار رکھنا. اگرچہ یہ غیر تربیت یافتہ آنکھ سے بائنری درخت سے مشابہت رکھتا ہے، لیکن اس کی ساخت اور حکمرانی کے قواعد میں باریکیاں اسے واضح طور پر الگ کرتی ہیں۔

ایک ڈھیر کی وضاحتی خصوصیات میں سے ایک اس کی نوعیت ہے a مکمل بائنری درخت. اس کا مطلب یہ ہے کہ درخت کی ہر سطح، شاید آخری کو چھوڑ کر، مکمل طور پر بھری ہوئی ہے۔ اس آخری سطح کے اندر، نوڈس بائیں سے دائیں آباد ہوتے ہیں۔ اس طرح کا ڈھانچہ اس بات کو یقینی بناتا ہے کہ ڈھیروں کو صفوں یا فہرستوں کا استعمال کرتے ہوئے مؤثر طریقے سے نمائندگی اور ہیرا پھیری کی جا سکتی ہے، جس میں صف میں ہر عنصر کی پوزیشن درخت میں اس کی جگہ کی عکاسی کرتی ہے۔

گائیڈ-ٹو-ہیپس-ان-python-01.png

تاہم، ڈھیر کی اصل جوہر اس میں مضمر ہے۔ حکم. ایک ___ میں زیادہ سے زیادہ ڈھیر, کسی بھی نوڈ کی قدر اس کے بچوں کی قدروں کو پیچھے چھوڑتی ہے یا اس کے مساوی ہوتی ہے، سب سے بڑے عنصر کو جڑ کے دائیں طرف رکھتا ہے۔ دوسری طرف، اے منٹ کا ڈھیر مخالف اصول پر کام کرتا ہے: کسی بھی نوڈ کی قدر یا تو اس کے بچوں کی قدروں سے کم یا اس کے برابر ہوتی ہے، اس بات کو یقینی بناتے ہوئے کہ سب سے چھوٹا عنصر جڑ میں بیٹھتا ہے۔

گائیڈ-ٹو-ہیپس-ان-python-02.png

مشورہ: آپ ایک ہیپ کو بطور تصور کر سکتے ہیں۔ نمبروں کا پرامڈ. زیادہ سے زیادہ ڈھیر کے لیے، جیسے ہی آپ بنیاد سے چوٹی پر چڑھتے ہیں، تعداد بڑھتی جاتی ہے، جس کا اختتام چوٹی پر زیادہ سے زیادہ قدر ہوتا ہے۔ اس کے برعکس، ایک منٹ کا ڈھیر اپنی چوٹی پر کم از کم قدر کے ساتھ شروع ہوتا ہے، جب آپ نیچے کی طرف جاتے ہیں تو نمبر بڑھتے جاتے ہیں۔

جیسے جیسے ہم ترقی کرتے ہیں، ہم گہرائی میں جائیں گے کہ ڈھیروں کی یہ موروثی خصوصیات کس طرح موثر کارروائیوں کو قابل بناتی ہیں اور کیسے ازگر کی heapq ماڈیول بغیر کسی رکاوٹ کے ڈھیروں کو ہماری کوڈنگ کی کوششوں میں ضم کرتا ہے۔

ہیپس کی خصوصیات اور خواص

ہیپس، اپنی منفرد ساخت اور ترتیب دینے والے اصولوں کے ساتھ، الگ الگ خصوصیات اور خصوصیات کا ایک سیٹ سامنے لاتے ہیں جو انہیں مختلف کمپیوٹیشنل منظرناموں میں انمول بناتے ہیں۔

سب سے پہلے اور سب سے اہم، ڈھیر ہیں فطری طور پر موثر. ان کا درخت پر مبنی ڈھانچہ، خاص طور پر مکمل بائنری ٹری فارمیٹ، اس بات کو یقینی بناتا ہے کہ ترجیحی عناصر (زیادہ سے زیادہ یا کم سے کم) کو داخل کرنے اور نکالنے جیسے کام عام طور پر لوگارتھمک وقت میں کیے جا سکتے ہیں۔ O (log n). یہ کارکردگی الگورتھم اور ایپلیکیشنز کے لیے ایک اعزاز ہے جن کو ترجیحی عناصر تک بار بار رسائی کی ضرورت ہوتی ہے۔

ڈھیروں کی ایک اور قابل ذکر خاصیت ان کی ہے۔ میموری کی کارکردگی. چونکہ بچے یا پیرنٹ نوڈس کے لیے واضح پوائنٹرز کی ضرورت کے بغیر ہیپس کو صفوں یا فہرستوں کا استعمال کرتے ہوئے دکھایا جا سکتا ہے، اس لیے وہ جگہ کی بچت کرتے ہیں۔ صف میں ہر عنصر کی پوزیشن درخت میں اس کی جگہ کے مساوی ہے، جو پیشین گوئی کے قابل اور سیدھی سیدھی ٹراورسل اور ہیرا پھیری کی اجازت دیتی ہے۔

ہیپس کی ترتیب دینے والی خاصیت، چاہے زیادہ سے زیادہ ہیپ ہو یا کم سے کم ہیپ، اس بات کو یقینی بناتی ہے۔ جڑ ہمیشہ سب سے زیادہ ترجیح کا عنصر رکھتی ہے۔. یہ مستقل ترتیب وہی ہے جو پورے ڈھانچے کو تلاش کیے بغیر اولین ترجیحی عنصر تک فوری رسائی کی اجازت دیتی ہے۔

مزید برآں، ڈھیر ہیں ورسٹائل. اگرچہ بائنری ہیپس (جہاں ہر والدین کے زیادہ سے زیادہ دو بچے ہوتے ہیں) سب سے زیادہ عام ہیں، ڈھیروں کو دو سے زیادہ بچے پیدا کرنے کے لیے عام کیا جا سکتا ہے، جسے کہا جاتا ہے۔ d-ary ڈھیر. یہ لچک مخصوص استعمال کے معاملات اور کارکردگی کی ضروریات کی بنیاد پر ٹھیک ٹیوننگ کی اجازت دیتی ہے۔

آخر میں، ڈھیر ہیں خود کو ایڈجسٹ کرنا. جب بھی عناصر کو شامل یا ہٹایا جاتا ہے، ساخت اپنی خصوصیات کو برقرار رکھنے کے لیے خود کو دوبارہ ترتیب دیتا ہے۔ یہ متحرک توازن اس بات کو یقینی بناتا ہے کہ ہیپ ہر وقت اپنے بنیادی کاموں کے لیے موزوں رہے۔

مشورہ: ان خصوصیات نے ہیپ ڈیٹا کے ڈھانچے کو ایک موثر ترتیب دینے والے الگورتھم - ہیپ کی ترتیب کے لیے موزوں بنا دیا۔ Python میں ہیپ کی ترتیب کے بارے میں مزید جاننے کے لیے، ہمارا پڑھیں "ازگر میں ڈھیر کی ترتیب" مضمون.

جیسا کہ ہم Python کے نفاذ اور عملی ایپلی کیشنز میں گہرائی میں جائیں گے، ڈھیروں کی حقیقی صلاحیت ہمارے سامنے آ جائے گی۔

ڈھیروں کی اقسام

تمام ڈھیر برابر نہیں بنائے جاتے ہیں۔ ان کی ترتیب اور ساختی خصوصیات کی بنیاد پر، ڈھیروں کو مختلف اقسام میں تقسیم کیا جا سکتا ہے، ہر ایک کی اپنی ایپلی کیشنز اور فوائد کے ساتھ۔ دو اہم زمرے ہیں۔ زیادہ سے زیادہ ڈھیر اور منٹ کا ڈھیر.

کی سب سے ممتاز خصوصیت a زیادہ سے زیادہ ڈھیر یہ ہے کہ کسی بھی نوڈ کی قدر اس کے بچوں کی قدروں سے زیادہ یا اس کے برابر ہے۔ یہ یقینی بناتا ہے کہ ہیپ میں سب سے بڑا عنصر ہمیشہ جڑ میں رہتا ہے۔ اس طرح کا ڈھانچہ خاص طور پر مفید ہے جب زیادہ سے زیادہ عنصر تک کثرت سے رسائی کی ضرورت ہو، جیسا کہ بعض ترجیحی قطار کے نفاذ میں۔

زیادہ سے زیادہ ہیپ کا ہم منصب، a منٹ کا ڈھیر اس بات کو یقینی بناتا ہے کہ کسی بھی نوڈ کی قدر اس کے بچوں کی قدروں سے کم یا برابر ہو۔ یہ ڈھیر کے سب سے چھوٹے عنصر کو جڑ میں رکھتا ہے۔ کم سے کم ڈھیر ان منظرناموں میں انمول ہوتے ہیں جہاں کم سے کم عنصر بنیادی اہمیت کا حامل ہوتا ہے، جیسے کہ الگورتھم میں جو ریئل ٹائم ڈیٹا پروسیسنگ سے نمٹتے ہیں۔

ان بنیادی زمروں کے علاوہ، ڈھیروں کو ان کے برانچنگ فیکٹر کی بنیاد پر بھی پہچانا جا سکتا ہے:

اگرچہ بائنری ہیپس سب سے زیادہ عام ہیں، ہر والدین کے زیادہ سے زیادہ دو بچے ہوتے ہیں، ہیپس کے تصور کو دو سے زیادہ بچوں والے نوڈس تک بڑھایا جا سکتا ہے۔ ایک ___ میں d-ary ڈھیر، ہر نوڈ میں زیادہ سے زیادہ ہوتا ہے۔ d بچے. اس تغیر کو مخصوص منظرناموں کے لیے بہتر بنایا جا سکتا ہے، جیسے کہ کچھ کاموں کو تیز کرنے کے لیے درخت کی اونچائی کو کم کرنا۔

بائنومیل ہیپ binomial درختوں کا ایک مجموعہ ہے جو بار بار بیان کیا جاتا ہے۔ بائنومیئل ہیپس ترجیحی قطار کے نفاذ میں استعمال ہوتے ہیں اور موثر انضمام کی کارروائیاں پیش کرتے ہیں۔

مشہور فبونیکی ترتیب کے نام پر رکھا گیا ہے۔ فبونیکی ڈھیر بائنری یا binomial heaps کے مقابلے میں بہت سے آپریشنز کے لیے بہتر طور پر طے شدہ رننگ ٹائم پیش کرتا ہے۔ وہ نیٹ ورک کی اصلاح کے الگورتھم میں خاص طور پر مفید ہیں۔

ازگر کے ڈھیر پر عمل درآمد - The heapq ماڈیول

پائتھون ہیپ آپریشنز کے لیے ایک بلٹ ان ماڈیول پیش کرتا ہے۔ heapq ماڈیول یہ ماڈیول ہیپ سے متعلق افعال کا ایک مجموعہ فراہم کرتا ہے جو ڈویلپرز کو فہرستوں کو ڈھیروں میں تبدیل کرنے اور اپنی مرضی کے نفاذ کی ضرورت کے بغیر مختلف ہیپ آپریشنز کرنے کی اجازت دیتا ہے۔ آئیے اس ماڈیول کی باریکیوں میں غوطہ لگائیں اور یہ آپ کو ڈھیروں کی طاقت کیسے لاتا ہے۔

۔ heapq ماڈیول ایک الگ ہیپ ڈیٹا کی قسم فراہم نہیں کرتا ہے۔ اس کے بجائے، یہ ایسے فنکشنز پیش کرتا ہے جو Python کی باقاعدہ فہرستوں پر کام کرتے ہیں، ان کو تبدیل کرتے ہیں اور ان کا علاج کرتے ہیں۔ بائنری ڈھیر.

یہ نقطہ نظر میموری کے لحاظ سے موثر ہے اور ازگر کے موجودہ ڈیٹا ڈھانچے کے ساتھ بغیر کسی رکاوٹ کے مربوط ہے۔

اس کا مطلب ہے کہ ڈھیروں کو فہرستوں کے طور پر دکھایا گیا ہے۔ in heapq. اس نمائندگی کی خوبصورتی اس کی سادگی ہے - صفر پر مبنی فہرست انڈیکس کا نظام ایک مضمر بائنری درخت کے طور پر کام کرتا ہے۔ پوزیشن پر کسی بھی عنصر کے لیے iاس کا:

  • لیفٹ چائلڈ پوزیشن پر ہے۔ 2*i + 1
  • صحیح بچہ پوزیشن پر ہے۔ 2*i + 2
  • پیرنٹ نوڈ پوزیشن پر ہے۔ (i-1)//2

گائیڈ-ٹو-ہیپس-ان-python-03.png

یہ مضمر ڈھانچہ اس بات کو یقینی بناتا ہے کہ علیحدہ نوڈ پر مبنی بائنری ٹری کی نمائندگی کی ضرورت نہیں ہے، آپریشن کو سیدھا اور میموری کا استعمال کم سے کم کرتا ہے۔

خلائی پیچیدگی: ہیپس کو عام طور پر بائنری ٹری کے طور پر لاگو کیا جاتا ہے لیکن چائلڈ نوڈس کے لیے واضح پوائنٹرز کے ذخیرہ کی ضرورت نہیں ہوتی ہے۔ یہ انہیں خلائی پیچیدگی کے ساتھ خلائی موثر بناتا ہے۔ اے (ن) این عناصر کو ذخیرہ کرنے کے لیے۔

یہ نوٹ کرنا ضروری ہے کہ heapq ماڈیول ڈیفالٹ کے لحاظ سے کم از کم ڈھیر بناتا ہے۔. اس کا مطلب ہے کہ سب سے چھوٹا عنصر ہمیشہ جڑ میں ہوتا ہے (یا فہرست میں پہلی پوزیشن)۔ اگر آپ کو زیادہ سے زیادہ ہیپ کی ضرورت ہے، تو آپ کو عناصر کو اس سے ضرب دے کر ترتیب کو الٹنا ہوگا۔ -1 یا حسب ضرورت موازنہ فنکشن استعمال کریں۔

ازگر کا heapq ماڈیول فنکشنز کا ایک مجموعہ فراہم کرتا ہے جو ڈویلپرز کو فہرستوں پر مختلف ہیپ آپریشن کرنے کی اجازت دیتا ہے۔

نوٹ: استعمال کرنے کے لئے heapq آپ کی درخواست میں ماڈیول، آپ کو اسے آسان استعمال کرکے درآمد کرنے کی ضرورت ہوگی۔ import heapq.

مندرجہ ذیل حصوں میں، ہم ان بنیادی کارروائیوں میں سے ہر ایک کی گہرائی میں غوطہ لگائیں گے، ان کے میکانکس اور استعمال کے معاملات کو تلاش کریں گے۔

فہرست کو ڈھیر میں کیسے تبدیل کریں۔

۔ heapify() فنکشن بہت سے ہیپ سے متعلق کاموں کا نقطہ آغاز ہے۔ یہ ایک قابل تکرار (عام طور پر ایک فہرست) لیتا ہے اور ایک منٹ کے ڈھیر کی خصوصیات کو پورا کرنے کے لئے اپنے عناصر کو جگہ جگہ دوبارہ ترتیب دیتا ہے:

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ Git سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

import heapq data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(data)
print(data)

یہ دوبارہ ترتیب دی گئی فہرست کو آؤٹ پٹ کرے گا جو ایک درست منٹ ہیپ کی نمائندگی کرتا ہے:

[1, 1, 2, 3, 3, 9, 4, 6, 5, 5, 5]

وقت کی پیچیدگی: کا استعمال کرتے ہوئے ایک غیر ترتیب شدہ فہرست کو ہیپ میں تبدیل کرنا heapify فنکشن ایک ہے اے (ن) آپریشن یہ متضاد معلوم ہو سکتا ہے، جیسا کہ کوئی اس کی توقع کر سکتا ہے۔ O (nlogn)، لیکن درخت کی ساخت کی خصوصیات کی وجہ سے، یہ لکیری وقت میں حاصل کیا جا سکتا ہے۔

ڈھیر میں عنصر کیسے شامل کریں۔

۔ heappush() فنکشن آپ کو ہیپ کی خصوصیات کو برقرار رکھتے ہوئے ہیپ میں ایک نیا عنصر داخل کرنے کی اجازت دیتا ہے:

import heapq heap = []
heapq.heappush(heap, 5)
heapq.heappush(heap, 3)
heapq.heappush(heap, 7)
print(heap)

کوڈ کو چلانے سے آپ کو کم سے کم ہیپ پراپرٹی کو برقرار رکھنے والے عناصر کی فہرست ملے گی۔

[3, 5, 7]

وقت کی پیچیدگی: ہیپ میں داخل کرنے کا عمل، جس میں ہیپ پراپرٹی کو برقرار رکھتے ہوئے ہیپ میں ایک نیا عنصر رکھنا شامل ہے، اس میں وقت کی پیچیدگی ہوتی ہے O (لاگ آن). اس کی وجہ یہ ہے کہ، بدترین صورت میں، عنصر کو پتی سے جڑ تک سفر کرنا پڑ سکتا ہے۔

ڈھیر سے سب سے چھوٹے عنصر کو کیسے ہٹائیں اور واپس کریں۔

۔ heappop() فنکشن ہیپ سے سب سے چھوٹے عنصر کو نکالتا ہے اور واپس کرتا ہے (ایک منٹ کے ڈھیر میں جڑ)۔ ہٹانے کے بعد، یہ یقینی بناتا ہے کہ فہرست ایک درست ڈھیر بنی رہے:

import heapq heap = [1, 3, 5, 7, 9]
print(heapq.heappop(heap))
print(heap)

نوٹ: ۔ heappop() الگورتھم میں انمول ہے جس کے لیے صعودی ترتیب میں پروسیسنگ عناصر کی ضرورت ہوتی ہے، جیسے ہیپ سورٹ الگورتھم، یا ترجیحی قطاروں کو لاگو کرتے وقت جہاں کاموں کو ان کی عجلت کی بنیاد پر انجام دیا جاتا ہے۔

یہ سب سے چھوٹا عنصر اور باقی فہرست کو آؤٹ پٹ کرے گا:

1
[3, 7, 5, 9]

یہاں، 1 سے سب سے چھوٹا عنصر ہے۔ heap، اور بقیہ فہرست نے ہیپ پراپرٹی کو برقرار رکھا ہے، ہمارے ہٹانے کے بعد بھی 1.

وقت کی پیچیدگی: جڑ عنصر کو ہٹانا (جو ایک منٹ کے ڈھیر میں سب سے چھوٹا یا زیادہ سے زیادہ ڈھیر میں سب سے بڑا ہے) اور ڈھیر کو دوبارہ ترتیب دینے میں بھی وقت لگتا ہے O (لاگ آن) وقت.

کسی نئی آئٹم کو کیسے پش کریں اور سب سے چھوٹی آئٹم کو پاپ کریں۔

۔ heappushpop() فنکشن ایک مشترکہ آپریشن ہے جو ایک نئی شے کو ڈھیر پر دھکیلتا ہے اور پھر ڈھیر سے سب سے چھوٹی چیز کو پاپ کرکے واپس کرتا ہے:

import heapq heap = [3, 5, 7, 9]
print(heapq.heappushpop(heap, 4)) print(heap)

یہ پیداوار کرے گا 3، سب سے چھوٹا عنصر، اور نئے کو پرنٹ کریں۔ heap فہرست جس میں اب شامل ہے۔ 4 ہیپ پراپرٹی کو برقرار رکھتے ہوئے:

3
[4, 5, 7, 9]

نوٹ: یہاں heappushpop() فنکشن ایک نئے عنصر کو آگے بڑھانے اور سب سے چھوٹے کو الگ سے پاپ کرنے کے آپریشنز کرنے سے زیادہ موثر ہے۔

سب سے چھوٹی چیز کو کیسے تبدیل کریں اور ایک نئی چیز کو آگے بڑھائیں۔

۔ heapreplace() فنکشن سب سے چھوٹے عنصر کو پاپ کرتا ہے اور ایک نئے عنصر کو ڈھیر پر دھکیلتا ہے، یہ سب ایک موثر آپریشن میں:

import heapq heap = [1, 5, 7, 9]
print(heapq.heapreplace(heap, 4))
print(heap)

یہ پرنٹ کرتا ہے۔ 1، سب سے چھوٹا عنصر، اور فہرست میں اب 4 شامل ہیں اور ہیپ پراپرٹی کو برقرار رکھتا ہے:

1
[4, 5, 7, 9]

نوٹ: heapreplace() سٹریمنگ منظرناموں میں فائدہ مند ہے جہاں آپ موجودہ سب سے چھوٹے عنصر کو نئی قدر سے بدلنا چاہتے ہیں، جیسے رولنگ ونڈو آپریشنز یا ریئل ٹائم ڈیٹا پروسیسنگ کے کاموں میں۔

ازگر کے ڈھیر میں متعدد انتہاؤں کو تلاش کرنا

nlargest(n, iterable[, key]) اور nsmallest(n, iterable[, key]) فنکشنز کو ایک تکراری سے ایک سے زیادہ بڑے یا چھوٹے عناصر کو بازیافت کرنے کے لیے ڈیزائن کیا گیا ہے۔ جب آپ کو صرف چند انتہائی قدروں کی ضرورت ہوتی ہے تو وہ پورے تکراری کو چھانٹنے سے زیادہ کارآمد ثابت ہوسکتے ہیں۔ مثال کے طور پر، کہتے ہیں کہ آپ کے پاس درج ذیل فہرست ہے اور آپ فہرست میں تین سب سے چھوٹی اور تین بڑی قدریں تلاش کرنا چاہتے ہیں:

data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

یہاں، nlargest() اور nsmallest() افعال کام آ سکتے ہیں:

import heapq data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(heapq.nlargest(3, data)) print(heapq.nsmallest(3, data)) 

اس سے آپ کو دو فہرستیں ملیں گی - ایک میں تین سب سے بڑی قدریں ہوں گی اور دوسری میں تین سب سے چھوٹی اقدار ہوں گی۔ data فہرست:

[9, 6, 5]
[1, 1, 2]

اپنی مرضی کے مطابق ڈھیر کیسے بنائیں

جبکہ ازگر کا heapq ماڈیول ہیپس کے ساتھ کام کرنے کے لیے ٹولز کا ایک مضبوط سیٹ فراہم کرتا ہے، ایسے حالات موجود ہیں جہاں ڈیفالٹ منٹ ہیپ رویہ کافی نہ ہو۔ چاہے آپ زیادہ سے زیادہ ہیپ کو لاگو کرنے کے خواہاں ہوں یا کسی ایسے ہیپ کی ضرورت ہو جو حسب ضرورت موازنہ کے افعال کی بنیاد پر کام کرے، حسب ضرورت ہیپ بنانا اس کا جواب ہو سکتا ہے۔ آئیے دریافت کریں کہ ڈھیروں کو مخصوص ضروریات کے مطابق کیسے بنایا جائے۔

کا استعمال کرتے ہوئے ایک میکس ہیپ کو لاگو کرنا heapq

ڈیفالٹ کی طرف سے، heapq پیدا منٹ کے ڈھیر. تاہم، ایک سادہ چال کے ساتھ، آپ اسے زیادہ سے زیادہ ہیپ کو لاگو کرنے کے لیے استعمال کر سکتے ہیں۔ خیال عناصر کی ترتیب کو ان سے ضرب دے کر الٹنا ہے۔ -1 انہیں ڈھیر میں شامل کرنے سے پہلے:

import heapq class MaxHeap: def __init__(self): self.heap = [] def push(self, val): heapq.heappush(self.heap, -val) def pop(self): return -heapq.heappop(self.heap) def peek(self): return -self.heap[0]

اس نقطہ نظر کے ساتھ، سب سے بڑی تعداد (مطلق قدر کے لحاظ سے) سب سے چھوٹی بن جاتی ہے، جس کی اجازت دیتا ہے۔ heapq زیادہ سے زیادہ ہیپ ڈھانچے کو برقرار رکھنے کے افعال۔

حسب ضرورت موازنہ افعال کے ساتھ ہیپس

بعض اوقات، آپ کو ایک ڈھیر کی ضرورت پڑ سکتی ہے جو صرف عناصر کی قدرتی ترتیب کی بنیاد پر موازنہ نہیں کرتا ہے۔ مثال کے طور پر، اگر آپ پیچیدہ اشیاء کے ساتھ کام کر رہے ہیں یا آپ کے پاس ترتیب دینے کے مخصوص معیار ہیں، تو حسب ضرورت موازنہ کا فنکشن ضروری ہو جاتا ہے۔

اس کو حاصل کرنے کے لیے، آپ ایسے عناصر کو مددگار کلاس میں لپیٹ سکتے ہیں جو موازنہ آپریٹرز کو اوور رائیڈ کرتا ہے:

import heapq class CustomElement: def __init__(self, obj, comparator): self.obj = obj self.comparator = comparator def __lt__(self, other): return self.comparator(self.obj, other.obj) def custom_heappush(heap, obj, comparator=lambda x, y: x < y): heapq.heappush(heap, CustomElement(obj, comparator)) def custom_heappop(heap): return heapq.heappop(heap).obj

اس سیٹ اپ کے ساتھ، آپ کسی بھی کسٹم کمپیریٹر فنکشن کی وضاحت کر سکتے ہیں اور اسے ہیپ کے ساتھ استعمال کر سکتے ہیں۔

نتیجہ

ہیپس بہت سے آپریشنز کے لیے قابل قیاس کارکردگی پیش کرتے ہیں، جو انہیں ترجیح پر مبنی کاموں کے لیے ایک قابل اعتماد انتخاب بناتے ہیں۔ تاہم، درخواست کی مخصوص ضروریات اور خصوصیات پر غور کرنا ضروری ہے۔ کچھ صورتوں میں، ہیپ کے نفاذ کو موافق بنانا یا متبادل ڈیٹا ڈھانچے کا انتخاب کرنے سے حقیقی دنیا کی بہتر کارکردگی حاصل ہو سکتی ہے۔

ہیپس، جیسا کہ ہم نے سفر کیا ہے، صرف ایک اور ڈیٹا ڈھانچہ سے زیادہ ہیں۔ وہ کارکردگی، ساخت، اور موافقت کے سنگم کی نمائندگی کرتے ہیں۔ ان کی بنیادی خصوصیات سے لے کر ازگر میں ان کے نفاذ تک heapq ماڈیول، ہیپس بے شمار کمپیوٹیشنل چیلنجز کا ایک مضبوط حل پیش کرتے ہیں، خاص طور پر وہ ترجیحات کے ارد گرد مرکوز ہیں۔

ٹائم اسٹیمپ:

سے زیادہ Stackabuse