Infinite Data Structures এবং Streams এর ব্যবহার

Streams এবং Lazy Collections (স্ট্রিমস এবং লেইজি কালেকশনস) - স্কালা কালেকশন (Scala Collections) - Computer Programming

285

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


১. স্ট্রিমস (Streams) - ইনফিনিট ডেটা স্ট্রাকচার

স্ট্রিম হলো একটি ডেটা স্ট্রাকচার যা অসীম বা সীমাবদ্ধ ডেটার সিকোয়েন্স ধারণ করতে পারে, তবে এটি lazy evaluation ব্যবহার করে। অর্থাৎ, স্ট্রিমের উপাদানগুলো তখনই তৈরি হয় যখন সেগুলো অ্যাক্সেস করা হয়। এতে স্ট্রিমের উপাদানগুলো নির্দিষ্ট পরিমাণে মেমোরিতে সংরক্ষিত না হয়ে, প্রয়োজন অনুযায়ী স্ট্রিমের মধ্যে উৎপন্ন হতে থাকে।

স্ট্রিমের সুবিধা:

  • Lazy evaluation: শুধুমাত্র যখন ডেটা প্রয়োজন হয় তখনই স্ট্রিমের উপাদানগুলো তৈরি হয়, যা মেমোরি দক্ষতা বাড়ায়।
  • Infinite sequences: স্ট্রিমের মাধ্যমে অসীম সিকোয়েন্স তৈরি করা সম্ভব।
  • Composability: স্ট্রিমগুলিকে বিভিন্ন ফাংশনাল অপারেশন দিয়ে একত্রিত করা যায় যেমন map, filter, fold, ইত্যাদি।

স্ট্রিম তৈরির পদ্ধতি:

স্কালাতে স্ট্রিম তৈরি করার জন্য Stream অবজেক্ট ব্যবহার করা হয়। এটি cons (head) এবং tail (rest) নামে দুটি প্রধান উপাদান ধারণ করে।


২. স্ট্রিম তৈরির উদাহরণ

  1. ইনফিনিট ন্যাচারাল নাম্বার স্ট্রিম:
    স্ট্রিম ব্যবহার করে আপনি সহজেই অসীম সিকোয়েন্স তৈরি করতে পারেন। উদাহরণস্বরূপ, একটি স্ট্রিম তৈরি করতে যা প্রাকৃতিক সংখ্যা ধারণ করে।

    উদাহরণ:

    val naturals: Stream[Int] = Stream.from(1)
    println(naturals.take(10).toList)  // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    এখানে, Stream.from(1) একটি স্ট্রিম তৈরি করছে যা প্রাকৃতিক সংখ্যাগুলি একে একে উৎপন্ন করবে। take(10) ব্যবহার করে প্রথম 10টি উপাদান গ্রহণ করা হয়েছে।

  2. স্ট্রিমের মধ্যে অপারেশন:
    স্ট্রিমের উপরে আপনি সাধারণভাবে map, filter, reduce ইত্যাদি অপারেশন চালাতে পারেন।

    উদাহরণ:

    val numbers = Stream.from(1)
    val evenNumbers = numbers.filter(_ % 2 == 0).take(5).toList
    println(evenNumbers)  // List(2, 4, 6, 8, 10)

    এখানে, filter অপারেশনটি স্ট্রিমের মধ্যে শুধুমাত্র সেগুলি বেছে নিচ্ছে যেগুলি সঠিক শর্ত পূর্ণ করে।


৩. স্ট্রিমের লজিক্যাল ফিচার (Lazy Evaluation)

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

উদাহরণ:

val stream = Stream.from(1)
val first100Numbers = stream.take(100).toList
println(first100Numbers)

এখানে, স্কালা শুধু প্রথম 100টি সংখ্যা তৈরি করবে এবং সম্পূর্ণ স্ট্রিম তৈরির জন্য কোন অতিরিক্ত গণনা বা মেমোরি বরাদ্দ করবে না।


৪. স্ট্রিমের সাথে কাজ করার অন্যান্য পদ্ধতি

  1. unfold ফাংশন:
    unfold ফাংশনটি স্ট্রিম তৈরি করার একটি শক্তিশালী পদ্ধতি। এটি একটি ফাংশন ব্যবহার করে স্ট্রিমের উপাদানগুলো উৎপন্ন করে।

    উদাহরণ:

    val ones = Stream.continually(1)
    println(ones.take(5).toList)  // List(1, 1, 1, 1, 1)
  2. স্ট্রিমের সাথে zip:
    দুটি স্ট্রিমকে একত্রিত করতে zip ব্যবহার করা যায়। এটি দুটি স্ট্রিমের উপাদানগুলো জোড়া করে দেয়।

    উদাহরণ:

    val stream1 = Stream(1, 2, 3)
    val stream2 = Stream("a", "b", "c")
    val zipped = stream1.zip(stream2)
    println(zipped.toList)  // List((1, "a"), (2, "b"), (3, "c"))

৫. ইনফিনিট ডেটা স্ট্রাকচারস (Infinite Data Structures)

স্ট্রিমের সাহায্যে ইনফিনিট ডেটা স্ট্রাকচার তৈরি করা সম্ভব, যেখানে ডেটা অসীম হতে পারে এবং মেমোরিতে একত্রিত না হয়ে প্রয়োজন অনুযায়ী উৎপন্ন হতে থাকে। স্কালাতে স্ট্রিমের মাধ্যমে আপনি ইনফিনিট সিকোয়েন্স তৈরি করতে পারেন, যেমন ফিবোনাচ্চি সিরিজ, প্রাইম নাম্বারস ইত্যাদি।

উদাহরণ:

ফিবোনাচ্চি সিরিজ স্ট্রিম:

val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{ case (a, b) => a + b }
println(fibs.take(10).toList)  // List(0, 1, 1, 2, 3, 5, 8, 13, 21, 34)

এখানে, fibs একটি স্ট্রিম যা ফিবোনাচ্চি সিরিজের মান উৎপন্ন করছে। #:: এর মাধ্যমে এটি একটি স্ট্রিমের মধ্যে নতুন উপাদান যুক্ত করছে।


সারাংশ:

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

Content added By
Promotion

Are you sure to start over?

Loading...