অ্যারেলিস্ট বনাম লিংকডলিস্ট বনাম ভেক্টর

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

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

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

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

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

আরেলিস্ট, লিংকডলিস্ট বা ভেক্টর এর চেয়ে ভাল আর কোনটি?

তালিকা

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

জাভা সংগ্রহ ফ্রেমওয়ার্ক। সূত্র: উইকিপিডিয়া

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

কিভাবে ডেটা সঞ্চিত

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

কম্পিউটার বিজ্ঞানে, দ্বিগুণভাবে সংযুক্ত তালিকাটি একটি লিঙ্কযুক্ত ডেটা স্ট্রাকচার যা নোড নামে ক্রমান্বয়ে লিঙ্ক করা রেকর্ডের একটি সেট নিয়ে গঠিত। প্রতিটি নোডে দুটি ক্ষেত্র থাকে, নামক লিঙ্কগুলি, যা নোডের ক্রমের আগের এবং পরবর্তী নোডের উল্লেখ। - উইকিপিডিয়া
অ্যারেলিস্ট (শীর্ষ) বনাম লিংকডলিস্ট (নীচে)। উত্স https://dzone.com/stores/temp/895349-arraylist-linkedlistt.png

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

এখানে অ্যারেলিস্ট কীভাবে তাদের উপাদানগুলিকে অ্যারেতে সঞ্চয় করে তা স্নিপেট কোড।

/ **
 * অ্যারে বাফার যার মধ্যে অ্যারেলিস্টের উপাদান রয়েছে
 * সঞ্চিত অ্যারেলিস্টের ক্ষমতা এটির দৈর্ঘ্য
 * অ্যারে বাফার উপাদানটি ডেটা সহ কোনও খালি অ্যারেলিস্ট ==
 * ডিএএফএলটিসিএপিসিটি_ইএমপিটিওয়াই_ইলেমেন্টডাটা প্রসারিত হবে
 * যখন প্রথম উপাদান যুক্ত করা হয় তখন ডিএএফএএলএফসিপিএসিটি।
 * /
ক্ষণস্থায়ী বস্তু [] এলিমেন্টডাটা; // বেসরকারীকে সহজ করার জন্য বেসরকারী
                                // ক্লাস অ্যাক্সেস

এবং এখানে ভেক্টর কীভাবে তাদের উপাদানগুলি অ্যারেতে সঞ্চয় করে।

/ **
 * অ্যারে বাফার যা ভেক্টরের উপাদানগুলি
 * সঞ্চিত ভেক্টরের ক্ষমতা এই অ্যারের দৈর্ঘ্য
 * বাফার, এবং কমপক্ষে এত বড় যে সমস্ত ভেক্টর রয়েছে
 * উপাদান।
 *
 * 

ভেক্টরের শেষ উপাদান অনুসরণ করে এমন কোনও অ্যারে উপাদান  * নাল।  *  * @ সিরিয়াল  * / সুরক্ষিত অবজেক্ট [] এলিমেন্টডাটা;

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

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

/ **
  * এটি কমপক্ষে চালিয়ে যেতে পারে তা নিশ্চিত করার ক্ষমতা বাড়ায়
  * ন্যূনতম ক্ষমতা যুক্তি দ্বারা নির্দিষ্ট উপাদানগুলির সংখ্যা।
  *
  * @ পরিমাপ মিনিস্প্যাটিটি কাঙ্ক্ষিত সর্বনিম্ন ক্ষমতা
  * /
  বেসরকারী শূন্যতা বৃদ্ধি (int minCap क्षमता) {
      // উপচে পড়া সচেতন কোড
      int OldCapacity = এলিমেন্টাটা.লেন্থ;
      int newCapacity = পুরাতন ক্ষমতা + (ওল্ড ক্যাপাসিটি >> 1);
      যদি (নতুন ক্ষমতা - কমপক্ষে <0)
          newCapacity = minCapacity;
      যদি (নতুন ক্ষমতা - MAX_ARRAY_SIZE> 0)
          newCapacity = বিশালক্যাপাসিটি (মিনিপ্যাপেসিটি);
      // মিনিপ্যাপেসিটি সাধারণত আকারের কাছাকাছি থাকে, সুতরাং এটি একটি জয়:
      এলিমেন্টাটা = অ্যারেসকপিঅফ (এলিমেন্টাটা, নতুন ক্যাপাসিটি);
  }

এবং এখানে ভেক্টর কীভাবে তার ক্ষমতা বাড়িয়ে তোলে (উত্স: ভেক্টর.জভা)

বেসরকারী শূন্যতা বৃদ্ধি (int minCap क्षमता) {
    // উপচে পড়া সচেতন কোড
    int OldCapacity = এলিমেন্টাটা.লেন্থ;
    int newCapacity = পুরানো ক্ষমতা + ((ক্ষমতাপ্রসারণ> 0))?
                                     ক্ষমতাপ্রসারণ: ওল্ড ক্যাপাসিটি);
    যদি (নতুন ক্ষমতা - কমপক্ষে <0)
        newCapacity = minCapacity;
    যদি (নতুন ক্ষমতা - MAX_ARRAY_SIZE> 0)
        newCapacity = বিশালক্যাপাসিটি (মিনিপ্যাপেসিটি);
    এলিমেন্টাটা = অ্যারেসকপিঅফ (এলিমেন্টাটা, নতুন ক্যাপাসিটি);
}

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

তাহলে আরেলিস্ট, লিংকডলিস্ট বা ভেক্টর কোনটি ভাল? এই প্রশ্নের উত্তরের জন্য অ্যারেলিস্ট এবং লিংকডলিস্টের মধ্যে সাধারণ ক্রিয়াকলাপগুলির জন্য পারফরম্যান্সটির তুলনা করতে দিন। যেহেতু অ্যারেলিস্ট এবং ভেক্টর বাস্তবায়ন প্রায় অভিন্ন, তাই তাদের অভিনয়ও প্রায় একই রকম হবে।

অ্যারেলিস্ট এবং লিংকডলিস্টের মধ্যে পারফরম্যান্স তুলনা

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

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

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

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