কোন ধরণের অ্যালগরিদমের জন্য একটি সেট প্রয়োজন?


10

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

মূলত: কোন ধরণের অ্যালগরিদমগুলির জন্য একটি সেট প্রয়োজন এবং অন্য কোনও ধারক ধরণের দিয়ে করা উচিত নয়?


2
আপনি যখন "সেট" শব্দটি ব্যবহার করেন তখন আপনি কী বোঝাতে চান সে সম্পর্কে আপনি আরও নির্দিষ্ট করে বলতে পারেন? আপনি কি একটি সি ++ সেট
রবার্ট হার্ভে

হ্যাঁ, আসলে, "সেট" সংজ্ঞাটি বেশিরভাগ ভাষায় বেশ অনুরূপ বলে মনে হয়: একটি ধারক যা কেবলমাত্র অনন্য উপাদানকেই গ্রহণ করে।
ফ্লয়েলা

6
"প্রতিটি উপাদানকে অন্য ভেক্টরে যুক্ত করে এবং উপাদানটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে দেখানো হচ্ছে" - এটি কেবল একটি সেট নিজেকে বাস্তবায়ন করছে। সুতরাং আপনি যদি জিজ্ঞাসা করছেন যে আপনি নিজের হাতে নিজে লিখতে পারেন তখন একটি অন্তর্নির্মিত বৈশিষ্ট্যটি কেন ব্যবহার করবেন?
জ্যাকবিবি

উত্তর:


8

আপনি বিশেষত সেট সম্পর্কে জিজ্ঞাসা করছেন তবে আমি মনে করি আপনার প্রশ্নটি একটি বৃহত্তর ধারণা সম্পর্কে: অ্যাবস্ট্রাকশন। আপনি একেবারে সঠিক যে এটি করার জন্য আপনি কোনও ভেক্টর ব্যবহার করতে পারেন (আপনি যদি জাভা ব্যবহার করছেন তবে পরিবর্তে অ্যারেলিস্ট ব্যবহার করুন)) তবে কেন সেখানে থামবেন? আপনার কীসের জন্য ভেক্টর দরকার? আপনি অ্যারে দিয়ে এই সব করতে পারেন।

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

অথবা, পরিবর্তে আপনি একটি সেট উদাহরণ ব্যবহার করতে পারেন এবং কেবল কল করতে পারেন add()। যে কারণগুলির অস্তিত্ব রয়েছে তা হ'ল এগুলি একটি বিমূর্ততা যা প্রচুর সাধারণ সমস্যার জন্য দরকারী। উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনি আইটেমগুলি ট্র্যাক করতে চান এবং একটি নতুন যুক্ত করা হলে প্রতিক্রিয়া জানান। আপনি add()একটি সেট কল করেন এবং এটি ফিরে আসে trueবা falseসেটটি সংশোধিত হয়েছিল কিনা তার উপর ভিত্তি করে। আপনি আদিম ব্যবহার করে হাত দিয়ে লিখতে পারেন তবে কেন?

আপনার কাছে একটি তালিকা থাকতে পারে এমন একটি ঘটনা ঘটতে পারে এবং আপনি নকলগুলি সরাতে চান। আপনার প্রস্তাবিত অ্যালগরিদমটি মূলত আপনি এটি করতে পারতেন সবচেয়ে ধীরতম উপায়। বেশ কয়েকটি সাধারণ দ্রুত উপায় রয়েছে: সেগুলি বুকিং করা বা তাদের বাছাই করা। অথবা, আপনি সেগুলিকে এমন একটি সংযোজন করতে পারেন যা সেই আলগোরিদিমগুলির মধ্যে একটির প্রয়োগ করে।

আপনার ক্যারিয়ার / শিক্ষার শুরুতে এই অ্যালগরিদমগুলি তৈরি এবং তাদের বোঝার দিকে মনোনিবেশ করা এবং এটি করা গুরুত্বপূর্ণ। তবে পেশাদার বিকাশকারীরা সাধারণ ভিত্তিতে এটি করেন না। তারা এই পদ্ধতিগুলি আরও বেশি আকর্ষণীয় জিনিসগুলি তৈরি করতে এবং প্রাক-বিল্ট এবং নির্ভরযোগ্য বাস্তবায়ন ব্যবহার করে নৌকার বোঝা সাশ্রয় করে।


23

আমি ধরে নিয়েছি যে ব্যবহৃত ভাষার উপর নির্ভর করে পারফরম্যান্সে পার্থক্য থাকতে পারে। তবে এর বাইরে আর কোনও সেট ব্যবহার করার কারণ আছে কি?

ওহ হ্যাঁ, (তবে এটি পারফরম্যান্স নয়))

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

এটি করার জন্য আপনার নিজের কোডটি লিখুন এবং আপনাকে এটি সম্পর্কে চিন্তা করতে হবে। Bleh। কে যে কি চায়?

মূলত: কোন ধরণের অ্যালগরিদমগুলির জন্য একটি সেট প্রয়োজন এবং অন্য কোনও ধারক ধরণের দিয়ে করা উচিত নয়?

এমন কোনও অ্যালগরিদম নেই যা "অন্য কোনও ধারক ধরণের দিয়ে করা উচিত নয়"। কেবলমাত্র অ্যালগরিদম রয়েছে যা সেটের সুবিধা নিতে পারে। আপনার যখন অতিরিক্ত কোড লিখতে হবে না তখন এটি দুর্দান্ত।

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

এখানে চিত্র বর্ণনা লিখুন

এবং @germi যেমনটি যথাযথভাবে উল্লেখ করেছে, আপনি যদি কাজের জন্য সঠিক সংগ্রহটি ব্যবহার করেন তবে আপনার কোড অন্যের পক্ষে পড়া সহজ হয়ে যায়।


6
আপনি ইতিমধ্যে এটি উল্লেখ করেছেন, তবে একটি সেট ব্যবহার করা অন্য ব্যক্তির পক্ষে কোড সম্পর্কে যুক্তিযুক্ত হওয়া আরও সহজ করে তোলে; এটিতে কীভাবে এটি অনন্য আইটেম রয়েছে তা জেনে কীভাবে জনবহুল তা তাদের দেখার দরকার নেই।
জার্মানি

14

তবে আমি প্রতিটি এলিমেন্টোকে অন্য ভেক্টরে যুক্ত করে এবং উপাদানটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করেও এটি করতে পারি।

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

আপনি বিদ্যমান, পরীক্ষিত, দক্ষ সেট বাস্তবায়ন ব্যবহার করে কেন এটি করতে চান?


6

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

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

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


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

1
@ gnasher729 সেট প্রয়োগকারীদের দায়িত্বের মধ্যে অস্তিত্বের জন্য পরীক্ষা করা অন্তর্ভুক্ত রয়েছে, তবে সেটের কোনও ব্যবহারকারী সেট করতে পারেন for 1..100: set.insert(10)এবং এখনও জানতে পারেন যে মাত্র 10 রয়েছে
কালেথ

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

4

পারফরম্যান্স বৈশিষ্ট্যগুলি ছাড়াও (যা খুব তাৎপর্যপূর্ণ এবং এত সহজে বরখাস্ত করা উচিত নয়), বিমূর্ত সংগ্রহ হিসাবে সেটগুলি খুব গুরুত্বপূর্ণ।

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

সুতরাং আপনি এটি কি পেতে হবে? আপনি একটি নতুন ডেটা টাইপ তৈরি করবেন, এটিকে কল করুন (বলুন PsuedoSet), যা কোনও অভ্যন্তরীণ অ্যারে আবৃত করে এবং একটি insertক্রিয়াকলাপ প্রকাশ্যে প্রকাশ করে, যা উপাদানগুলির স্বতন্ত্রতা প্রয়োগ করে। মোড়ানো অ্যারে কেবল এই সর্বজনীন insertAPI এর মাধ্যমে অ্যাক্সেসযোগ্য তাই আপনি গ্যারান্টি দিচ্ছেন যে সদৃশ কখনই ঘটতে পারে না। এখন containsচেকগুলির কার্যকারিতা উন্নত করতে কিছুটা হ্যাশিং যুক্ত করুন , এবং খুব শীঘ্রই আপনি বুঝতে পারবেন যে আপনি একটি পুরো-আউট বাস্তবায়ন করেছেন Set

আমি একটি বিবৃতি দিয়ে প্রতিক্রিয়া এবং প্রশ্ন অনুসরণ করব:

আমার প্রথম প্রোগ্রামিং কোর্সে আমাকে বলা হয়েছিল যে যখনই আমার কোনও জিনিসের মাল্টিপল অর্ডার করা উপাদানগুলির মতো কাজ করা দরকার তখন আমার একটি অ্যারে ব্যবহার করা উচিত। যেমন: সহকর্মীদের নাম সংগ্রহ করতে to যাইহোক, আমি কাঁচা মেমরি বরাদ্দ করে এবং স্টার্ট পয়েন্টারটির দ্বারা প্রদত্ত মেমরি ঠিকানার মান সেট করে + কিছু অফসেট করেও তা করতে পারি।

আপনি কি কোনও অ্যারের নকল করতে কাঁচা পয়েন্টার এবং ফিক্সড অফসেট ব্যবহার করতে পারেন? হ্যাঁ একেবারে! প্রতিবার আপনি ,োকানোর সময়, আপনি যে বরাদ্দকৃত মেমরির সাথে কাজ করছেন তার অফসেটটি ঘুরে বেড়াচ্ছে না তা আপনি পরীক্ষা করতে পারেন। তবে এটি এমন কিছু যা আপনার সচেতনভাবে সচেতন হতে হবে এবং প্রতিবার আপনার সিউডো-অ্যারেতে প্রবেশ করার সময় মনে রাখবেন। ওহ সে কী, আপনি একবার অফসেটটি পরীক্ষা না করে একবার সরাসরি sertedোকালেন? স্বাগতম, এতে আপনার নামের সাথে একটি সেগমেন্টেশন ত্রুটি রয়েছে!

সুতরাং আপনি এটি কি পেতে হবে? আপনি একটি নতুন ডেটা টাইপ তৈরি করবেন, এটিকে কল করুন (বলুন PsuedoArray), যা একটি পয়েন্টার এবং একটি আকারকে আবৃত করে এবং একটি insertক্রিয়াকলাপ প্রকাশ্যে প্রকাশ করে, এটি কার্যকর করবে যে অফসেটটি আকারের চেয়ে বেশি হবে না। যেহেতু মোড়ানো ডেটা কেবলমাত্র এই সর্বজনীন insertAPI এর মাধ্যমে অ্যাক্সেসযোগ্য তাই আপনি গ্যারান্টি দেন যে কোনও বাফার ওভারফ্লো হতে পারে না। এখন কিছু অন্যান্য সুবিধামূলক ফাংশন (অ্যারে পুনরায় আকার দেওয়া, উপাদান মোছা ইত্যাদি) যুক্ত করুন, এবং খুব শীঘ্রই আপনি বুঝতে পারবেন যে আপনি একটি ফুল-আউট কার্যকর করেছেন Array


3

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

সেট ভিত্তিক অ্যালগরিদমগুলি বিভিন্ন পাথ সন্ধানকারী অ্যালগরিদম ইত্যাদিতে প্রচুর ব্যবহৃত হয় etc.

সেট তত্ত্বের প্রাইমারের জন্য এই লিঙ্কটি দেখুন: http://people.umass.edu/partee/NZ_2006/Set%2020 থিরি ২০২০ বেসিকস.পিডিএফ

আপনার যদি শব্দার্থবিজ্ঞানের সেট প্রয়োজন হয় তবে একটি সেট ব্যবহার করুন। এটি উত্সাহযুক্ত সদৃশগুলির কারণে বাগগুলি এড়াতে চলেছে কারণ আপনি কোনও পর্যায়ে ভেক্টর / তালিকাকে ছাঁটাই করতে ভুলে গিয়েছিলেন এবং আপনার ভেক্টর / তালিকার ক্রমাগত ছাঁটাই করে আপনি যা করতে পারেন তার চেয়ে দ্রুততর হতে চলেছে।


1

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

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

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

যে সরাইয়া...

তবে আমি প্রতিটি এলিমেন্টোকে অন্য ভেক্টরে যুক্ত করে এবং উপাদানটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করেও এটি করতে পারি।

নতুন ভেক্টরটিতে ইতিমধ্যে কোনও উপাদান উপস্থিত রয়েছে কিনা তা যাচাই করা সাধারণত একটি রৈখিক সময়ের অপারেশন হতে চলেছে যা সেট ছেদটিকে নিজেই এক চতুর্ভুজ অপারেশন করে তুলবে (ইনপুট আকারের বিস্ফোরক পরিমাণের কাজ)। আমি যদি উপরের কৌশলটি সুপারিশ করি তবে আপনি যদি কেবল সাদামাটা পুরাতন ভেক্টর বা অ্যারে ব্যবহার করতে চান এবং এমনভাবে করেন যাতে চমকপ্রদভাবে স্কেল হয়।

মূলত: কোন ধরণের অ্যালগরিদমগুলির জন্য একটি সেট প্রয়োজন এবং অন্য কোনও ধারক ধরণের দিয়ে করা উচিত নয়?

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

ট্যানজেন্ট অফ অফ গেঞ্জ

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

যাইহোক, উপাদানগুলি স্পর্শ না করে বহুগঠিত প্রসঙ্গে এমনকি এটি ব্যবহারিকভাবে সম্পাদন করা যেতে পারে যে:

  1. দুটি সমষ্টিতে উপাদানগুলির সূচকগুলি রয়েছে।
  2. সূচকের পরিধি খুব বেশি বড় নয় (বলুন [0, 2 ^ 26), বিলিয়ন বা তার বেশি নয়) এবং যুক্তিযুক্তভাবে ঘন দখল করা হয়েছে।

এটি আমাদের সেট অপারেশনের উদ্দেশ্যে একটি সমান্তরাল অ্যারে (উপাদান প্রতি মাত্র একটি বিট) ব্যবহার করতে দেয়। নকশা:

এখানে চিত্র বর্ণনা লিখুন

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

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

এখানে চিত্র বর্ণনা লিখুন

... একটি বিরল বিটসেটের জন্য সমান্তরাল বিট অ্যারে হিসাবে পরিবেশন করার জন্য একই ধারণা। এই কাঠামোগুলি নিজেকে অপরিবর্তনীয়তার দিকে ধার দেয় যেহেতু অগভীর অনুলিপি সহজেই অনুলিপি করা যায় যা নতুন অপরিবর্তনীয় অনুলিপি তৈরি করতে গভীর অনুলিপি করার প্রয়োজন হয় না।

শত শত মিলিয়ন উপাদানগুলির মধ্যে পুনরায় সেট ছেদগুলি খুব গড় মেশিনে এই পদ্ধতির ব্যবহার করে একটি সেকেন্ডের অধীনে করা যেতে পারে এবং এটি একক থ্রেডের মধ্যে।

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

// 'func' receives a range of indices to
// process.
set_intersection(func):
{
    parallel_bits = bit_pool.acquire()

    // Mark the indices found in the first list.
    for each index in list1:
        parallel_bits[index] = 1

    // Look for the first element in the second list 
    // that intersects.
    first = -1
    for each index in list2:
    {
         if parallel_bits[index] == 1:
         {
              first = index
              break
         }
    }

    // Look for elements that don't intersect in the second
    // list to call func for each range of elements that do
    // intersect.
    for each index in list2 starting from first:
    {
        if parallel_bits[index] != 1:
        {
             func(first, index)
             first = index
        }
    }
    If first != list2.num-1:
        func(first, list2.num)
}

... বা এই প্রভাব কিছু। প্রথম চিত্রের সিউডোকোডের সর্বাধিক ব্যয়বহুল অংশটি intersection.append(index)দ্বিতীয় লুপে রয়েছে এবং এটি std::vectorআগে থেকে ছোট তালিকার আকারের জন্যও সংরক্ষিত জন্য প্রযোজ্য ।

আমি যদি ডিপ কপি করি সব?

আচ্ছা, থামো! যদি আপনার ছেদগুলি সেট করার দরকার হয় তবে এটি বোঝায় যে আপনি বিপরীতে ছেদ করার জন্য ডেটা নকল করছেন। সম্ভাবনা হ'ল এমনকি আপনার অতি ক্ষুদ্রতম বস্তুগুলিও 32-বিট সূচকগুলির চেয়ে ছোট নয়। আপনার উপাদানগুলির ঠিকানা পরিসর 2 range 32 (2 ^ 32 উপাদান নয়, 2 ^ 32 বাইট) হ্রাস করা খুব সম্ভব যদি না আপনার প্রকৃতপক্ষে 4.3 বিলিয়ন ডলারের বেশি উপাদান তাত্ক্ষণিকভাবে প্রয়োজন হয়, যার পর্যায়ে সম্পূর্ণ ভিন্ন সমাধানের প্রয়োজন হয় ( এবং এটি অবশ্যই মেমরিতে সেট পাত্রে ব্যবহার করছে না)।

মূল ম্যাচ

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

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

আমি সূচকগুলি ভালবাসি!

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

যদি আপনি আপনার ডাটাবেসটিকে অ্যারেগুলিতে কেন্দ্রীয়ভাবে স্টোর করে এবং মেশিনের পুরো ঠিকানাযোগ্য পরিসীমা জুড়ে এমনভাবে স্ট্রোক করার পরিবর্তে সূচিকাগুলির পরিবর্তে সূচকের চারপাশে ঘুরিয়ে নিয়ে থাকেন তবে আপনি কেবলমাত্র অ্যালগরিদমিক এবং ডেটা কাঠামো সম্ভাবনার একটি পৃথিবী অন্বেষণ করতে পারেন পাত্রে এবং অ্যালগরিদমের নকশা করা যা প্লেইন পুরাতন intবা এর চারপাশে ঘোরে int32_t। এবং আমি শেষ ফলাফলটি এত বেশি দক্ষ এবং বজায় রাখা সহজ হিসাবে পেয়েছি যেখানে আমি নিয়মিত উপাদানগুলি এক ডেটা কাঠামো থেকে অন্যটিতে অন্যটিতে স্থানান্তর করছিলাম না।

কিছু উদাহরণস্বরূপ কেসগুলি ব্যবহার করে যখন আপনি কেবল ধরে নিতে পারেন যে কোনও অনন্য মানের Tএকটি অনন্য সূচক রয়েছে এবং এর উদাহরণ থাকবে কেন্দ্রীয় অ্যারেতে:

মাল্টিথ্রেডেড রেডিক্স প্রকারভেদ যা সূচকের জন্য স্বাক্ষরযুক্ত পূর্ণসংখ্যার সাথে ভালভাবে কাজ করে । আমার আসলে একটি মাল্টিথ্রেডেড রেডিক্স সাজান যা ইন্টেলের নিজস্ব সমান্তরাল সাজ হিসাবে প্রায় এক মিলিয়ন উপাদানকে সাজানোর জন্য প্রায় 1/10 তম সময় নেয় std::sortএবং এ জাতীয় বৃহত ইনপুটগুলির চেয়ে ইন্টেল এর ইতিমধ্যে 4 গুণ দ্রুত is ইন্টেল অবশ্যই তুলনামূলক ভিত্তিক সাজানোর কারণে এবং জিনিসকে ডিকশনিকভাবে বাছাই করতে পারে তাই এটি অনেক বেশি নমনীয়, তাই এটি কমলাতে আপেলের তুলনা করে। তবে এখানে আমার প্রায়শই কমলা দরকার, যেমন আমি কেবল ক্যাশে-বান্ধব মেমরি অ্যাক্সেসের ধরণগুলি অর্জন করতে বা ডুপ্লিকেটগুলি দ্রুত ফিল্টার আউট করার জন্য একটি রেডিক্স সারণি পাস করতে পারি।

লিঙ্ক তালিকা, গাছ, গ্রাফ, পৃথক chaining হ্যাশ টেবিল, ইত্যাদি নোড প্রতি গাদা বরাদ্দ ছাড়া মত কাঠামো বিল্ড লিঙ্ক করার ক্ষমতা । আমরা কেবলমাত্র নোডগুলিকে বাল্কে বরাদ্দ করতে পারি, উপাদানগুলির সমান্তরাল করতে পারি এবং সূচির সাথে তাদের সংযুক্ত করি link নোডগুলি নিজেরাই পরবর্তী নোডের জন্য 32-বিট সূচক হয়ে যায় এবং এর মতো একটি বড় অ্যারেতে সঞ্চিত হয়:

এখানে চিত্র বর্ণনা লিখুন

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

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

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

আরও বিস্তৃতি: বিরল বিটসেট গাছ

ঠিক আছে, আমি আরও কিছু ব্যাখ্যা করার জন্য একটি অনুরোধ পেয়েছি যা আমি ব্যঙ্গাত্মক বলে মনে করি, তবে আমি যেভাবেই হোক না কেন এটি এত মজাদার কারণ! লোকেরা যদি এই ধারণাটি পুরো নতুন স্তরে নিয়ে যেতে চায় তবে এন + এম উপাদানগুলির মধ্যে লিনিং লুপিং ছাড়াই সেট ছেদগুলি করা সম্ভব। এটি আমার চূড়ান্ত ডেটা স্ট্রাকচার যা আমি যুগে যুগে এবং মূলত মডেলগুলির জন্য ব্যবহার করে আসছি set<int>:

এখানে চিত্র বর্ণনা লিখুন

উভয় তালিকায় প্রতিটি উপাদানকে পরীক্ষা না করেও এটি সেট ছেদগুলি সম্পাদন করতে পারে কারণ হায়ারার্কির মূলে থাকা একটি সেট বিট এটি ইঙ্গিত করতে পারে যে, বলুন, মিলিয়ন মিলিয়ন উপাদান সেটে দখল করেছে in কেবলমাত্র একটি বিট পরিদর্শন করে, আমরা জানতে পারি যে পরিসরের এন সূচকগুলি [first,first+N)সেটে রয়েছে, যেখানে এন খুব বড় সংখ্যক হতে পারে।

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


2
"সেট ছেদগুলি গণনা করতে, আমি প্রথম অ্যারেটি দিয়ে পুনরাবৃত্তি করি এবং একক বিট দিয়ে উপাদান চিহ্নিত করি। তারপরে আমি দ্বিতীয় অ্যারেটি দিয়ে পুনরাবৃত্তি করি এবং চিহ্নিত উপাদানগুলির সন্ধান করি।" আপনি তাদের চিহ্নিত যেখানে দ্বিতীয় অ্যারে?
জিমি জেমস

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

2
"এটি একটি অন্তর্নিহিত সমাধান যা কিছু ক্ষেত্রে এনক্যাপসুলেশন লঙ্ঘন করে ..." একবার আপনি কী বোঝাতে চেয়েছিলেন তা আমার কাছে বুঝতে পেরেছিল, তা আমার কাছে ঘটেছিল তবে আমি মনে করি এটির দরকার নেই। যদি আপনার এমন কোনও শ্রেণি থাকে যা এই আচরণটি পরিচালনা করে, তবে সূচক বিষয়গুলি সমস্ত উপাদান ডেটা থেকে স্বতন্ত্র হতে পারে এবং আপনার সংগ্রহের ধরণের সমস্ত দৃষ্টান্তে ভাগ করা যায়। অর্থাত্‍ ডেটার একটি মাষ্টার সেট থাকবে এবং তারপরে প্রতিটি উদাহরণ মাস্টার সেটকে দেখায়। মাল্টি-থ্রেডিংয়ের আরও জটিলতার প্রয়োজন হবে তবে আমি মনে করি যদি এটি পরিচালনা করা যায়।
জিমি জেমস

1
দেখে মনে হচ্ছে এটি কোনও সম্ভাব্য ডেটাবেস সমাধানে কার্যকর হবে তবে আমি জানি না যে এইভাবে কোনও প্রয়োগ করা হয়েছে কিনা। এখানে এটি রাখার জন্য ধন্যবাদ। আপনি আমার মন কাজ করে।
জিমি জেমস

1
আপনি কি আরও কিছু বলতে পারেন? ;) আমার কিছুটা (প্রচুর) সময় হলে আমি এটি পরীক্ষা করে দেখব।
জিমি জেমস 16

-1

এন উপাদানগুলিতে থাকা একটি সেটটিতে অন্য উপাদান এক্স রয়েছে কিনা তা পরীক্ষা করতে সাধারণত ধ্রুব সময় লাগে। এন উপাদানগুলিতে থাকা অ্যারেতে অন্য একটি উপাদান রয়েছে কিনা তা পরীক্ষা করতে সাধারণত ও (এন) সময় লাগে। এটি খারাপ, তবে আপনি যদি এন আইটেমগুলি থেকে সদৃশগুলি সরাতে চান, হঠাৎ এটি O (n ^ 2) এর পরিবর্তে সময় নেবে O (n); 100,000 আইটেম আপনার কম্পিউটারকে তার হাঁটুর কাছে নিয়ে আসবে।

এবং আপনি আরও কারণ জিজ্ঞাসা করছেন? "শুটিং ছাড়াও আপনি কি সন্ধ্যা উপভোগ করেছেন, মিসেস লিংকন?"


2
আমি মনে করি আপনি এটি আবার পড়তে চাইতে পারেন। ও (এন) সময়ের পরিবর্তে ও (এন) সময় নেওয়া সাধারণত একটি ভাল জিনিস হিসাবে বিবেচিত হয়।
জিমি জেমস 13'13

এই পড়তে পড়তে হয়ত আপনার মাথায় দাঁড়িয়ে আছেন? ওপি জিজ্ঞাসা করল "কেন শুধু অ্যারে নেওয়া হবে না"।
gnasher729

2
ও (এন²) থেকে ও (এন) কেন 'কম্পিউটারের হাঁটুর কাছে' আনতে চলেছে? আমি অবশ্যই আমার ক্লাসে মিস করেছি।
জিমি জেমস 12'17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.