কোন পরিস্থিতিতে লিঙ্কযুক্ত তালিকাগুলি দরকারী?


110

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

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

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


34
আপনার দ্বিতীয় অনুচ্ছেদের উত্তরটি একটি সেমিস্টারের প্রায় সময় নেয়।
সেবা আলেকসেয়েভ

2
আমার মতের জন্য, punchlet.wordpress.com/2009/12/27/letter-the-fourth দেখুন । এবং এটি যেমন জরিপ বলে মনে হচ্ছে, এটি সম্ভবত সিডব্লিউ হওয়া উচিত।

1
@ নীল, দুর্দান্ত, যদিও আমি সন্দেহ করি সিএস লুইস এটি অনুমোদন করবে।
টম

@ নীল: আমার ধারণা এক ধরনের জরিপ। বেশিরভাগ ক্ষেত্রে এটি দেখার চেষ্টা যে কেউ যদি কোনও উত্তর নিয়ে আসতে পারে তবে এর একটি ভিত্তি থাকতে পারে যা আমি কমপক্ষে যুক্তিসঙ্গত হিসাবে কিনতে পারি। @ শেভা: হ্যাঁ, এটিকে আবার পড়তে গিয়ে আমি শেষ বাক্যটি মূলত যা চেয়েছিলাম তার চেয়ে কিছুটা সাধারণ করেছিলাম।
জেরি কফিন

2
@ ইয়ার লোক (আমাকে সহ, আমি দুঃখের সাথে বলতে চাই) ফোরট্রান চতুর্থ (যেমন পয়েন্টারের কোনও ধারণা ছিল না) মতো ভাষাগুলিতে বিন্দুবিহীন লিঙ্কযুক্ত তালিকাগুলি প্রয়োগ করত, যতটা তারা গাছ করেছিল। আপনি "রিয়েল" মেমরির পরিবর্তে অ্যারে ব্যবহার করেছেন।

উত্তর:


40

এগুলি সমবর্তী ডেটা স্ট্রাকচারের জন্য কার্যকর হতে পারে। (নীচে এখন নিখরচায় বাস্তব-বিশ্বের ব্যবহারের নমুনা রয়েছে - এটি যদি @ নীল ফরট্রেনের উল্লেখ না করে থাকে তবে সেখানে থাকত না; ;-)

উদাহরণস্বরূপ, ConcurrentDictionary<TKey, TValue>.NET 4.0 আরসি তে একই বালতিতে হ্যাশ করা আইটেমগুলিতে লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করে।

এর জন্য অন্তর্নিহিত ডেটা কাঠামোটি ConcurrentStack<T>একটি লিঙ্কযুক্ত তালিকা।

ConcurrentStack<T>ডেটা স্ট্রাকচারগুলির মধ্যে একটি যা নতুন থ্রেড পুলের ভিত্তি হিসাবে কাজ করে , (স্থানীয়ভাবে "সারি" স্ট্যাক হিসাবে প্রয়োগ করা হয়, মূলত)। (অন্যান্য প্রধান সহায়ক কাঠামো হচ্ছে ConcurrentQueue<T>))

পরিবর্তে নতুন থ্রেড পুলটি নতুন টাস্ক সমান্তরাল গ্রন্থাগারের কাজের সময়সূচীটির জন্য ভিত্তি সরবরাহ করে ।

সুতরাং তারা অবশ্যই কার্যকর হতে পারে - একটি লিঙ্কযুক্ত তালিকা বর্তমানে কমপক্ষে একটি দুর্দান্ত নতুন প্রযুক্তির অন্যতম প্রধান সহায়ক কাঠামো হিসাবে পরিবেশন করছে।

(এককভাবে সংযুক্ত তালিকা একটি বাধ্যতামূলক লক-মুক্ত করে - তবে অপেক্ষা-মুক্ত নয় - এই ক্ষেত্রে পছন্দ পছন্দ করে, কারণ মূল ক্রিয়াকলাপগুলি একটি সিএএস (+ পুনরায় চেষ্টা) সহ পরিচালিত হতে পারে a আধুনিক জিসি-ডি পরিবেশে - যেমন জাভা এবং। নেট - এ বি এ সমস্যাটি সহজেই এড়ানো যায় you আপনি নতুনভাবে তৈরি নোডগুলিতে যে আইটেমগুলি যুক্ত করেন তা মোড়ানো এবং সেই নোডগুলি পুনরায় ব্যবহার করবেন না - জিসিকে এটির কাজটি করতে দিন the এবিএ সমস্যাটির পৃষ্ঠাটি একটি লক- নিখরচায় স্ট্যাক - এটি আসলে (জেসি-এড) নোডের সাথে আইটেম ধারণ করে নেট (এবং জাভা) এ কাজ করে)

সম্পাদনা : @Neil: আসলে, আপনি ফোরট্রান সম্পর্কে কি উল্লেখ যে আমার স্মরণ করিয়ে লিঙ্ক তালিকা একই ধরনের সম্ভবত .NET সবচেয়ে ব্যবহৃত এবং ডাটা স্ট্রাকচার খুঁজে পাওয়া যেতে পারে: সাধারণ .NET জেনেরিক Dictionary<TKey, TValue>

একটি নয়, অনেক লিঙ্কযুক্ত তালিকা একটি অ্যারেতে সংরক্ষিত আছে।

  • এটি সন্নিবেশ / মুছে ফেলার ক্ষেত্রে অনেকগুলি ছোট (ডি) বরাদ্দ করা এড়ানো যায়।
  • হ্যাশ টেবিলের প্রাথমিক লোডটি বেশ দ্রুত, কারণ অ্যারেটি ক্রমানুসারে পূরণ করা হয় (সিপিইউ ক্যাশে খুব সুন্দর অভিনয় করে)।
  • একটি চেইনিং হ্যাশ টেবিল মেমরির দিক থেকে ব্যয়বহুল - এবং এই "কৌশল" x64 এর অর্ধেকের মধ্যে "পয়েন্টার আকারগুলি" কেটে দেয় mention

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


2
আপনি যদি মিস করেছেন তবে নীলের মন্তব্য এখানে রয়েছে: "লোকেরা (আমাকে সহ, আমি দুঃখের সাথে বলতে) ফোরট্রান চতুর্থ (যেমন পয়েন্টারের কোনও ধারণা ছিল না) মতো ভাষায় বিন্দুবিহীন লিঙ্কযুক্ত তালিকাগুলি প্রয়োগ করত, যেমন তারা গাছ করেছে "আপনি" রিয়েল "মেমরির পরিবর্তে অ্যারে ব্যবহার করেছেন।"
আন্দ্রেস ভাস

আমার যোগ করা উচিত যে " Dictionaryনেট এ লিঙ্কযুক্ত তালিকাগুলি" NET এর ক্ষেত্রে উল্লেখযোগ্যভাবে আরও সংরক্ষণ করে: অন্যথায় প্রতিটি নোডের গাদাতে পৃথক বস্তুর প্রয়োজন হবে - এবং গাদাতে বরাদ্দকৃত প্রতিটি বস্তুর কিছুটা ওভারহেড থাকবে। ( en.csharp-online.net/Common_Type_System%E2%80%94 অবজেক্ট_ লেআউট )
ভাস

এটি জেনে রাখাও ভাল যে সি ++ এর ডিফল্ট std::listকোনও লক ছাড়াই বহুবিবাহিত প্রসঙ্গে নিরাপদ নয়।
হাঁস মুচিং

49

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

বিভক্তকরণ এবং যোগদান (দ্বিদ্বারা-যুক্ত) লিঙ্কগুলি খুব দক্ষ।

আপনি লিঙ্কযুক্ত তালিকাগুলিও একত্রিত করতে পারেন - উদাহরণস্বরূপ গাছের কাঠামোগুলি অনুভূমিক লিঙ্কযুক্ত তালিকার (ভাইবোন) একসাথে সংযোগ স্থাপন করে "উল্লম্ব" লিঙ্কযুক্ত তালিকার (পিতামাতার / সন্তানের সম্পর্ক) হিসাবে প্রয়োগ করা যেতে পারে।

এই উদ্দেশ্যে একটি অ্যারে ভিত্তিক তালিকা ব্যবহারের মারাত্মক সীমাবদ্ধতা রয়েছে:

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

5
তাই প্রশ্ন করতে হ্রাস করা, যখন কি আপনি একটা ক্রম মাঝখানে এ সন্নিবেশ এবং সরানো অনেক কাজ করতে হবে কিন্তু তালিকায় খুব বেশি লুক-পূরণবাচক দ্বারা? কোনও লিঙ্কযুক্ত তালিকার সন্ধান করা সাধারণত অ্যারের অনুলিপি করার চেয়ে বেশি বা ব্যয়বহুল, সুতরাং অ্যারে আইটেমগুলি সরিয়ে ফেলতে এবং সন্নিবেশ করানোর বিষয়ে আপনি যা কিছু বলেন তা তালিকার এলোমেলো অ্যাক্সেসের জন্যও খারাপ। এলআরইউ ক্যাশে একটি উদাহরণ যা আমি ভাবতে পারি, আপনাকে মাঝখানে অনেকটা সরিয়ে ফেলতে হবে, তবে আপনাকে কখনই তালিকায় হাঁটার দরকার নেই।
স্টিভ জেসোপ

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

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

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

1
@ জেরি: আমি বুঝতে পেরেছি। আমার বক্তব্যটি হ'ল অ্যারে পুনর্নির্মাণের ব্যয়ের একটি বড় অংশ মেমরির বরাদ্দ করে না , এটির জন্য সম্পূর্ণ অ্যারের সামগ্রীগুলি নতুন স্মৃতিতে অনুলিপি করা দরকার । একটি অ্যারের আইটেম 0 এ প্রবেশ করতে আপনাকে অবশ্যই মেমরির এক অবস্থান ধরে পুরো অ্যারের সামগ্রীগুলি অনুলিপি করতে হবে । আমি বলছি না অ্যারেগুলি খারাপ; কেবলমাত্র এমন পরিস্থিতি রয়েছে যেখানে এলোমেলো অ্যাক্সেসের প্রয়োজন হয় না এবং যেখানে এলএলগুলির আসল ধ্রুবক-সময় সন্নিবেশ / মুছুন / রিলিং করা ভাল।
জেসন উইলিয়ামস

20

লিঙ্কযুক্ত তালিকাগুলি অত্যন্ত নমনীয়: একটি পয়েন্টার পরিবর্তনের মাধ্যমে আপনি একটি বিশাল পরিবর্তন করতে পারবেন, যেখানে অ্যারে তালিকায় একই ক্রিয়াকলাপটি খুব অকার্যকর হবে।


সেট বা মানচিত্র নয় কেন একটি তালিকা কেন ব্যবহার করছেন তা অনুপ্রাণিত করা সম্ভব হবে?
দেশপ্রেমিক

14

অ্যারে হ'ল ডেটা স্ট্রাকচার যা সাধারণত লিঙ্কযুক্ত তালিকাগুলির সাথে তুলনা করা হয়।

সাধারণত লিঙ্কযুক্ত তালিকাগুলি কার্যকর হয় যখন আপনাকে তালিকায় নিজেই প্রচুর পরিমার্জন করতে হয় যখন অ্যারে সরাসরি উপাদান অ্যাক্সেসের তালিকার চেয়ে আরও ভাল সম্পাদন করে।

আপেক্ষিক অপারেশন ব্যয়ের তুলনায় তালিকাগুলি এবং অ্যারেগুলিতে সম্পাদন করা যেতে পারে এমন অপারেশনের একটি তালিকা এখানে রয়েছে:

  • একটি উপাদান যুক্ত করা:
    • তালিকায় আপনাকে কেবলমাত্র নতুন উপাদান এবং পুনর্নির্দেশের পয়েন্টারগুলির জন্য মেমরি বরাদ্দ করতে হবে। হে (1)
    • অ্যারেতে আপনাকে অ্যারে স্থানান্তর করতে হবে। চালু)
  • একটি উপাদান সরানো হচ্ছে
    • তালিকাগুলিতে আপনি কেবল পয়েন্টার পুনর্নির্দেশ করুন। হে (1)।
    • অ্যারেগুলিতে আপনি অ্যারে স্থানান্তর করতে ও (এন) সময় ব্যয় করেন যদি সরানোর উপাদানটি অ্যারের প্রথম বা শেষ উপাদান না হয়; অন্যথায় আপনি কেবল অ্যারের শুরুতে পয়েন্টারটি স্থানান্তর করতে পারেন বা অ্যারের দৈর্ঘ্য হ্রাস করতে পারেন
  • একটি পরিচিত অবস্থানে একটি উপাদান পাওয়া:
    • তালিকাগুলিতে আপনাকে প্রথমে উপাদানটি নির্দিষ্ট অবস্থানের তালিকায় যেতে হবে। সবচেয়ে খারাপ কেস: ও (এন)
    • অ্যারেতে আপনি অবিলম্বে উপাদানটি অ্যাক্সেস করতে পারেন। হে (1)

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

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

এই পার্থক্যগুলি জানা বিকাশকারীদের তাদের বাস্তবায়নে তালিকা এবং অ্যারেগুলির মধ্যে চয়ন করার জন্য গুরুত্বপূর্ণ to

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


তালিকার ভাল প্রয়োগ এবং অ্যারেগুলির একটি ভয়াবহ বাস্তবায়নের জন্য এটি কিছুটা সত্য। বেশিরভাগ অ্যারে বাস্তবায়নগুলি আপনি তাদের ক্রেডিট দেওয়ার চেয়ে অনেক বেশি পরিশীলিত। এবং আমি মনে করি না আপনি গতিশীল মেমরির বরাদ্দ কতটা ব্যয়বহুল তা বুঝতে পারেন।

এই উত্তরটি কোনও ডেটা স্ট্রাকচার বিশ্ববিদ্যালয় কোর্সের প্রোগ্রামটি কভার করার কথা নয়। লিঙ্কযুক্ত তালিকাগুলি এবং অ্যারেগুলিকে বিবেচনা করে এটি লিখিত তুলনা যা আপনি, আমি এবং বেশিরভাগ লোকেরা জানেন know জ্যামিতিকভাবে প্রসারিত অ্যারেগুলি, স্কিপ তালিকাগুলি ইত্যাদি ... এমন সমাধানগুলি যা আমি জানি, আমি ব্যবহার করি এবং আমি অধ্যয়ন করি তবে এর আরও গভীর ব্যাখ্যা প্রয়োজন এবং এটি স্ট্যাকওভারফ্লো উত্তরটির সাথে খাপ খায় না।
Andrea Zilio

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

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

4

একক সংযুক্ত তালিকাটি একটি সেল বরাদ্দকারী বা অবজেক্ট পুলের বিনামূল্যে তালিকার জন্য ভাল পছন্দ:

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

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

1
কতগুলো? ০ এরও বেশি, এক মিলিয়নেরও কম ;-) জেরির প্রশ্নটি কি "তালিকার ভাল ব্যবহার দেয়", বা "প্রতিটি প্রোগ্রামার প্রতিদিনের ভিত্তিতে ব্যবহার করে এমন তালিকার ভাল ব্যবহার দেয়", বা এর মধ্যে কিছু ছিল? আমি কোনও তালিকার নোডের জন্য "অনুপ্রবেশ" ছাড়া অন্য কোনও নাম জানি না যা তালিকার উপাদানটির মধ্যে রয়েছে যা ইউনিয়নের অংশ হিসাবে রয়েছে (সি পদে) বা না রয়েছে। পয়েন্ট 3 কেবলমাত্র সেই ভাষাগুলিতে প্রয়োগ হয় যা আপনাকে এটি করতে দেয় - সি, সি ++, এসেম্বলার ভাল। জাভা খারাপ।
স্টিভ জেসোপ

4

দ্বি-সংযুক্ত তালিকা হ্যাশম্যাপের ক্রম সংজ্ঞায়িত করার জন্য একটি ভাল পছন্দ যা উপাদানগুলির (অর্ডারগুলিতে জাভাতে লিংকডহ্যাশম্যাপ) একটি অর্ডারও সংজ্ঞায়িত করে, বিশেষত শেষ অ্যাক্সেসের মাধ্যমে আদেশ করা হলে:

  1. সম্পর্কিত ভেক্টর বা ডেকের চেয়ে বেশি মেমরির ওভারহেড (1 এর পরিবর্তে 2 পয়েন্টার), তবে কার্যকারিতা সন্নিবেশ / সরান remove
  2. ওভারহেড কোনও বরাদ্দ নেই, যেহেতু আপনার কোনও হ্যাশ প্রবেশের জন্য নোড দরকার।
  3. কোনও ভেক্টর বা পয়েন্টারের ডিউয়ের সাথে তুলনা করে রেফারেন্সের স্থানীয়তা কোনও অতিরিক্ত সমস্যা নয়, যেহেতু আপনাকে প্রতিটি বস্তুকে যেভাবেই মেমোরিতে টানতে হবে।

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


4

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

উদাহরণস্বরূপ যখন সি ++ এ মেমরি ট্র্যাকিং প্রয়োগ করার সময় (নতুন / প্রতিস্থাপন মুছুন) আপনার প্রয়োজন হয় এমন কিছু নিয়ন্ত্রণ ডেটা স্ট্রাকচারের প্রয়োজন যা কোন পয়েন্টারগুলি মুক্ত হয়েছে তা ট্র্যাক করে রাখে, যা আপনাকে নিজেকে পুরোপুরি বাস্তবায়ন করতে হবে। বিকল্পটি সামগ্রিকভাবে যুক্ত করা এবং প্রতিটি ডেটা অংশের শুরুতে একটি লিঙ্কযুক্ত তালিকা যুক্ত করা।

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


3

আপনার যখন উচ্চ-গতির ধাক্কা, পপ এবং ঘোরানো দরকার হয় তখন ওগুলি কার্যকর হয় এবং ও (এন) এর সূচিকরণে কিছু মনে করবেন না।


আপনি কি কখনও কোনও সি (+) বলার সাথে তুলনা করে সি ++ লিঙ্কযুক্ত তালিকাগুলি সময় নিয়ে বিরক্ত করেছেন?

@ নীল: আমার আছে তা বলতে পারি না।
ইগনাসিও ওয়াজকেজ-আব্রামগুলি

@ নীল: যদি সি ++ অন্য কোনও ধারক (যা সত্য থেকে দূরে নয়) এর চেয়ে ধীর করে দেওয়ার জন্য যদি এটি লিঙ্কযুক্ত তালিকার শ্রেণিটি ইচ্ছাকৃতভাবে নাশকতা সৃষ্টি করে থাকে তবে ভাষা-অজ্ঞাত প্রশ্নটির সাথে এর কী করার আছে? একটি অনুপ্রবেশ লিঙ্ক তালিকাটি এখনও একটি লিঙ্কযুক্ত তালিকা।
স্টিভ জেসোপ

@ স্টিভ সি ++ একটি ভাষা। আমি দেখতে পাচ্ছি না যে এতে কীভাবে বিদ্যুত্পাদন করা যায়। আপনি যদি পরামর্শ দিচ্ছেন যে সি ++ কমিটির সদস্যরা কোনওভাবে লিঙ্কযুক্ত তালিকাগুলিতে নাশকতা চালিয়েছেন (যা যুক্তিযুক্তভাবে অনেক ক্রিয়াকলাপের জন্য ধীর হতে হবে), তবে দোষী ব্যক্তিদের নাম দিন!

3
এটি আসলে নাশকতা নয় - বাহ্যিক তালিকা নোডগুলির সুবিধা রয়েছে, তবে কার্য সম্পাদন সেগুলির মধ্যে একটি নয়। তবে, অবশ্যই আপনি সচেতন সেই একই জিনিসটির বাণিজ্য বন্ধ করার সময় সকলেই সচেতন ছিলেন, এটি হ'ল এটির পক্ষে ভাল ব্যবহার করা বেশ কঠিন std::list। একটি অনুপ্রবেশকারী তালিকা কেবল ধারক উপাদানগুলির ন্যূনতম প্রয়োজনীয়তার সি ++ দর্শনের সাথে খাপ খায় না।
স্টিভ জেসোপ

3

একক সংযুক্ত তালিকাগুলি ক্রিয়ামূলক প্রোগ্রামিং ভাষায় সাধারণ "তালিকা" ডেটা টাইপের সুস্পষ্ট বাস্তবায়ন:

  1. মাথা জোড়া হচ্ছে দ্রুত, এবং (append (list x) (L))এবং (append (list y) (L))তাদের তথ্য প্রায় সব শেয়ার করতে পারেন। কোনও লেখক নেই এমন ভাষায় অনুলিপি লেখার দরকার নেই। কার্যকরী প্রোগ্রামাররা এর সুবিধা নিতে কীভাবে জানেন know
  2. দুর্ভাগ্যক্রমে লেজের সাথে যুক্ত করা ধীর, তবে অন্য কোনও বাস্তবায়ন হবে।

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


3

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


2

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


1

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

হ্যাশ মানচিত্রগুলি অবশ্যই ও (1) এ সন্নিবেশ এবং মুছে ফেলতে পারে তবে তারপরে আপনি উপাদানগুলিকে ক্রমে পুনরাবৃত্তি করতে পারবেন না।

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

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


1

বিবেচনা করুন যে কোনও লিঙ্কযুক্ত তালিকাটি কোনও সিস্টেমের ডোমেন চালিত ডিজাইন শৈলীর প্রয়োগে খুব কার্যকর হতে পারে যার অংশগুলি পুনরাবৃত্তির সাথে অন্তর্ভুক্ত রয়েছে includes

মনে মনে আসে এমন একটি উদাহরণ হতে পারে যদি আপনি ঝুলন্ত চেইনের মডেলিং করেন। যদি আপনি জানতে চান যে কোনও নির্দিষ্ট লিঙ্কে উত্তেজনা কী, তবে আপনার ইন্টারফেসে "আপাত" ওজনের জন্য একজন অন্তর্ভুক্ত থাকতে পারে। যার বাস্তবায়নে তার পরবর্তী লিংকে তার আপাত ওজনের জন্য জিজ্ঞাসা করা কোনও লিঙ্ক অন্তর্ভুক্ত থাকবে, তারপরে ফলাফলটিতে তার নিজস্ব ওজন যুক্ত করা হবে। এইভাবে, পুরো দৈর্ঘ্যটি নীচে অবধি চেইনের ক্লায়েন্টের একক কল দিয়ে মূল্যায়ন করা হবে।

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


1

জাল এবং ইমেজ প্রসেসিং, পদার্থবিজ্ঞান ইঞ্জিন এবং রাইট্র্যাকিংয়ের মতো পারফরম্যান্স-সমালোচনামূলক ক্ষেত্রে কাজ করা লিঙ্কযুক্ত তালিকার জন্য আমি সবচেয়ে দরকারী ক্ষেত্রে খুঁজে পেয়েছি হ'ল লিঙ্কযুক্ত তালিকাগুলি আসলে রেফারেন্সের স্থানীয়ত্ব উন্নত করে এবং গাদা বরাদ্দ হ্রাস করে এবং কখনও কখনও এমনকি তুলনায় মেমরির ব্যবহার হ্রাস করে সোজা বিকল্প।

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

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

এখানে সমস্যাটি হ'ল এক মিলিয়ন std::vectorদৃষ্টান্তগুলি মিলিয়ন পরিবর্তনশীল দৈর্ঘ্যের জিনিসগুলি সংরক্ষণ করার চেষ্টা করবে। পরিবর্তনশীল-দৈর্ঘ্যের জিনিসগুলি হিপ বরাদ্দ চায় যেহেতু এগুলি খুব কার্যকরভাবে নিখুঁতভাবে সংরক্ষণ করা যায় না এবং ধ্রুবক সময়ে (কমপক্ষে একটি খুব জটিল বরাদ্দকারী ছাড়াই সোজা পদ্ধতিতে) অপসারণ করা যায় না যদি তারা তাদের বিষয়বস্তু স্তূপে অন্য কোথাও না সঞ্চয় করে।

পরিবর্তে, যদি আমরা এটি করি:

struct FaceVertex
{
    // Points to next vertex in polygon or -1
    // if we're at the end of the polygon.
    int next;
    ...
};

struct Polygon
{
     // Points to first vertex in polygon.
    int first_vertex;
    ...
};

struct Mesh
{
    // Stores all the face vertices for all polygons.
    std::vector<FaceVertex> fvs;

    // Stores all the polygons.
    std::vector<Polygon> polys;
};

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

এখানে আরও একটি উদাহরণ:

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

... যেখানে গ্রিড সেলগুলি কণা-কণা সংঘর্ষকে ত্বরান্বিত করার জন্য ব্যবহৃত হয়, বলুন, প্রতি একক ফ্রেমে সরিয়ে 16 মিলিয়ন কণা। সেই কণা গ্রিডের উদাহরণে, লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করে আমরা একটি কণা কেবল একটি গ্রিড সেল থেকে অন্য গ্রহে সরাতে পারি কেবল 3 টি সূচক পরিবর্তন করে। কোনও ভেক্টর থেকে মুছে ফেলা এবং অন্যটিতে ফিরে যাওয়া যথেষ্ট ব্যয়বহুল হতে পারে এবং আরও গাদা বরাদ্দ প্রবর্তন করতে পারে। লিঙ্কযুক্ত তালিকাগুলি একটি ঘরের স্মৃতিও 32-বিটকে হ্রাস করে। বাস্তবায়নের উপর নির্ভর করে একটি ভেক্টর তার গতিশীল অ্যারেটিকে এমনভাবে বিন্যাস করতে পারে যেখানে এটি খালি ভেক্টরের জন্য 32 বাইট নিতে পারে। আমাদের যদি প্রায় এক মিলিয়ন গ্রিড সেল থাকে তবে এটি বেশ পার্থক্য।

... এবং এখানেই আমি লিঙ্কযুক্ত তালিকাগুলি আজকাল সবচেয়ে দরকারী খুঁজে পেয়েছি এবং আমি বিশেষত "ইনডেক্সড লিঙ্কড লিস্ট" প্রকারটি খুঁজে পাই যেহেতু 32-বিট সূচকগুলি 64-বিট মেশিনে লিঙ্কগুলির মেমরির প্রয়োজনীয়তাগুলি অর্ধেক করে দেয় এবং তারা বোঝায় যে নোডগুলি একটি অ্যারেতে স্বচ্ছলভাবে সংরক্ষণ করা হয়।

প্রায়শই আমি স্থির-সময় অপসারণ এবং সন্নিবেশকে কোথাও মঞ্জুরি দেওয়ার জন্য সূচিযুক্ত ফ্রি তালিকার সাথে তাদের একত্রিত করি:

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

সেক্ষেত্রে nextসূচকটি হয় নোড অপসারণ করা হলে পরবর্তী ফ্রি সূচকের দিকে নির্দেশ করে বা নোড অপসারণ না করা হলে পরবর্তী ব্যবহৃত সূচকটি নির্দেশ করে।

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


0

আমি অতীতে সি / সি ++ অ্যাপ্লিকেশনটিতে লিঙ্কযুক্ত তালিকাগুলি (এমনকি দ্বিগুণ সংযুক্ত তালিকাগুলি) ব্যবহার করেছি। এটি নেট এবং এমনকি স্টল আগে ছিল।

আমি সম্ভবত একটি নেট লিঙ্কে এখন একটি লিঙ্কযুক্ত তালিকা ব্যবহার করব না কারণ আপনার যে সমস্ত ট্র্যাভারসাল কোডটি আপনার প্রয়োজন তা লিনক এক্সটেনশন পদ্ধতির মাধ্যমে সরবরাহ করা হয়েছে।

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