কম্পিউটার টিউটোরিয়াল

রুবিতে লিঙ্কড লিস্টে দক্ষতা অর্জন: একটি ব্যাবহারিক গাইড

এটি "রুবিতে ব্যাবহারিক কম্পিউটার সায়েন্স" সিরিজের ৩য় এন্ট্রি! আজ আমরা লিঙ্কড লিস্ট নিয়ে আলোচনা করব।

তো লিঙ্কড লিস্ট কী?

নাম অনুসারে, লিঙ্কড লিস্ট হলো ডেটা লিস্ট ফরম্যাটে সংরক্ষণ করার একটি পদ্ধতি (ধন্যবাদ, ক্যাপ্টেন অভিজ্ঞ!)।

"লিঙ্কড" অংশটি এই事实证明 থেকে আসে যে ডেটা একটি নোডে সংরক্ষিত হয় এবং এই নোডها ক্রমাগতভাবে একে অপরের সাথে লিংকড থাকে।

রুবিতে লিঙ্কড লিস্টে দক্ষতা অর্জন: একটি ব্যাবহারিক গাইড

এটি অ্যারে থেকে কীভাবে আলাদা?

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

একটি লিঙ্কড লিস্টের পারফরম্যান্স বৈশিষ্ট্য অ্যারে থেকে আলাদা। সেটাই একে অন্যের চেয়ে বেছে নেওয়ার একটি কারণ।

এর মানে হলো নির্দিষ্ট কাজের জন্য লিঙ্কড লিস্ট অ্যারের চেয়ে আরও দক্ষ হতে পারে।

একটি লিঙ্কড লিস্টে কোনো ইন্ডেক্সিং নেই, কোনো র‍্যান্ডম অ্যাক্সেস নেই, অর্থাৎ আপনি লিস্টের মাঝপথে 있는 একটি আইটেমে সরাসরি পৌঁছাতে পারবেন না।

আপনাকে লিস্টের "হেড"-এ থেকে শুরু করে লিংকগুলো অনুসরণ করতে হবে যতক্ষণ না আপনি আপনার পছন্দের নোডটি পেতে পারেন বা লিস্টের শেষে পৌঁছান।

লিস্টের মাঝপথ থেকে একটি আইটেম সরানো (বা যোগ করা) অনেক দ্রুত।

আপনাকে শুধু একটি নোডের "নেক্সট" পয়েন্টার পরিবর্তন করতে হবে।

কিন্তু আপনি যদি অ্যারের মাঝপথ থেকে একটি এলিমেন্ট ডিলিট করতে চান তবে একটি গ্যাপ থাকবে এবং সেই গ্যাপ বন্ধ করতে ডিলিট করা এলিমেন্টের ডানপাশের সকল এলিমেন্ট সরাতে হবে।

রুবিতে লিঙ্কড লিস্টে দক্ষতা অর্জন: একটি ব্যাবহারিক গাইড

যদি আপনাকে এটি বারবার করতে হয় তবে এটি बिल्कুল দক্ষ নয়!

যদি আমরা অ্যারের মাঝপথে ইনসার্ট করতে চাই তবে খালি জায়গা তৈরি করতে সমস্ত অ্যারে এলিমেন্ট সরাতে হবে।

একটি কোড উদাহরণ দেখি:

 a = [1,2,3,4,5,6,7,8] def insert(arr, item, pos) tmp = arr[pos] arr[pos] = item arr.replace(arr[0..pos] + [tmp] + arr[pos+1..-1]) end insert(a, 99, 3) p a 

নোট: একটি বিল্ট-ইন Array#insert মেথডও আছে, কিন্তু আমি আপনাকে দেখাতে চেয়েছিলাম এই মেথডটি কীভাবে কাজ করে।

একটি লিস্টের মাঝপথে একটি আইটেম ইনসার্ট করার পারফরম্যান্স প্রভাব কী?

এখানে একটি বেঞ্চমার্ক:

 Comparison: LinkedList: 1815407.9 i/s Array: 18090.3 i/s - 100.35x slower 

খুব বড় পার্থক্য, তবে এটি LinkedList-এর আকারের ওপরও অনেকাংশে নির্ভর করে যেহেতু নোড খুঁজতে হয়।

ডেটা স্ট্রাকচার অ্যাকসেস সার্চ ইনসারশন ডিলিশন
অ্যারে O(1) O(n) O(n) O(n)
লিঙ্কড লিস্ট O(n) O(n) O(1) O(1)

রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশন খুঁজছেন?

এرون প্যাটারসনের একটি পুল রিকোয়েস্ট যেখানে তিনি লিঙ্কড লিস্ট ব্যবহার করে রুবি জেমসকে দ্রুত করেছেন:

https://github.com/rubygems/rubygems/pull/1188

লিঙ্কড লিস্ট ইমপ্লিমেন্টেশন

রুবিতে LinkedList ক্লাস নেই তাই আমাদের নিজেদের তৈরি করতে হবে।

আমরা নিচের অপারেশনগুলো চাই:

  • append (লিস্টের শেষে)
  • append_after
  • delete
  • find

এখানে একটি সম্ভাব্য ইমপ্লিমেন্টেশন:

 class LinkedList def initialize @head = nil end def append(value) if @head find_tail.next = Node.new(value) else @head = Node.new(value) end end def find_tail node = @head return node if !node.next return node if !node.next while (node = node.next) end def append_after(target, value) node = find(target) return unless node old_next = node.next node.next = Node.new(value) node.next.next = old_next end def find(value) node = @head return false if !node.next return node if node.value == value while (node = node.next) return node if node.value == value end end def delete(value) if @head.value == value @head = @head.next return end node = find_before(value) node.next = node.next.next end def find_before(value) node = @head return false if !node.next return node if node.next.value == value while (node = node.next) return node if node.next && node.next.value == value end end def print node = @head puts node while (node = node.next) puts node end end end 

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

এখানে আমাদের নোড ক্লাস:

 class Node attr_accessor :next attr_reader :value def initialize(value) @value = value @next = nil end def to_s "Node with value: #{@value}" end end 

আমরা এটিকে এভাবে ব্যবহার করতে পারি:

 list = LinkedList.new list.append(10) list.append(20) list.append(30) list.append_after(10, 15) list.append_after(20, 25) list.print 

এটি একটি বেসিক "সিঙ্গলি-লিঙ্কড লিস্ট" ইমপ্লিমেন্টেশন।

আপনার অন্যান্য টাইপের লিঙ্কড লিস্টও আছে:

  • ডাবলি-লিঙ্কড লিস্ট
  • সার্কুলার লিঙ্কড লিস্ট

ডাবলি-লিঙ্কড লিস্টে প্রতিটি নোডের দুটি পয়েন্টার থাকে: একটি পরবর্তী নোড-এর দিকে এবং অন্যটি পূর্ববর্তী নোড-এর দিকে।

এটি লিস্ট সার্চ করার জন্য আরও নমনীয়তা দেয়, কিন্তু লিস্টে পরিবর্তন করার সময় অতিরিক্ত কাজ করে।

একটি সার্কুলার লিঙ্কড লিস্ট ডাবলি-লিঙ্কড লিস্টের মতোই, কিন্তু শেষ নোডটি হেড নোডের সাথে সংযুক্ত থাকে।

ভিডিও

সারসংক্ষেপ

আপনি লিঙ্কড লিস্ট সম্পর্কে শিখেছেন, একটি ডেটা স্ট্রাকচার যেটি আপনি বিবেচনা করতে পারেন যদি আপনি অ্যারের মাঝপথে অনেক যোগ এবং বাদ দেন।

এটি কোডিং ইন্টারভিউয়েও আসতে পারে, তাই শুধু সেটির জন্যও শিখা ভালো।

নিচের বাটনগুলো ব্যবহার করে এই পোস্ট শেয়ার করা না ভুলেন যাতে আরও মানুষ এই জ্ঞান থেকে লাভ उठাতে পারে 🙂


  1. লিংকড লিস্টে এলিমেন্ট ইনসারশন ব্যাখ্যা C ভাষায়

  2. C ভাষায় লিংকড লিস্টের ধারণা ব্যাখ্যা

  3. মাল্টিলেভেল লিংকড লিস্ট ফ্ল্যাটেন করা (C++)

  4. রুবি দিয়ে ব্যাবহারিক গ্রাফ থিওরি মास্টার করুন