রুবি সেট কী?
একটি সেট হলো একটি ক্লাস যা আইটেম স্টোর করে অ্যারের মত…
কিন্তু কিছু বিশেষ অ্যাট্রিবিউটসহ যা নির্দিষ্ট পরিস্থিতিতে এটিকে ১০ গুণ দ্রুত করে তোলে!
সেটের সকল আইটেম গ্যারান্টিয়েটেড ইউনিক।
এই রুবি টিউটোরিয়ালে আপনি শিখবেন:
- সেট কীভাবে এবং কখন ব্যবহার করবেন আপনার সর্বোচ্চ লাভের জন্য
- সেট এবং অ্যারের পার্থক্য!
- উপকারী সেট মেথডের একটি লিস্ট
শুরু করা যাক!
রুবি Set উদাহরণ
একটি সেট হলো একটি রুবি ক্লাস যা আপনাকে ইউনিক আইটেমের একটি লিস্ট তৈরি করতে সাহায্য করে।
এখানে একটি উদাহরণ কীভাবে এটি উপকারী:
মান লিন আপনি একটি বড় প্রোডাক্ট লিস্টের ওপর ঘুরছেন।
কিন্তু এই লিস্টে ডুপ্লিকেট এন্ট্রি আছে এবং আপনি শুধু ইউনিক প্রোডাক্ট চান।
আপনি সেগুলো একটি সেটে রাখতে পারেন, এবং সেট নিশ্চিত করবে আপনার প্রোডাক্ট লিস্ট সবসময় ইউনিক কোনো এক্সট্রা কাজ ছাড়া।
এখানে কীভাবে করবেন:
require 'set' products = Set.new products << 1 products << 1 products << 2 products # Set: {1, 2}
একটি অন্য সুবিধা হলো এই লিস্ট সার্চ করা খুব দ্রুত হবে:
products.include?(1) # true
এটি খুব দ্রুত কারণ সার্চটি কনস্ট্যান্ট টাইমে হয়।
Set বনাম Array – পার্থক্য বোঝা
এখন আপনি চিন্তা করছেন হতে পারে…
সেট এবং অ্যারের মধ্যে পার্থক্য কী?
একটি সেটের এলিমেন্টগুলোর ডায়রেক্ট অ্যাক্সেস নেই:
products[0] # undefined method `[]'
এইটিই প্রধান পার্থক্য।
কিন্তু একটি সেট যেকোনো সময় অ্যারে-এ কনভার্ট করা যায়:
products.to_a # [1, 2]
সেট ব্যবহার করার মূল পয়েন্ট হলো এর দুটি বিশেষ অ্যাট্রিবিউট ব্যবহার করা:
- ফাস্ট লুকআপ টাইম (
include?দিয়ে) - ইউনিক ভ্যালু
আপনার যদি এগুলো দরকার হয় তবে একটি সেট আপনাকে ভালো পারফরম্যান্স বস্ট দেবে, এবং আপনাকে প্রতিবার ইউনিক এলিমেন্ট চাইলে অ্যারে-এ uniq কল করতে হবে না।
Set বনাম Array বেঞ্চমার্ক
এখানে একটি বেঞ্চমার্ক যাতে আপনি অ্যারে এবং সেট include? মেথডের পারফরম্যান্স পার্থক্য দেখতে পারেন।
# Ruby 2.5.0 set include: 8381985.2 i/s array include: 703305.5 i/s - 11.92x slower
এই পার্থক্যের কারণ হলো একটি অ্যারেকে প্রতিটি এলিমেন্ট চেক করতে হয়!
আপনার কাছে যদি ১ মিলিয়ন এলিমেন্টের অ্যারে থাকে তবে আপনি هرবার include? কল করলে ১ মিলিয়ন এলিমেন্ট চেক করবে।
এক সেট সেটি করতে হয় না।
রুবি Set মেথড
সেটের মধ্যে কয়েকটি অপারেশন বা মেথড করা যায়, যদি আপনার ম্যাথ ব্যাকগ্রাউন্ড থাকে তবে আপনি সেগুলো রিকগনাইজ করতে পারেন।
ইউনিয়ন অপারেটর (The Union Operator)
উপকারী সেট মেথডের একটি হলো ইউনিয়ন অপারেটর:
products | (1..10) # Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
এই অপারেটর আপনাকে দুটি সেটের সকল ইউনিক এলিমেন্ট একসাথে কম্বাইন করে একটি সেটে দেয়।
বি.টি.ডাব্লিউ, এটি যেকোনো Enumerable অবজেক্টের সাথে কাজ করে, যেন অ্যারে, রেঞ্জ ও হ্যাশ, শুধু Set ক্লাসের অবজেক্ট নয়।
ডিফারেন্স অপারেটর (The Difference Operator)
আপনি যদি একটি সেটের এলিমেন্টগুলো অন্য সেট থেকে রিমুভ করতে চান তবে এটি আপনার মেথড।
এখানে একটি উদাহরণ:
products - (3..4) # Set: {1, 2, 5, 6, 7, 8, 9, 10}
ইন্টারসেকশন অপারেটর (The Intersection Operator)
এবং এখানে সেট ইন্টারসেকশন অপারেটর:
Set.new(1..3) & Set.new(2..5) # Set: {2, 3}
এটি আপনাকে দুটি সেটে কমন এলিমেন্টগুলো দেয়।
এই ৩টি অপারেটর (ইউনিয়ন, ডিফারেন্স এবং ইন্টারসেকশন) অ্যারের সাথেও ব্যবহার করা যায়।
সুপারসেট এবং সাবসেট (Superset & Subset)
একটি সুপারসেট হলো একটি সেট যেটি অন্য সেটের সকল এলিমেন্ট ধারণ করে।
আপনি চেক করতে পারেন একটি সেট অন্য সেটের সুপারসেট কিনা।
এভাবেই:
Set.new(10..40) >= Set.new(20..30)
রেঞ্জ 10..40 20..30-কে তার ভিতরে ধারণ করে।
একটি সাবসেট হলো অন্য সেটের অংশ দিয়ে বানানো একটি সেট:
Set.new(25..27) <= Set.new(20..30)
Sorted Sets কীভাবে ব্যবহার করবেন
আপনি যদি একটি সেট চান যা সবসময় সর্টেড থাকে তবে আপনি SortedSet ক্লাস ব্যবহার করতে পারেন।
এই ক্লাস ব্যবহার করার কিছু শর্ত আছে:
- আপনি সেটে যে অবজেক্টগুলো যোগ করছেন সেগুলো অবশ্যই
<=>মেথড ইমপ্লিমেন্ট করতে হবে। - অবজেক্টগুলো একে অপরের সাথে কমপারেবল হতে হবে (ইন্টিজারকে ইন্টিজারের সাথে, বা স্ট্রিংকে স্ট্রিং-এর সাথে)
এখানে একটি উদাহরণ:
sorted_numbers = SortedSet.new sorted_numbers << 5 sorted_numbers << 2 sorted_numbers << 1 sorted_numbers # SortedSet: {1, 2, 5}
Sets ভিডিও টিউটোরিয়াল
সারসংক্ষেপ
আপনি রুবিতে সেট ব্যবহার শিখেছেন ভালো পারফরম্যান্স এবং সহজ কোডিংয়ের জন্য। আপনি অ্যারে এবং সেটের পার্থক্যও শিখেছেন।
দয়া করে এই আর্টিকেলটি শেয়ার করুন যদি আপনি এটি উপকারী পান যাতে আরও মানুষ এটি খুঁজে পায় 🙂
পড়ার জন্য ধন্যবাদ!