কোন স্ব ভারসাম্য বাইনারি গাছ আপনি সুপারিশ করবেন?


18

আমি হাস্কেল শিখছি এবং অনুশীলন হিসাবে আমি বাইনারি গাছ তৈরি করছি। নিয়মিত বাইনারি ট্রি তৈরি করে, আমি এটিকে স্বতাল্য ভারসাম্য হিসাবে মানিয়ে নিতে চাই। তাই:

  • কোনটি সবচেয়ে দক্ষ?
  • কোনটি কার্যকর করা সবচেয়ে সহজ?
  • কোনটি প্রায়শই ব্যবহৃত হয়?

কিন্তু গুরুতরভাবে, আপনি কোনটি সুপারিশ করবেন?

আমি ধরে নিলাম এটি এখানে সম্পর্কিত কারণ এটি বিতর্কের জন্য উন্মুক্ত।


দক্ষতা এবং বাস্তবায়নের স্বাচ্ছন্দ্যের দিক থেকে সাধারণ দক্ষতাগুলি খুব ভালভাবে সংজ্ঞায়িত করা হয়েছে তবে আপনার বাস্তবায়নের জন্য, আমি মনে করি সবচেয়ে ভাল জিনিসটি আপনি খুঁজে পেতে পারেন
যতগুলি

উত্তর:


15

আমি আপনাকে একটি লাল-কালো গাছ , বা একটি এভিএল গাছ দিয়ে শুরু করার পরামর্শ দেব ।

লাল-কালো গাছ সন্নিবেশ করার জন্য দ্রুত, তবে AVL গাছটি দেখার জন্য সামান্য প্রান্ত রয়েছে। এভিএল ট্রি সম্ভবত প্রয়োগ করা কিছুটা সহজ, তবে আমার নিজের অভিজ্ঞতার ভিত্তিতে এতটা নয়।

এভিএল গাছটি নিশ্চিত করে যে প্রতিটি sertোকানো বা মুছার পরে গাছটি ভারসাম্যপূর্ণ (কোনও উপ-গাছে 1 / -1 এর চেয়ে বেশি ভারসাম্য ফ্যাক্টর থাকে না, অন্যদিকে লাল-কালো গাছটি নিশ্চিত করে যে গাছটি যে কোনও সময়ে যুক্তিসঙ্গতভাবে ভারসাম্যযুক্ত)।


1
ব্যক্তিগতভাবে, আমি লাল-কালো সন্নিবেশটি এভিএল সন্নিবেশের চেয়ে সহজ পাই। কারণটি হ'ল বি-ট্রিগুলির সাথে (অপূর্ণ) উপমা। সন্নিবেশগুলি সুস্পষ্টভাবে হয় তবে মুছে ফেলাগুলি মন্দ ( এতগুলি বিষয় বিবেচনা করার জন্য)। আসলে আমার আর নিজের নিজস্ব সি ++ রেড-ব্ল্যাক মুছে ফেলা বাস্তবায়ন নেই - যখন আমি বুঝতে পারি (1) আমি কখনই এটি ব্যবহার করছিলাম না - প্রতিবার যখন আমি মুছে ফেলতে চেয়েছিলাম তখন আমি একাধিক আইটেম মুছে ফেলছিলাম, তাই আমি গাছ থেকে রূপান্তরিত হয়েছি তালিকা থেকে তালিকা থেকে মুছুন, তারপরে আবার একটি গাছে রূপান্তর করুন এবং (২) যাইহোক এটি ভেঙে গেছে।
স্টিভ 314

2
@ স্টিভ 314, লাল-কালো গাছগুলি সহজ, তবে আপনি কার্যকরভাবে কার্যকর করতে সক্ষম হননি? তখন এভিএল গাছগুলি কী কী?
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ - আমি এখনও কোনও methodোকানো পদ্ধতি নিয়ে কোনও বাস্তবায়ন করিনি যা এখনও কাজ করে - নোট রয়েছে, মূল নীতিটি বুঝতে পারে, তবে অনুপ্রেরণা, সময় এবং আত্মবিশ্বাসের সঠিক সংমিশ্রণটি কখনই পাইনি। যদি আমি কেবল সংস্করণগুলি কাজ করতে চাই, তবে এটি কেবল অনুলিপি-সিউডোকোড-থেকে-পাঠ্যপুস্তিকা-এবং অনুবাদ করুন (এবং ভুলে যাবেন না সি ++ এর স্ট্যান্ডার্ড লাইব্রেরি পাত্রে রয়েছে), তবে তাতে মজা কোথায়?
স্টিভ 314

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

1
@ স্টিভ 314, আমি জানি, গাছগুলি অনিবার্য ভাষায় খুব সুন্দরভাবে জটিল হতে পারে তবে আশ্চর্যের বিষয় হ্যাশকেলে এগুলি কার্যকর করা একটি হাওয়া হয়ে দাঁড়িয়েছে। আমি সপ্তাহান্তে একটি নিয়মিত এভিএল গাছ এবং একটি 1 ডি স্থানিক বৈকল্পিক লিখেছি এবং তারা উভয়ই প্রায় 60 লাইন 60
ড্যান_ওয়াটারওয়ার্থ

10

আপনি যদি এলোমেলোভাবে ডেটা স্ট্রাকচার দিয়ে ভাল থাকেন তবে আমি একটি বিকল্প বিবেচনা করব : তালিকা ছেড়ে যান

উচ্চ-স্তরের দৃষ্টিকোণ থেকে এটি গাছের কাঠামো, এটি গাছ হিসাবে নয় তবে একাধিক স্তরের লিঙ্কের তালিকা হিসাবে প্রয়োগ করা হয়।

আপনি ও (লগ এন) সন্নিবেশ / অনুসন্ধানগুলি / মুছুনগুলি পেয়ে যাবেন এবং আপনাকে এই সমস্ত কৌশলযুক্ত পুনরায় ভারসাম্য রক্ষার ক্ষেত্রে মোকাবেলা করতে হবে না।

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


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

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

2
@ ফ্যান্যাটিক 23, একটি এড়িয়ে যাওয়ার তালিকা কোনও এডিটি নয়। এডিটি হয় সেট বা কোনও সহযোগী অ্যারে।
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ জলছবি আমার খারাপ, আপনি সঠিক বলেছেন।
ফ্যান্যাটিক 23

5

আপনি যদি তুলনামূলকভাবে সহজ কাঠামোটি শুরু করতে চান (এভিএল গাছ এবং লাল-কালো গাছ দু'টোই মজাদারভাবে), তবে একটি বিকল্প হ'ল ট্রিপ - এটি "ট্রি" এবং "হিপ" এর সংমিশ্রণ হিসাবে নামকরণ করা হয়েছে।

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

সম্পাদনা উপরের "কী মানগুলির মধ্যে" মুছে ফেলা হয়েছে - অগ্রাধিকার এবং কী অর্ডার একসাথে প্রযোজ্য, তাই অগ্রাধিকার এমনকি অনন্য কীগুলির জন্যও তাৎপর্যপূর্ণ।

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


1
+1 টি। ট্র্যাপগুলি আমার ব্যক্তিগত পছন্দ, এমনকি আমিও করি সেগুলি কীভাবে প্রয়োগ করা হয় সে সম্পর্কে একটি ব্লগ পোস্টও লিখেছিলাম
পি শ্যাড

5

কোনটি সবচেয়ে দক্ষ?

লীগ এবং উত্তর দেওয়া কঠিন। গণনা সংক্রান্ত জটিলতাগুলি সমস্ত সংজ্ঞায়িত। যদি আপনি দক্ষতার দ্বারা এটি বোঝাতে চান তবে কোন আসল বিতর্ক নেই। প্রকৃতপক্ষে, সমস্ত ভাল অ্যালগরিদম প্রমাণ এবং জটিলতার কারণগুলির সাথে আসে।

যদি আপনি "রান সময়" বা "মেমরির ব্যবহার" বলতে চান তবে আপনাকে প্রকৃত বাস্তবায়নগুলি তুলনা করতে হবে। তারপরে ভাষা, রান-টাইম, ওএস এবং অন্যান্য বিষয়গুলি কার্যকর হয়, যা প্রশ্নের উত্তর দেওয়া কঠিন করে তোলে।

কোনটি কার্যকর করা সবচেয়ে সহজ?

লীগ এবং উত্তর দেওয়া কঠিন। কিছু অ্যালগরিদম আপনার কাছে জটিল মনে হতে পারে তবে আমার কাছে তুচ্ছ।

কোনটি প্রায়শই ব্যবহৃত হয়?

লীগ এবং উত্তর দেওয়া কঠিন। প্রথমে "কার দ্বারা?" এর অংশ? শুধু হাসেল? সি বা সি ++ সম্পর্কে কী? দ্বিতীয়ত, মালিকানাধীন সফ্টওয়্যার সমস্যা রয়েছে যেখানে আমাদের জরিপ করার উত্সটিতে অ্যাক্সেস নেই।

কিন্তু গুরুতরভাবে, আপনি কোনটি সুপারিশ করবেন?

আমি ধরে নিলাম এটি এখানে সম্পর্কিত কারণ এটি বিতর্কের জন্য উন্মুক্ত।

সঠিক। যেহেতু আপনার অন্যান্য মানদণ্ড খুব সহায়ক নয়, আপনি যা যাচ্ছেন এটিই এটি।

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

তালিকাটি এখানে:

http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree

সংজ্ঞা দেওয়া আছে ছয়টি জনপ্রিয়। তাদের দিয়ে শুরু করুন।


3

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

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

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

একটি জিনিস - যেহেতু সংজ্ঞা অনুসারে এই ডেটা স্ট্রাকচারটি অপারেশন সন্ধানের জন্যও পরিবর্তিত হয়, সম্ভবত এটি একাকীভাবে প্রয়োগ করা প্রয়োজন। IOW এটি সম্ভবত কার্যকরী প্রোগ্রামিংয়ের জন্য উপযুক্ত নয়।


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

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

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

1
@ কিউইক - গাছের ডুপ্লিকেট করা হ'ল আপনি কোনও গাছের ডেটা কাঠামোর জন্য খাঁটি কার্যকরী ভাষায় যেমন সন্নিবেশ হিসাবে আলগোরিদিমগুলিকে পরিবর্তনের জন্য করবেন। উত্সের শর্তে, কোডটি আবশ্যক কোড থেকে আলাদা হবে না যা ইনস-প্লেস আপডেটগুলি করে। ভারসাম্যহীন বাইনারি গাছগুলির জন্য পার্থক্যগুলি ইতিমধ্যে পরিচালনা করা হয়েছে। যতক্ষণ না আপনি নোডগুলিতে পিতামাতার লিঙ্কগুলি যুক্ত করার চেষ্টা করবেন না, নকলগুলি সর্বনিম্নভাবে সাধারণ সাবট্রিজগুলি ভাগ করে নেবে এবং হাস্কেলের গভীর অপ্টিমাইজেশন নিখুঁত না হলেও সঠিক is আমি নীতিগতভাবে নিজেকে হাস্কেলের বিরোধী, তবে এটি কোনও সমস্যা নয়।
স্টিভ 314

2

খুব সাধারণ ভারসাম্যযুক্ত গাছ হ'ল একটি এএ ট্রি । এটি আক্রমণকারী সহজ এবং এভাবে কার্যকর করা সহজ। এর সরলতার কারণে, এর অভিনয়টি এখনও ভাল।

উন্নত অনুশীলন হিসাবে, আপনি ভারসাম্যযুক্ত গাছগুলির একটির রূপটি প্রয়োগ করতে GADT ব্যবহার করার চেষ্টা করতে পারেন যার প্রকারভেদ প্রকার সিস্টেমের ধরণের দ্বারা প্রয়োগ করা হয়।

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