লিঙ্কযুক্ত তালিকার সর্বদা একটি লেজের পয়েন্টার থাকা উচিত?


11

আমার বোঝার ...

সুবিধাদি:

  • শেষে সন্নিবেশ করা হচ্ছে ও (এন) এর পরিবর্তে ও (1)।
  • যদি তালিকাটি দ্বিগুণ লিঙ্কযুক্ত তালিকা হয় তবে শেষ থেকে অপসারণ করা ও (এন) এর পরিবর্তে ও (1) হয়।

অসুবিধা:

  • অতিরিক্ত মেমরির একটি তুচ্ছ পরিমাণ গ্রহণ করে: 4-8 বাইট
  • প্রয়োগকারীকে লেজের খোঁজখবর রাখতে হয়।

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


1
একটি লেজ পয়েন্টার 4-8 বাইট (32 বা 64 বিট সিস্টেমের উপর নির্ভর করে)
রাচেট ফ্রিক

1
মনে হচ্ছে আপনি ইতিমধ্যে এটির সংক্ষিপ্তসার করেছেন।
রবার্ট হার্ভে

@ রবার্টহারভে আমি এখনই ডেটা স্ট্রাকচার অধ্যয়ন করছি এবং সেরা পদ্ধতিগুলি কী তা সম্পর্কে অবগত নই। সুতরাং আমি যা লিখেছি তা আমার ইমপ্রেশন, তবে আমি যা জিজ্ঞাসা করছি তা যদি তারা সঠিক হয়। তবে স্পষ্ট করার জন্য আপনাকে ধন্যবাদ!
অ্যাডাম জেরনার 22

7
"সেরা অনুশীলন" হ'ল জনগণের অভিমত । আপনি এখনও নিজের জন্য চিন্তা করার ক্ষমতা আছে যে সত্য উদযাপন।
রবার্ট হার্ভে

লিঙ্কের জন্য ধন্যবাদ রবার্টহারভে - আমি এই পয়েন্টটি ভালবাসি! আমি অবশ্যই একটি ব্যয়-বেনিফিট গ্রহণ করি যা পরিস্থিতির সুনির্দিষ্ট বিষয়গুলিকে দেখে looks
অ্যাডাম জেরনার 22

উত্তর:


7

আপনি সঠিক, একটি লেজ পয়েন্টার কখনও আঘাত করে না এবং শুধুমাত্র সাহায্য করতে পারে। যাইহোক, এমন একটি পরিস্থিতি রয়েছে যেখানে কারও কাছে মোটেই লেজ পয়েন্টার প্রয়োজন হয় না।

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


9

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


3
তারা কেন অধ্যবসায় এবং অপরিবর্তনীয়তা ভঙ্গ করে তা বোঝাতে আপনার আপত্তি হবে?
অ্যাডাম জেরনার 23

দয়া করে ক্যাশে বন্ধুত্বের উদ্বেগ যুক্ত করুন
বাসিলিভস

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

প্রকৃতপক্ষে অপরিবর্তনীয়তার সাথে একটি লেজ পয়েন্টারটি অকেজো হওয়ার পাশেই থাকে কারণ আপনি কেবল এটির সাথে কাজটি করতে পারেন তা হল শেষ উপাদানটি কী see মাথা থেকে কাজ করা বাকি সমস্ত কিছুর প্রয়োজন।
ratchet freak

0

আমি লিঙ্কযুক্ত তালিকার জন্য খুব কমই লেজ পয়েন্টার ব্যবহার করি এবং একাধিকবার একক-লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করি where এটি কারণ আমার সাধারণ ব্যবহারের ক্ষেত্রে লেজ পয়েন্টারটি আসলে ব্যয়বহুল, যেমনটি এককভাবে সংযুক্ত তালিকাকে দ্বিগুণ-সংযুক্ত তালিকায় তৈরি করা ব্যয়বহুল।

এককভাবে সংযুক্ত তালিকার জন্য প্রায়শই আমার সাধারণ ক্ষেত্রে ব্যবহার হতে পারে এমন কয়েক হাজার লিঙ্কযুক্ত তালিকাগুলি সঞ্চয় করে যা কেবলমাত্র প্রতিটি তালিকার কয়েকটি তালিকা নোড ধারণ করে। আমি সাধারণত লিঙ্কযুক্ত তালিকার জন্য পয়েন্টার ব্যবহার করি না। আমি সূচকগুলি পরিবর্তে একটি অ্যারেতে ব্যবহার করি যেহেতু সূচকগুলি 32-বিট হতে পারে, যেমন bit৪-বিট পয়েন্টারের অর্ধেক স্থান গ্রহণ করে taking আমি সাধারণত তালিকা নোডগুলি একবারে একবারে বরাদ্দ করি না এবং তার পরিবর্তে, আবার সমস্ত নোড সংরক্ষণ করতে একটি বড় অ্যারে ব্যবহার করি এবং তারপরে নোডগুলিকে লিঙ্ক করতে 32-বিট সূচক ব্যবহার করি।

উদাহরণ হিসাবে, একটি ভিডিও গেমটি 400x400 গ্রিড ব্যবহার করে এমন মিলিয়ন কণাকে বিভাজন করতে যায় যা সংঘর্ষ সনাক্তকরণকে ত্বরান্বিত করার জন্য একে অপরের কাছাকাছি চলে যায়। সেক্ষেত্রে, সংরক্ষণ করার একটি দুর্দান্ত দক্ষ উপায় হ'ল 160,000 একক-লিঙ্কযুক্ত তালিকাগুলি সঞ্চয় করা, যা আমার ক্ষেত্রে 160,000 32-বিট পূর্ণসংখ্যায় (640 কিলোবাইট) এবং কণা অনুসারে একটি 32-বিট পূর্ণসংখ্যার ওভারহেডে অনুবাদ করে। কণাগুলি যখন স্ক্রিনে ঘুরে বেড়াচ্ছে, আমাদের কেবলমাত্র একটি কণাটি অন্য একটি কণায় স্থানান্তরিত করার জন্য কয়েকটি 32-বিট পূর্ণসংখ্যা আপডেট করতে হবে:

এখানে চিত্র বর্ণনা লিখুন

... nextকণা নোডের সূচক ("পয়েন্টার") এর সাথে কক্ষের পরবর্তী কণায় সূচক হিসাবে পরিবেশন করা হয় বা কণাটি মারা গেছে কিনা তা পুনরুদ্ধারের জন্য পরবর্তী মুক্ত কণা (মূলত সূচকগুলি ব্যবহার করে একটি ফ্রি লিস্ট বরাদ্দকরণ বাস্তবায়ন):

এখানে চিত্র বর্ণনা লিখুন

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

একটি লেজ পয়েন্টার গ্রিডের মেমরির ব্যবহার দ্বিগুণ করার পাশাপাশি ক্যাশে মিসের সংখ্যা বাড়িয়ে তুলবে। তালিকাটি শাখাবিহীন হওয়ার পরিবর্তে খালি কিনা তা পরীক্ষা করার জন্য এটিতে একটি শাখা প্রয়োজন require এটি দ্বিগুণ-সংযুক্ত তালিকা তৈরি করা প্রতিটি কণার তালিকার ওভারহেডের দ্বিগুণ হবে। আমি লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করার সময় 90%, এটি এই জাতীয় ক্ষেত্রে যেমন হয় এবং সুতরাং একটি লেজ পয়েন্টারটি সংরক্ষণ করা তুলনামূলকভাবে বেশ ব্যয়বহুল হবে।

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

আমি প্রায়শই বহু লোককে লিঙ্কযুক্ত তালিকায় পৌঁছাতে দেখি যেগুলি তাদের সামনের / মাঝারি অপসারণ এবং সামনের / মাঝের সন্নিবেশের সাথে যুক্ত ধ্রুবক জটিলতার জন্য যখন এলএলগুলি প্রায়শই সাধারনতার অভাবের কারণে এই ক্ষেত্রে দুর্বল পছন্দ হয়। যেখানে এলএলগুলি পারফরম্যান্সের দিক থেকে আমার কাছে সুন্দর, কেবলমাত্র কয়েকটি পয়েন্টার পরিচালনা করে একটি তালিকা থেকে অন্য তালিকায় সরানো এবং ভেরিয়েবল-মাপের মেমরি বরাদ্দকারী ছাড়াই ভেরিয়েবল-সাইজের ডেটা স্ট্রাকচার অর্জন করতে সক্ষম হবার ক্ষমতা since প্রতিটি নোডের অভিন্ন আকার থাকে, আমরা নিখরচায় তালিকা ব্যবহার করতে পারি eg যদি প্রতিটি তালিকা নোড পৃথকভাবে একটি সাধারণ-উদ্দেশ্য বরাদ্দকারীদের বিরুদ্ধে বরাদ্দ করা হয়, সাধারণত লিঙ্কযুক্ত তালিকাগুলি বিকল্পগুলির তুলনায় আরও খারাপ হয়, এবং এটি '

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

এটি আমাদের মনে রাখতে হবে যে আজকাল আমাদের কাছে ড্রামের একটি নৌকা বোঝাই রয়েছে তবে এটি মেমরির দ্বিতীয় ধীরতম ধরণের। Core৪-বাইট ক্যাশে লাইনের সাথে এল 1 ক্যাশে আসার পরে আমরা এখনও প্রতি কোর 64 টাকার মতো কিছুতে রয়েছি at ফলস্বরূপ, এই সামান্য বাইট সঞ্চয়গুলি উপরের কণা সিমের মতো একটি পারফরম্যান্স-সমালোচনামূলক ক্ষেত্রের মধ্যে সত্যিই গুরুত্বপূর্ণ হয়ে উঠতে পারে যখন কয়েক মিলিয়ন গুণকে বহুগুণে পরিণত করে যদি এর অর্থ হ'ল ক্যাশে লাইনে বহু নোডের দ্বিগুণ সংরক্ষণের মধ্যে পার্থক্য, যেমন

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