জো এর উত্তর অত্যন্ত ভাল, এবং আপনাকে সমস্ত গুরুত্বপূর্ণ কীওয়ার্ড দেয়।
আপনার সচেতন হওয়া উচিত যে সাসিনেক্ট ডেটা স্ট্রাকচার গবেষণা এখনও প্রাথমিক পর্যায়ে রয়েছে এবং ফলাফলগুলির অনেকগুলিই মূলত তাত্ত্বিক। প্রস্তাবিত অনেকগুলি ডেটা স্ট্রাকচার বাস্তবায়নের জন্য বেশ জটিল, তবে বেশিরভাগ জটিলতা এই সত্যের কারণে যে আপনাকে মহাবিশ্বের আকার এবং সঞ্চিত উপাদানগুলির সংখ্যা উভয়ই অ্যাসিপটোটিক জটিলতা বজায় রাখতে হবে। এর মধ্যে যে কোনও একটি যদি তুলনামূলকভাবে ধ্রুবক হয়, তবে অনেক জটিলতা চলে যায়।
যদি সংগ্রহটি অর্ধ-স্থিতিশীল হয় (যা সন্নিবেশগুলি বিরল, বা কমপক্ষে নিম্ন-ভলিউম হয়) তবে এটি আপডেটের সাথে একযোগে কার্যকর-বাস্তবায়িত স্ট্যাটিক ডেটা স্ট্রাকচার (সাদাকানের সাদারেরাই একটি ভাল পছন্দ) বিবেচনা করার পক্ষে কার্যকর worth ক্যাশে। মূলত, আপনি একটি traditionalতিহ্যবাহী ডেটা কাঠামোতে আপডেটগুলি রেকর্ড করেন (যেমন বি-ট্রি, ত্রি, হ্যাশ টেবিল) এবং পর্যায়ক্রমে "মূল" ডেটা স্ট্রাকচারকে বাল্ক-আপডেট করুন। তথ্য পুনরুদ্ধারে এটি একটি খুব জনপ্রিয় কৌশল, যেহেতু ইনভার্ট ইনডেক্সগুলিতে অনুসন্ধানের জন্য অনেক সুবিধা রয়েছে তবে জায়গাটিতে আপডেট করা শক্ত। যদি এটি হয় তবে দয়া করে আমাকে একটি মন্তব্যে জানান এবং আমি আপনাকে কিছু পয়েন্টার দেওয়ার জন্য এই উত্তরটি সংশোধন করব।
যদি সন্নিবেশগুলি আরও ঘন ঘন হয় তবে আমি সুপারিশটি হ্যাশিংয়ের পরামর্শ দিই। মূল ধারণাটি এখানে ব্যাখ্যা করার জন্য যথেষ্ট সহজ, তাই আমি এটি করব।
সুতরাং মৌলিক তথ্য তত্ত্বীয় ফলাফলের যে আপনি যদি সংরক্ষণকারী করছি উপাদানের একটি মহাবিশ্ব থেকে তারপর আপনার যা দরকার আইটেম, এবং অন্য কোন তথ্য (যেমন উপাদানের মধ্যে কোন পারস্পরিক সম্পর্ক) আছে এটি সংরক্ষণ করার জন্য বিট। (সমস্ত লগারিদম বেস -২ হয় অন্যথায় নির্দিষ্ট না করে)) আপনার এগুলিতে অনেকগুলি বিট দরকার । এর বাইরে কোন পথ খোলা নেই।nulog(un)+O(1)
এখন কিছু পরিভাষা:
- আপনার যদি এমন কোনও ডেটা স্ট্রাকচার থাকে যা ডেটা সঞ্চয় করতে পারে এবং আপনার ক্রিয়াকলাপগুলিকে support সমর্থন করতে পারে স্পেসের বিট চয়ন করতে পারে তবে আমরা এটিকে একটি অন্তর্নিহিত ডেটা স্ট্রাকচার বলি ।log(un)+O(1)
- যদি আপনার কাছে এমন কোনও ডেটা কাঠামো থাকে যা ডেটা সঞ্চয় করতে পারে এবং আপনার ক্রিয়াকলাপগুলিকে সমর্থন করতে পারে স্থানের বিট , আমরা এটিকে একটি কমপ্যাক্ট ডেটা স্ট্রাকচার বলি । নোট করুন যে অনুশীলনে এর অর্থ হ'ল আপেক্ষিক ওভারহেড (তাত্ত্বিক সর্বনিম্নের তুলনায়) একটি ধ্রুবকের মধ্যে রয়েছে। এটি 5% ওভারহেড বা 10% ওভারহেড বা 10 বার ওভারহেড হতে পারে।log(un)+O(log(un))=(1+O(1))log(un)
- আপনার যদি এমন কোনও ডেটা কাঠামো থাকে যা ডেটা সঞ্চয় করতে পারে এবং আপনার ক্রিয়াকলাপগুলিকে support সমর্থন করতে পারে স্থান বিট, আমরা এই একটি কল সংক্ষিপ্ত ডাটা স্ট্রাকচার।log(un)+o(log(un))=(1+o(1))log(un)
সংক্ষিপ্ত এবং কমপ্যাক্টের মধ্যে পার্থক্য হ'ল ছোট-ওহ এবং বড়-ওহ মধ্যে পার্থক্য। এক মুহুর্তের জন্য পরম-মূল্য জিনিসটিকে উপেক্ষা করা হচ্ছে ...
- g(n)=O(f(n)) অর্থ হ'ল একটি ধ্রুবক এবং একটি সংখ্যা রয়েছে যা সমস্ত , ।cn0n>n0g(n)<c⋅f(n)
- g(n)=o(f(n)) অর্থ হ'ল সমস্ত ধ্রুবকগুলির জন্য আছে এমন একটি সংখ্যা রয়েছে যা সমস্ত , ।cn0n>n0g(n)<c⋅f(n)
অনানুষ্ঠানিকভাবে, বিগ-ওহ এবং লিটল-ওহ উভয়ই "একটি ধ্রুবক ফ্যাক্টরের অভ্যন্তরে" থাকে তবে বড়-ওহ দিয়ে ধ্রুবকটি আপনার জন্য বেছে নেওয়া হয় (অ্যালগোরিদম ডিজাইনার, সিপিইউ প্রস্তুতকারক, পদার্থবিজ্ঞানের আইন বা যাই হোক না কেন), তবে সামান্য সহ -আপনি ধ্রুবক নিজেকে বেছে নেন এবং এটি আপনার পছন্দ মতো ছোট হতে পারে । এটিকে অন্য উপায়ে বলতে গেলে, সংক্রামিত ডেটা স্ট্রাকচারের সাথে, সমস্যার আকার বাড়ার সাথে আপেক্ষিক ওভারহেড নির্বিচারে ছোট হয়ে যায়।
অবশ্যই, সমস্যার আকারটি আপনার যে আপেক্ষিক ওভারহেড চান তা উপলব্ধি করতে প্রচুর পরিমাণে পেতে হতে পারে, তবে আপনার কাছে সমস্ত কিছুই থাকতে পারে না।
ঠিক আছে, এটি আমাদের বেল্টগুলির নীচে রেখে আসুন, সমস্যাটিতে কিছু নম্বর দিন। আসুন অনুমান করা যাক কীগুলি বিট পূর্ণসংখ্যা (সুতরাং মহাবিশ্বের আকার ), এবং আমরা এই পূর্ণসংখ্যার সঞ্চয় করতে চাই । আসুন ধরা যাক আমরা পুরো পেশা এবং কোনও অপচয় না করে জাদুগতভাবে একটি আদর্শিক হ্যাশ টেবিলটি সাজিয়ে তুলতে পারি, যাতে আমাদের ঠিক হ্যাশ স্লট প্রয়োজন।n2n2m2m
একজন লুকআপ অপারেশন হ্যাশ হবে , -বিট কী বন্ধ মাস্ক বিট হ্যাশ স্লট এটি, এবং তারপর যদি টেবিলে মান কী মিলেছে কিনা পরীক্ষা করুন। এ পর্যন্ত সব ঠিকই.nm
এই জাতীয় একটি হ্যাশ টেবিল বিট ব্যবহার করে। আমরা কি এর চেয়ে আরও ভাল করতে পারি?n2m
ধরুন যে হ্যাশ ফাংশন বিপরীত হয়। তারপরে আমাদের প্রতিটি হ্যাশ স্লটে পুরো কী সংরক্ষণ করতে হবে না। হ্যাশ স্লট অবস্থান আপনি দেয় হ্যাশ মান বিট, তাই যদি আপনি শুধুমাত্র সঞ্চিত অবশিষ্ট বিট, আপনি তথ্য (হ্যাশ স্লট অবস্থান এবং মূল্য সঞ্চিত আছে) যারা দুই টুকরা কী পুনর্গঠন করতে পারেন। সুতরাং আপনার কেবলমাত্র বিট স্টোরেজ প্রয়োজন।hmn−m(n−m)2m
যদি সাথে তুলনা করা ছোট হয় তবে স্ট্রিলিংয়ের সান্নিধ্য এবং সামান্য গাণিতিক (প্রমাণটি একটি অনুশীলন!) প্রকাশ করে যে:2m2n
(n−m)2m=log(2n2m)+o(log(2n2m))
সুতরাং এই তথ্য কাঠামো সুসংহত।
তবে দুটি ক্যাচ রয়েছে are
প্রথম ক্যাচটি "ভাল" ইনভারটিবল হ্যাশ ফাংশন তৈরি করছে। ভাগ্যক্রমে, এটি দেখতে দেখতে এটি অনেক সহজ; ক্রিপ্টোগ্রাফাররা সমস্ত সময় অবিচ্ছেদ্য ফাংশন করে, কেবল তারা তাদের "সাইফার" বলে call উদাহরণস্বরূপ, আপনি একটি ফিস্টেল নেটওয়ার্কে একটি হ্যাশ ফাংশনটি বেস করতে পারেন, যা নন-ইনভারটিয়েবল হ্যাশ ফাংশনগুলি থেকে একটি ইনভারটিয়েবল হ্যাশ ফাংশন তৈরির সোজা উপায়।
দ্বিতীয় ক্যাচটি হ'ল আসল হ্যাশ টেবিলগুলি আদর্শ নয়, জন্মদিনের প্যারাডক্সকে ধন্যবাদ। সুতরাং আপনি আরও পরিশীলিত ধরণের হ্যাশ টেবিল ব্যবহার করতে চান যা কোনও স্পিল ছাড়াই আপনাকে পুরো পেশার কাছাকাছি পৌঁছে দেয়। কোকিল হ্যাশিং এর জন্য উপযুক্ত, কারণ এটি আপনাকে তত্ত্বের দিক থেকে নির্বিচারে আদর্শের নিকটে এবং অনুশীলনে বেশ কাছাকাছি পেতে দেয়।
কোকিল হ্যাশিংয়ের জন্য একাধিক হ্যাশ ফাংশন প্রয়োজন হয় এবং এটির জন্য হ্যাশ স্লটগুলির মানগুলি ট্যাগ করা দরকার যার সাথে হ্যাশ ফাংশন ব্যবহৃত হত। সুতরাং আপনি যদি চারটি হ্যাশ ফাংশন ব্যবহার করেন, উদাহরণস্বরূপ, আপনাকে প্রতিটি হ্যাশ স্লটে অতিরিক্ত দুটি বিট সংরক্ষণ করতে হবে। বাড়ার সাথে সাথে এটি এখনও সংক্রামিত , সুতরাং এটি অনুশীলনে কোনও সমস্যা নয় এবং এখনও পুরো কীগুলি সংরক্ষণ করে মারধর করে।m
ওহ, আপনি ভ্যান এমডে বোস গাছগুলিও দেখতে চাইতে পারেন।
আরও চিন্তা
তাহলে কোথাও প্রায় , তারপর আনুমানিক , তাই (আবার) অভিমানী মানের মধ্যে আর কোনো পারস্পরিক সম্পর্ক নেই, আপনি মূলত কোন কাজ করতে পারবেন না কিছুটা ভেক্টরের চেয়ে ভাল আপনি লক্ষ্য করবেন যে উপরের হ্যাশিং সমাধানটি সেই ক্ষেত্রে কার্যকরভাবে হ্রাস পেয়েছে (আপনি হ্যাশ স্লট প্রতি এক বিট সংরক্ষণ করছেন) তবে হ্যাশ ফাংশনটি ব্যবহার না করে ঠিক ঠিকানা হিসাবে কীটি ব্যবহার করা সস্তা।nu2log(un)u
তাহলে খুব কাছাকাছি , সংক্ষিপ্ত ডাটা স্ট্রাকচার সাহিত্যের সব উপদেশ আপনার অভিধান অর্থে উল্টানো হয়। মান যে সঞ্চয় করুন না সেট ঘটে থাকে। তবে, এখন আপনাকে কার্যকরভাবে মুছে ফেলা অপারেশনটিকে সমর্থন করতে হবে এবং সংহত আচরণ বজায় রাখতে আপনাকে আরও বেশি উপাদান যুক্ত হয়ে যাওয়ার সাথে সাথে ডেটা কাঠামো সঙ্কুচিত করতে সক্ষম হতে হবে। একটি হ্যাশ টেবিল প্রসারিত করা একটি সুচিন্তিত ক্রিয়াকলাপ, তবে এটি চুক্তি করে না।nu