সংখ্যার ব্যাপ্তি সঞ্চয় করার সবচেয়ে কার্যকর উপায় কী?


29

এই প্রশ্নটি কতগুলি বিট একটি রেঞ্জ সংরক্ষণ করার জন্য প্রয়োজন is বা অন্য কোনও উপায় রাখুন, প্রদত্ত সংখ্যক বিটের জন্য, সঞ্চিত হওয়া সর্বাধিক পরিসীমা কত এবং কীভাবে?

কল্পনা করুন যে আমরা 0-255 এর মধ্যে একটি উপ-পরিসীমা সঞ্চয় করতে চাই want

সুতরাং উদাহরণস্বরূপ, 45-74।

আমরা উপরের দুটি স্বাক্ষরবিহীন বাইট হিসাবে উদাহরণ সংরক্ষণ করতে পারি, তবে এটি আমাকে আঘাত করে যে সেখানে অবশ্যই তথ্যের কিছু অপ্রয়োজনীয়তা থাকতে হবে। আমরা জানি যে দ্বিতীয় মান প্রথমের চেয়ে বড়, সুতরাং প্রথম মানটি বড় হওয়ার ক্ষেত্রে দ্বিতীয় মানটির জন্য কম বিট প্রয়োজন হয় এবং দ্বিতীয় মানটি বড় হওয়ার ক্ষেত্রে প্রথমটির জন্য কম বিট প্রয়োজন ।

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

এই জাতীয় জিনিস করার জন্য কি কোনও মানক অ্যালগরিদম আছে?


আপনারও কি ব্যাপ্তির শুরুটি সঞ্চয় করতে হবে?
ইভান

@ ইভান আমি সত্যিই অনুসরণ করি না। উপরের উদাহরণে 45 টি হ'ল শুরু (সর্বনিম্ন) এবং 74 টি শেষ (সর্বাধিক) এবং উভয়ই সংরক্ষণ করতে হবে stored
rghome

2
সুতরাং এমন প্রশ্নটি রয়েছে যে কোনও প্রকারের জন্য প্রয়োজনীয় পরিমাণের পরিমাণ সঞ্চয় করতে পারে এমন কোনও স্থান কতটা কাজ করে। বা 45-74 টি সঞ্চয় করতে পারে এমন ধরণের কত জায়গার প্রয়োজন?
ইভান

1
যদিও এই সম্পর্কে চিন্তাভাবনা অবশ্যই ভাল, আমি নিশ্চিত আশা করি আপনি বাস্তব প্রয়োগগুলিতে এটি না করেন। কারণটি হ'ল বাস্তব অ্যাপ্লিকেশনগুলির জটিলতার পরিমাণ এত বিশাল যে আমাদের 100% এরও কম অপ্টিমাইজড কোডটি গ্রহণ করতে হবে .... এজন্যই সংকলকগুলির অস্তিত্ব ছিল।
NoChance

3
@ রাঘোম, আমি একমত, এমনকি সাধারণতম প্রয়োজনীয়তা কয়েকশ লাইন কোড তৈরি করে। প্রতিটি ত্রুটিযুক্ত প্রবণ। ব্যক্তিগতভাবে, আমি সফ্টওয়্যারটির জটিলতা বাড়ানোর চেয়ে হার্ডওয়্যারের জন্য অর্থ প্রদান করতাম।
NoChance

উত্তর:


58

কেবল সম্ভাব্য ব্যাপ্তির সংখ্যা গণনা করুন। নিম্ন সীমানা 0 (0-0, 0-1, ... 0-254, 0-255) সহ 256 রেঞ্জ রয়েছে, নিম্ন সীমানা 1 সহ 255 রেঞ্জ ... এবং অবশেষে নিম্ন সীমানা 255 (255- সহ 1 টি রেঞ্জ) 255)। সুতরাং মোট সংখ্যাটি (256 + 255 + ... + 1) = 257 * 128 = 32,896। এটি 2 15 = 32,768 এর চেয়ে কিছুটা বেশি হওয়ায় আপনার এখনও এই তথ্য সঞ্চয় করতে কমপক্ষে 16 বিট (2 বাইট) লাগবে।

সাধারণভাবে, 0 থেকে এন -1 পর্যন্ত সংখ্যার জন্য, সম্ভাব্য ব্যাপ্তির সংখ্যা এন * (এন + 1) / 2। এটি 256 এর চেয়ে কম যদি এন 22 হয় বা তার চেয়ে কম হয়: এন = 22 22 * ​​23/2 = 253 সম্ভাবনা দেয়। সুতরাং এক বাইট 0-21 এর উপ-রেঞ্জের জন্য যথেষ্ট ।

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


ধন্যবাদ। এন রেঞ্জগুলির জন্য প্রয়োজনীয় বিটের সংখ্যা হ'ল লগ (এন) / লগ 2। ওল্ফ্রাম আলফায় এগুলি খাওয়ানো আমাকে প্রদত্ত সংখ্যক বিটের জন্য সাব্রিনজের সর্বোচ্চ মান গণনা করার জন্য নিম্নলিখিত এক্সেল সামঞ্জস্যপূর্ণ সূত্রটি দিয়েছে: = INT ((এসকিউআরটি (বিদ্যুৎ (2, এন + 3) + 1) - 1) / 2 )
rghome

9
টিএলডিআর হ'ল আপনি প্রায় অর্ধেক বিট লাভ করেন, তাই সাধারণভাবে এটি সংকোচনের পক্ষে সত্য নয়।
rghome

হ্যাঁ, এটি বৃহত্তর এন এর জন্য কিছুটা ঝোঁক তবে এটি ঝামেলার পক্ষে মূল্যবান নয়।
গ্লোরফাইন্ডেল

এফওয়াইআই, সমীকরণের এন + 3 টি দেখতে অদ্ভুত দেখাচ্ছে তবে 2 এর একটি শক্তি আপনার সমীকরণ থেকে আসে এবং অন্য দুটি চতুর্ভুজ সূত্রের 4ac অংশ থেকে আসে।
rghome

1
বিটিডাব্লু, আপনার গণনা খালি ব্যাপ্তিকে ছাড় দেয়, যার জন্য সমস্ত অ-গণিত সংমিশ্রণ দাঁড়িয়ে আছে। তো n * (n + 1) / 2 + 1,! একটি স্বল্প পরিবর্তন।
হস্তান্তরকারী

17

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

ধরে নেওয়া যাক ডোমেনটি পূর্ণসংখ্যা, তাই 32 বিট। নিষ্পাপ পদ্ধতির সাথে, আপনার একটি ব্যাপ্তি সঞ্চয় করতে 64 বিট (শুরু, শেষ) দরকার।

যদি আমরা (শুরু, ব-দ্বীপ) কোনও এনকোডিংয়ে স্যুইচ করি তবে আমরা সেই থেকে পরিসীমাটির শেষটি তৈরি করতে পারি। আমরা জানি যে সবচেয়ে খারাপ ক্ষেত্রে, শুরুটি 0 হয় এবং ডেল্টায় 32 বিট থাকে।

2 ^ 5 হল 32, তাই আমরা বেল্টটির দৈর্ঘ্য পাঁচটি বিটগুলিতে এনকোড করব (শূন্য দৈর্ঘ্য নয়, সর্বদা 1 যোগ করুন), এবং এনকোডিং হয়ে যাবে (শুরু, দৈর্ঘ্য, ব-দ্বীপ)। সবচেয়ে খারাপ ক্ষেত্রে, এর দাম 32 * 2 + 5 বিট, তাই 69 বিট। সুতরাং সবচেয়ে খারাপ ক্ষেত্রে, যদি সমস্ত ব্যাপ্তি দীর্ঘ হয় তবে এটি আরও খারাপ তবে নির্দোষ এনকোডিং।

সেরা ক্ষেত্রে, এর দাম 32 + 5 + 1 = 38 বিট।

এর অর্থ যদি আপনাকে অনেকগুলি ব্যাপ্তি এনকোড করতে হয় এবং এই ব্যাপ্তিগুলি কেবলমাত্র আপনার ডোমেনের ছোট্ট অংশকে কভার করে, আপনি এই এনকোডিংটি ব্যবহার করে গড়ে কম স্থান ব্যবহার করবেন। শুরুগুলি কীভাবে বিতরণ করা যায় তা বিবেচনাধীন নয়, যেহেতু শুরুটি সর্বদা 32 বিট নেয়, তবে ব্যাপ্তিগুলির দৈর্ঘ্য কীভাবে বিতরণ করা যায় তা বিবেচ্য নয়। আপনার যদি আরও ছোট দৈর্ঘ্য হয়, কমপ্রেশনটি তত ভাল হয় তবে আপনার ডোমেনের পুরো দৈর্ঘ্যটি যত বেশি পরিসীমা থাকে, এই এনকোডিংটি তত খারাপ হবে।

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

বলুন আপনার 10000 রেঞ্জ রয়েছে। রেঞ্জগুলি একটি নির্দিষ্ট মানকে কেন্দ্র করে গ্রুপ করা হয়। আপনি 32 বিট দিয়ে পক্ষপাতটি এনকোড করেছেন।

নিষ্পাপ পদ্ধতির ব্যবহার করে, আপনার এই সমস্ত ব্যাপ্তিগুলি সংরক্ষণ করতে 32 * 2 * 10 000 = 640 000 বিট লাগবে।

পক্ষপাতটি এনকোডিংয়ে 32 বিট লাগে এবং প্রতিটি পরিসর এনকোডিং সেরা ক্ষেত্রে নেয় তবে 5 + 1 + 5 + 1 = 12 বিট, মোট 120 000 + 32 = 120 032 বিটের জন্য। সবচেয়ে খারাপ ক্ষেত্রে আপনার মোট 540 ডলার 322 বিট প্রয়োজন, এইভাবে মোট 740 032 বিটের জন্য 74 বিট its

এর অর্থ, একটি ডোমেনে 10 000 মানের জন্য যা এনকোডে 32 বিট লাগে, আমরা পাই

  • সেরা ক্ষেত্রে স্মার্ট ডেল্টা-এনকোডিং সহ 120 032 বিট
  • নিখুঁত শুরু, শেষ এনকোডিং সহ সর্বদা 640 000 বিট (সেরা বা খারাপ কোনও ক্ষেত্রে নেই)
  • 740 032 বিট সবচেয়ে খারাপ ক্ষেত্রে স্মার্ট ডেল্টা এনকোডিং সহ

আপনি যদি বেসলাইন এনকোডিংটিকে বেসলাইন হিসাবে গ্রহণ করেন তবে এর অর্থ হয় 81.25% অবধি বা 15.625% পর্যন্ত বেশি ব্যয় হবে।

আপনার মানগুলি কীভাবে বিতরণ করা হবে তার উপর নির্ভর করে সেই সঞ্চয়গুলি তাৎপর্যপূর্ণ। আপনার ব্যবসায়ের ডোমেনটি জানুন! আপনি কী এনকোড করতে চান তা জানুন।

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

যদি আপনার শুরুর পয়েন্টগুলি সমানভাবে বিতরণ করা হয় তবে এই এনকোডিংটি সত্যিই এটির মতো কার্যকর হয় না।

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

ডেটা মূল্যায়ন, এটিকে গোষ্ঠীকরণ এবং সঠিক পক্ষপাত নির্বাচন করা যথেষ্ট কাজ হতে পারে এবং অনুকূল ফলাফলের জন্য কিছু সূক্ষ্ম-সুরকরণের প্রয়োজন হতে পারে।


8

এই ধরণের সমস্যা হ'ল ক্লাউড শ্যাননের সেমিনাল পেপার, অ্যা ম্যাথমেটিকাল থিওরি অফ কমিউনিকেশন , যা "বিট" শব্দটি এবং আরও বা কম আবিষ্কারিত ডেটা সংকোচনের পরিচয় দেয়।

সাধারণ ধারণাটি হ'ল একটি পরিসীমা এনকোড করতে ব্যবহৃত বিটের সংখ্যা বিস্তৃতভাবে সেই ব্যাপ্তির সম্ভাবনার সাথে সমানুপাতিক। উদাহরণস্বরূপ, ধরুন 45-74 পরিসরটি প্রায় 1/4 অংশের সময় উপস্থিত হয়। আপনি বলতে পারেন যে সিকোয়েন্স 00 45-74 এর সাথে মিলে যায়। 45-74 পরিসীমা এনকোড করতে, আপনি "00" আউটপুট এবং সেখানে থামুন।

আসুন ধরুন যে 99-100 এবং 140-155 সীমাগুলি প্রতিটি 1/8 সময়ের প্রায় প্রদর্শিত হয়। আপনি তাদের প্রত্যেককে 3 বিট ক্রম দিয়ে এনকোড করতে পারেন। যে কোনও 3 বিট যতক্ষণ না "00" দিয়ে শুরু না করে ততক্ষণ তা করবে, যা ইতিমধ্যে 45-74 পরিসরের জন্য সংরক্ষিত রয়েছে।

00: 45-74
010: 99-100
101: 140-155

প্রতিটি সম্ভাব্য ব্যাপ্তির এনকোডিং না হওয়া পর্যন্ত আপনি এই পদ্ধতিতে চালিয়ে যেতে পারেন। কমপক্ষে সম্ভাব্য ব্যাপ্তির জন্য 100 বিটের বেশি প্রয়োজন হতে পারে। তবে এটি ঠিক আছে কারণ এটি খুব কমই প্রদর্শিত হয়।

সেখানে হয় আলগোরিদিম অনুকূল কোডিং খুঁজে। আমি এখানে তাদের ব্যাখ্যা করার চেষ্টা করব না, তবে উপরের লিঙ্কটিতে গিয়ে বা "তথ্য তত্ত্ব", "শ্যানন-ফ্যানো কোডিং", বা "হাফম্যান কোডিং" অনুসন্ধান করে আপনি আরও খুঁজে পেতে পারেন।

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


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

1

@ গ্লোরফাইন্ডেল থেকে উত্তরের প্রসারিত করতে:

হিসাবে এন → ∞, (এন - 1) → এন। সুতরাং, Ω (ব্যাপ্তি) → n² / 2 এবং লগ (Ω (রেঞ্জ)) → (2 এন - 1)। যেহেতু নিষ্পাপ এনকোডিং 2n বিট নেয়, তাই অ্যাসিম্পটোটিক সর্বাধিক সংকোচন কেবল 1 বিট সংরক্ষণ করে।


1

একটি অনুরূপ উত্তর আছে, তবে অনুকূল সংকোচনের জন্য আপনার প্রয়োজন:

  1. একটি অনুকূল এনট্রপি এনকোডিং পদ্ধতি (উপর পড়তে পাটিগণিত কোডিং এবং মূলত সমতুল্য (একই কম্প্রেশন অনুপাত, একটি বিট দ্রুততর কিন্তু কঠিন উপলব্ধি করতে) ANS এর )
  2. তথ্য বিতরণ সম্পর্কে যতটা সম্ভব তথ্য। গুরুতরভাবে, এটিতে কেবল "অনুমান করা" জড়িত না যে কতবার একটি সংখ্যা প্রদর্শিত হতে পারে তবে আপনি প্রায়শই নিশ্চিত সম্ভাবনার কিছুটা অস্বীকার করতে পারেন। উদাহরণস্বরূপ, আপনি বৈধ ব্যবধান কীভাবে সংজ্ঞায়িত করেন তার উপর নির্ভর করে আপনি নেতিবাচক আকার এবং সম্ভবত 0 আকারের বিরতিগুলি বাতিল করতে পারেন। আপনার যদি একবারে এনকোড করার জন্য একাধিক বিরতি থাকে তবে আপনি সেগুলি বাছাই করতে পারেন যেমন প্রস্থ হ্রাস, বা প্রারম্ভিক / শেষের মান বাড়িয়ে তুলতে এবং পুরো মানগুলি বাতিল করতে পারেন (উদাহরণস্বরূপ, আপনি প্রস্থকে হ্রাস করে কোনও আদেশের নিশ্চয়তা দিলে পূর্ববর্তী বিরতি প্রস্থটি 100 এর প্রস্থ ছিল এবং পরেরটির প্রারম্ভিক মান 47 হয়, আপনাকে কেবল শেষ মানের জন্য 147 পর্যন্ত সম্ভাবনা বিবেচনা করতে হবে)।

গুরুত্বপূর্ণভাবে, সংখ্যা 2 এর অর্থ আপনি জিনিসগুলিকে এমনভাবে এনকোড করতে চান যাতে সর্বাধিক তথ্যবহুল মান (প্রতি বিট এনকোডযুক্ত) প্রথমে আসে। উদাহরণস্বরূপ, আমি যখন সাজানো তালিকার "হিসাবে রয়েছে" তে এনকোডিং করার পরামর্শ দিচ্ছিলাম, তবে এটি সাধারণত "বাইনারি ট্রি" হিসাবে এনকোড করা আরও স্মার্ট হবে - অর্থাত যদি সেগুলি প্রস্থ অনুসারে বাছাই করা হয় এবং আপনার lenউপাদান রয়েছে, এনকোডিং উপাদান দিয়ে শুরু করুন len/2। বলুন এটি ডাব্লু প্রস্থ ছিল। [0, ডাব্লু] কোথাও কোথাও প্রস্থ থাকার আগে আপনি সমস্ত উপাদানগুলি জানেন এবং [w, সর্বাধিক মান আপনি গ্রহণ করেন] এর কোথাও প্রস্থের পরে এর সমস্ত উপাদানগুলির প্রস্থ রয়েছে। পুনরাবৃত্তভাবে পুনরাবৃত্তি করুন (প্রতিটি অর্ধেক তালিকার অর্ধেক তালিকা আবার আবার বিভাজন) যতক্ষণ না আপনি lenউপাদানগুলি আবৃত করেন (যতক্ষণ না এটি স্থির হয়, আপনি এনকোড করতে চানlenপ্রথমে আপনার শেষ টোকেন নিয়ে বিরক্ত করার দরকার নেই)। যদি "সর্বাধিক ভাল আপনি গ্রহণ করেন" সত্যিই খোলা থাকে তবে প্রথমে আপনার ডেটাতে প্রদর্শিত হওয়া সর্বোচ্চ মানটি অর্থাৎ শেষ উপাদানটি এনকোড করা স্মার্ট হতে পারে এবং তারপরে বাইনারি বিভাজন করা যায়। আবার, প্রথমে বিট প্রতি যা কিছু তথ্যবহুল।

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

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