যোগ্য এবং তালিকাভুক্ত এসটিএল ধারকগুলির মধ্যে পার্থক্য কী?


98

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

এটা কি ঠিক??


4
আমি পুনরাবৃত্তির পারফরম্যান্সে আগ্রহী .. ভিক্ষাবৃত্তি থেকে শেষ হওয়া মানে কি দ্রুত?
nkint

উত্তর:


62

(তারিখযুক্ত তবে এখনও খুব দরকারী) থেকে এসজিআই এসটিএল এর সংক্ষিপ্তসার deque:

একটি ডেকি অনেকটা ভেক্টরের মতো: ভেক্টরের মতো এটি একটি ক্রম যা ক্রমের শেষে উপাদানগুলিতে এলোমেলো অ্যাক্সেস, ধ্রুবক সময় সন্নিবেশ এবং উপাদানগুলিকে অপসারণ এবং লিনিয়ার সময় সন্নিবেশ এবং মাঝখানে উপাদানগুলি অপসারণকে সমর্থন করে।

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

এখানে listএকই সাইট থেকে সংক্ষিপ্তসারটি দেওয়া হয়েছে :

একটি তালিকা দ্বিগুণ সংযুক্ত তালিকা। এটি হ'ল এটি একটি সিকোয়েন্স যা সামনের বা শেষের দিকে বা মাঝখানে উভয়কে সামনের দিকে এবং পিছনের ট্র্যাভারসালকে সমর্থন করে এবং (amorised) ধ্রুবক সময় সন্নিবেশ এবং উপাদানগুলি অপসারণ করে। তালিকাগুলিতে গুরুত্বপূর্ণ সম্পত্তি রয়েছে যা সন্নিবেশ এবং বিভক্তকরণগুলি উপাদানগুলির তালিকার জন্য পুনরাবৃত্তিকে অকার্যকর করে না এবং এমনকি অপসারণটি কেবল পুনরাবৃত্তিকেই অবৈধ করে দেয় যা সরানো উপাদানগুলিকে নির্দেশ করে। পুনরাবৃত্তির ক্রম পরিবর্তন করা যেতে পারে (অর্থাৎ তালিকা :: তালিকার আগে তালিকার ক্রিয়াকলাপের পরে পুনরাবৃত্তির আলাদা পূর্বসূরি বা উত্তরসূরি থাকতে পারে) তবে পুনরুক্তিকারীরা নিজেরাই অবৈধ বা অকার্যকর হবে না যদি না সেই অবৈধতা না ঘটে বা রূপান্তর স্পষ্ট হয়।

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


4
স্ট্যান্ড :: তালিকার মধ্যে 'স্প্লাইস' পদ্ধতি রয়েছে যা আপনাকে দুটি তালিকাকে একসাথে একত্রিত করতে দেয়
রিক

25
আসলে, সময়ের গ্যারান্টি হল তালিকার দ্বিতীয় গুরুত্বপূর্ণ বৈশিষ্ট্য। সবচেয়ে তালিকার গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে জুড়তে এবং উপাদান সরাতে চান এবং আপনার iterators বাতিল করতে পারবে না হয়! (প্রায়?) প্রতিটি অন্যান্য এসটিএল ধারকটিতে, প্রতিটি সম্পাদনা ক্রিয়াকলাপ আপনার সমস্ত পুনরাবৃত্তিকে অবৈধ করে দেয় - সুতরাং "ম্যাচিং আইটেমগুলি মুছতে" আপনাকে একটি ক্রিয়াকলাপে মিলে যাওয়া আইটেমগুলি সংগ্রহ করতে হবে এবং তারপরে অন্যটিতে মুছতে হবে delete একটি তালিকাতে, আপনি এটির মধ্য দিয়ে চলতে পারেন, মুছে ফেলতে এবং আপনার ইচ্ছামত সংযোজন করতে পারেন এবং কোনও পুনরুক্তি পুনরায় গণনা করতে হবে না।
টম সোয়ারলি

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

130

আমি পার্থক্যগুলি তালিকাবদ্ধ করবো:

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

  • ডেক শেষ এবং শুরু উভয়ই দ্রুত সন্নিবেশ এবং মুছে ফেলা সরবরাহ করে। মাঝখানে উপাদান সন্নিবেশ করা এবং মোছা তুলনামূলকভাবে ধীর কারণ উভয় প্রান্তের উভয় প্রান্ত পর্যন্ত সমস্ত উপাদান স্থান তৈরি করতে বা ফাঁক পূরণ করতে সরানো যেতে পারে।
  • ইন তালিকা , ঢোকাতে এবং উপাদান সরানোর উভয় প্রান্ত সহ প্রতিটি অবস্থান, এ দ্রুত।

  • ডেক : শুরুতে বা শেষের ব্যতীত অন্য কোনও উপাদান সন্নিবেশ বা মুছে ফেলা সমস্ত পয়েন্টার, রেফারেন্স এবং পুনরাবৃত্তিকে অকার্যকর করে যা ডেকের উপাদানগুলিকে উল্লেখ করে।
  • তালিকা : উপাদান সন্নিবেশ করা এবং মোছা অন্য উপাদানগুলিতে পয়েন্টার, রেফারেন্স এবং পুনরাবৃত্তিকে অবৈধ করে না।

জটিলতা

             Insert/erase at the beginning       in middle        at the end

Deque:       Amortized constant                  Linear           Amortized constant
List:        Constant                            Constant         Constant

6
@ এজে: constantএবং এর মধ্যে পার্থক্য কী amortized constant?
Lazer

17
দীর্ঘমেয়াদে অপারেশনগুলি বর্ণিত হিসাবে আচরণ করে। তবে একটি একক ক্রিয়াকলাপ নির্দিষ্ট সময়ের চেয়ে বেশি সময় নিতে পারে। উদাহরণস্বরূপ: কোনও ভেক্টরটিতে একটি উপাদান সন্নিবেশ করা যার বর্তমান ক্ষমতা 10 এবং আকার ইতিমধ্যে 9 ধ্রুবক, যেখানে সময় 10 লিনিয়ার হিসাবে ক্ষমতা 10 এবং আকার 10 হয় কারণ এটি সমস্ত উপাদানকে বরাদ্দ করতে এবং নতুন মেমোরিতে অনুলিপি করতে হয় ।
এজে।

4
@ এজে: ডেক কীভাবে এলোমেলো অ্যাক্সেস সরবরাহ করে? এছাড়াও এই কাঠামো কীভাবে প্রয়োগ করা হয়?

9

std::list মূলত দ্বিগুণ সংযুক্ত তালিকা।

std::dequeঅন্যদিকে, আরও কার্যকর করা হয় std::vector। সূচক অনুসারে এর অবিচ্ছিন্ন অ্যাক্সেসের সময় রয়েছে পাশাপাশি শুরুর দিকে এবং শেষে সন্নিবেশ এবং অপসারণ রয়েছে যা তালিকার চেয়ে নাটকীয়ভাবে বিভিন্ন পারফরম্যান্স বৈশিষ্ট্য সরবরাহ করে।


5

আরেকটি গুরুত্বপূর্ণ গ্যারান্টি হ'ল প্রতিটি ভিন্ন ধারক যেভাবে তার ডেটা মেমরিতে সঞ্চয় করে:

  • একটি ভেক্টর একটি একক স্বচ্ছ মেমরি ব্লক।
  • ডেক একটি লিঙ্কযুক্ত মেমরি ব্লকের একটি সেট, যেখানে প্রতিটি মেমরি ব্লকে একাধিক উপাদান সংরক্ষণ করা হয়।
  • একটি তালিকা মেমরিতে বিচ্ছুরিত উপাদানের একটি সেট, যেমন: মেমরি "ব্লক" প্রতি কেবল একটি উপাদান সংরক্ষণ করা হয়।

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

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


4

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


2

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


1

এখানে তালিকার একটি প্রুফ অফ কনসেপ্ট কোড ব্যবহার রয়েছে, নিরক্ষিত মানচিত্র যা ও (1) চেহারা এবং ও (1) সঠিক এলআরইউ রক্ষণাবেক্ষণ দেয়। মুছে ফেলা অপারেশন থেকে বাঁচতে (অ-মোছা) পুনরাবৃত্তির প্রয়োজন। জিপিইউ মেমরির সিপিইউ পয়েন্টারগুলির জন্য নির্বিচারে বড় সফ্টওয়্যার পরিচালিত ক্যাশে একটি ও (1) এ ব্যবহার করার পরিকল্পনা করুন। লিনাক্স ও (1) শিডিয়ুলারকে নোডস (LRU <-> প্রতিটি প্রসেসরে রান সারি)। আনর্ডারড_ম্যাপের হ্যাশ টেবিলের মাধ্যমে অবিচ্ছিন্ন সময় অ্যাক্সেস রয়েছে।

#include <iostream> 
#include <list> 
#include <unordered_map>  
using namespace std; 

struct MapEntry {
  list<uint64_t>::iterator LRU_entry;
  uint64_t CpuPtr;
};
typedef unordered_map<uint64_t,MapEntry> Table;
typedef list<uint64_t> FIFO;
FIFO  LRU;        // LRU list at a given priority 
Table DeviceBuffer; // Table of device buffers

void Print(void){
  for (FIFO::iterator l = LRU.begin(); l != LRU.end(); l++) {
    std::cout<< "LRU    entry "<< *l << "   :    " ;
    std::cout<< "Buffer entry "<< DeviceBuffer[*l].CpuPtr <<endl;
  }  
}
int main() 
{ 

  LRU.push_back(0);
  LRU.push_back(1);
  LRU.push_back(2);
  LRU.push_back(3);
  LRU.push_back(4);

  for (FIFO::iterator i = LRU.begin(); i != LRU.end(); i++) {
    MapEntry ME = { i, *i}; 
    DeviceBuffer[*i] = ME;
  }

  std::cout<< "************ Initial set of CpuPtrs" <<endl;
  Print();

  {
    // Suppose evict an entry - find it via "key - memory address uin64_t" and remove from 
    // cache "tag" table AND LRU list with O(1) operations
    uint64_t key=2;
    LRU.erase(DeviceBuffer[2].LRU_entry);
    DeviceBuffer.erase(2);
  }

  std::cout<< "************ Remove item 2 " <<endl;
  Print();

  { 
    // Insert a new allocation in both tag table, and LRU ordering wiith O(1) operations
    uint64_t key=9;
    LRU.push_front(key); 
    MapEntry ME = { LRU.begin(), key };
    DeviceBuffer[key]=ME;
  }

  std::cout<< "************ Add item 9  " <<endl;
  Print();

  std::cout << "Victim "<<LRU.back()<<endl;
} 

আপনি কি এটি সঠিক জায়গায় পোস্ট করেছেন? এটি প্রশ্নের উত্তর দেয় না।
ব্লাস্টফর্নেস

1

মধ্যে dequeএবং মধ্যে বিশিষ্ট পার্থক্যlist

  • এর জন্য deque:

    পাশাপাশি পাশাপাশি রাখা পণ্য;

    দুই পক্ষ (সামনে, পিছনে) থেকে ডাতাস যুক্ত করার জন্য অনুকূলিত;

    সংখ্যার (পূর্ণসংখ্যা) দ্বারা সূচিযুক্ত উপাদানগুলি।

    পুনরাবৃত্তি এবং এমনকি উপাদান সূচক দ্বারা ব্রাউজ করা যেতে পারে।

    ডেটাতে সময় অ্যাক্সেস দ্রুত হয়।

  • জন্য list

    আইটেমগুলি "এলোমেলোভাবে" স্মৃতিতে সঞ্চিত;

    কেবল পুনরুক্তিকারীদের দ্বারা ব্রাউজ করা যেতে পারে;

    মাঝখানে সন্নিবেশ এবং অপসারণের জন্য অনুকূলিত।

    ডেটাতে অ্যাক্সেস সময় অ্যাক্সেস ধীর, পুনরাবৃত্তি থেকে ধীর, খুব খারাপ স্থানিক স্থানীয়তার কারণে।

    খুব ভাল বড় উপাদান পরিচালনা করে

আপনি নিম্নলিখিত লিঙ্কটিও পরীক্ষা করতে পারেন , যা দুটি এসটিএল ধারক (স্টাড :: ভেক্টর সহ) এর মধ্যে পারফরম্যান্সের তুলনা করে

আশা করি আমি কিছু দরকারী তথ্য শেয়ার করেছি।

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