ছোট মেমরির পদচিহ্ন সহ একটি সেট বাস্তবায়ন খুঁজছেন


9

আমি সেট ডেটা ধরণের প্রয়োগের সন্ধান করছি। যে, আমাদের আছে

  • একটি গতিশীল উপসেট বজায় রাখা (আকার মহাবিশ্ব থেকে) {0, 1, 2, 3, \ বিন্দু, U- - 1 \} ইউ = \ আকারের তোমার দর্শন লগ করা সঙ্গেSnU={0,1,2,3,,u1}u
  • ক্রিয়াকলাপ insert(x)( এসx তে একটি উপাদান যুক্ত করুন ) এবং (উপাদান এস এর সদস্য কিনা তা পরীক্ষা করে )Sfind(x)xS

আমি অন্যান্য অপারেশন সম্পর্কে যত্ন নেই। অভিমুখীকরণের জন্য, অ্যাপ্লিকেশনগুলিতে আমি সাথে কাজ করছি আমরা আপনার u1010

আমি এমন বাস্তবায়ন সম্পর্কে জানি যা উভয় সময়ে ও (1) উভয় ক্রিয়াকলাপ সরবরাহ করে O(1), তাই আমি বেশিরভাগ ক্ষেত্রে ডেটা কাঠামোর আকার সম্পর্কে উদ্বিগ্ন। আমি বিলিয়ন বিলিয়ন এন্ট্রি আশা করি তবে যতটা সম্ভব অদলবদল এড়াতে চাই।

প্রয়োজনে রানটাইমের ত্যাগ করতে আমি রাজি আছি। হে ( or লগ এন) এর ইমোর্টাইজড রানটাইম O(logn)হ'ল আমি স্বীকার করতে পারি; expected ওমেগা (\ লগ এন) এ প্রত্যাশিত রানটাইম বা রানটাইম ω(logn)গ্রহণযোগ্য নয়।

আমার কাছে একটি ধারণা হ'ল যদি S রেঞ্জের ইউনিয়ন হিসাবে প্রতিনিধিত্ব করা যায় [xmin, xmax]তবে আমরা কিছু কার্যকারিতা হ্রাসের সাথে স্টোরেজ আকারে সঞ্চয় করতে সক্ষম হব। এছাড়াও, কিছু অন্যান্য ডেটা প্যাটার্নগুলি সম্ভব, যেমন [0, 2, 4, 6]

আপনি কি দয়া করে আমাকে এমন ডেটা স্ট্রাকচারের দিকে নির্দেশ করতে পারেন যা এর মতো কিছু করতে পারে?



উপাদানগুলির সংখ্যা কীভাবে ছবিতে প্রবেশ করে? অর্থাৎ, যদি কোনও উপাদান isোকানো হয় এবং ইতিমধ্যে থাকে তবে কী হবে ? nn
ভনব্র্যান্ড

@ ভনব্র্যান্ড - nসেটের আকারের আকার এস every insertএটি প্রত্যেকের সাথে বাড়তে পারে বা উপাদানটি xইতিমধ্যে সেটে থাকলে এটি একইরকম থাকতে পারে ।
হেকটো

3
আপনি কি মিথ্যা ইতিবাচক ক্ষুদ্র সম্ভাবনা গ্রহণ করতে পারেন? যদি তা হয় তবে একটি ব্লুম ফিল্টারটি আদর্শ হতে পারে: en.wikedia.org/wiki/Bloom_filter
জো

1
@AlekseyYakovlev, একটি পুষ্প ফিল্টারের মিথ্যা ইতিবাচক হার মহাবিশ্ব আকার (শুধুমাত্র হ্যাশ ফাংশন সংখ্যা সঙ্গে কিছুই করার আছে , ডাটা স্ট্রাকচার আকার , এবং আইটেম সংখ্যা ), কিন্তু যদি সত্যিই পাসে (বলুন একটি ছোট ধ্রুবক জন্য ), আপনি হার্ড একটি সহজ বিট ভেক্টর আমি মনে করি বেশী ভালো করতে হবে, একমাত্র চাপা করা হবে মোট বিট স্থান। kmnnuu=ncccn
জো

উত্তর:


8

জো এর উত্তর অত্যন্ত ভাল, এবং আপনাকে সমস্ত গুরুত্বপূর্ণ কীওয়ার্ড দেয়।

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

যদি সংগ্রহটি অর্ধ-স্থিতিশীল হয় (যা সন্নিবেশগুলি বিরল, বা কমপক্ষে নিম্ন-ভলিউম হয়) তবে এটি আপডেটের সাথে একযোগে কার্যকর-বাস্তবায়িত স্ট্যাটিক ডেটা স্ট্রাকচার (সাদাকানের সাদারেরাই একটি ভাল পছন্দ) বিবেচনা করার পক্ষে কার্যকর 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)<cf(n)
  • g(n)=o(f(n)) অর্থ হ'ল সমস্ত ধ্রুবকগুলির জন্য আছে এমন একটি সংখ্যা রয়েছে যা সমস্ত , ।cn0n>n0g(n)<cf(n)

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

অবশ্যই, সমস্যার আকারটি আপনার যে আপেক্ষিক ওভারহেড চান তা উপলব্ধি করতে প্রচুর পরিমাণে পেতে হতে পারে, তবে আপনার কাছে সমস্ত কিছুই থাকতে পারে না।

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

একজন লুকআপ অপারেশন হ্যাশ হবে , -বিট কী বন্ধ মাস্ক বিট হ্যাশ স্লট এটি, এবং তারপর যদি টেবিলে মান কী মিলেছে কিনা পরীক্ষা করুন। এ পর্যন্ত সব ঠিকই.nm

এই জাতীয় একটি হ্যাশ টেবিল বিট ব্যবহার করে। আমরা কি এর চেয়ে আরও ভাল করতে পারি?n2m

ধরুন যে হ্যাশ ফাংশন বিপরীত হয়। তারপরে আমাদের প্রতিটি হ্যাশ স্লটে পুরো কী সংরক্ষণ করতে হবে না। হ্যাশ স্লট অবস্থান আপনি দেয় হ্যাশ মান বিট, তাই যদি আপনি শুধুমাত্র সঞ্চিত অবশিষ্ট বিট, আপনি তথ্য (হ্যাশ স্লট অবস্থান এবং মূল্য সঞ্চিত আছে) যারা দুই টুকরা কী পুনর্গঠন করতে পারেন। সুতরাং আপনার কেবলমাত্র বিট স্টোরেজ প্রয়োজন।hmnm(nm)2m

যদি সাথে তুলনা করা ছোট হয় তবে স্ট্রিলিংয়ের সান্নিধ্য এবং সামান্য গাণিতিক (প্রমাণটি একটি অনুশীলন!) প্রকাশ করে যে:2m2n

(nm)2m=log(2n2m)+o(log(2n2m))

সুতরাং এই তথ্য কাঠামো সুসংহত।

তবে দুটি ক্যাচ রয়েছে are

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

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

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

ওহ, আপনি ভ্যান এমডে বোস গাছগুলিও দেখতে চাইতে পারেন।

আরও চিন্তা

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

তাহলে খুব কাছাকাছি , সংক্ষিপ্ত ডাটা স্ট্রাকচার সাহিত্যের সব উপদেশ আপনার অভিধান অর্থে উল্টানো হয়। মান যে সঞ্চয় করুন না সেট ঘটে থাকে। তবে, এখন আপনাকে কার্যকরভাবে মুছে ফেলা অপারেশনটিকে সমর্থন করতে হবে এবং সংহত আচরণ বজায় রাখতে আপনাকে আরও বেশি উপাদান যুক্ত হয়ে যাওয়ার সাথে সাথে ডেটা কাঠামো সঙ্কুচিত করতে সক্ষম হতে হবে। একটি হ্যাশ টেবিল প্রসারিত করা একটি সুচিন্তিত ক্রিয়াকলাপ, তবে এটি চুক্তি করে না।nu


হাই, আপনার উত্তরের দ্বিতীয় অনুচ্ছেদ হিসাবে - আমি প্রত্যাশা করি যে প্রতিটি কল একই যুক্তির সাথে insertএকটি কল findসাথে থাকবে। সুতরাং, যদি findরিটার্ন হয় true, তবে আমরা কেবল এড়িয়ে চলেছি insert। সুতরাং, findকলগুলির ফ্রিকোয়েন্সি কলগুলির ফ্রিকোয়েন্সি বেশি হয় insert, এছাড়াও যখন nঘনিষ্ঠ হয় u, তখন insertকলগুলি খুব বিরল হয়ে যায়।
হেকটো

তবে আপনি শেষ পর্যন্ত কাছাকাছি বলে আশা করছেন ? un
ছদ্মনাম

বাস্তব বিশ্বে এন বৃদ্ধি পাচ্ছে যতক্ষণ না এটি আপনার পৌঁছায়, তবে আমরা ভবিষ্যদ্বাণী করতে পারি না এটি ঘটবে কি হবে না। ডেটা স্ট্রাকচারটি যে n <= u
কোনওর

ঠিক। তারপর এটি এর ন্যায্য বলতে যে আমরা একটি একক ডাটা স্ট্রাকচার যা সংক্ষিপ্ত হয় (উপরে অর্থে) এবং যার সমগ্র পরিসীমা উপর এই অর্জন আমাদের জানা নেই । আমি আপনাকে একটি বিক্ষিপ্ত ডাটা স্ট্রাকচার চান যখন চলুন , তারপর ঘন এক (যেমন একটি বিট ভেক্টর) পাল্টাবেন, তখন প্রায় একটি উল্টানো সঙ্গে, তারপর একটি বিক্ষিপ্ত ডাটা স্ট্রাকচার ইন্দ্রিয় যখন পাসে হবে । nun<unu2nu
ছদ্মনাম

5

মনে হচ্ছে গতিশীল সদস্যপদ সমস্যার জন্য আপনি একটি সুসংগত ডেটা কাঠামো চান ।

স্মরণ করুন যে একটি সংক্ষিপ্ত তথ্য কাঠামো হ'ল যার জন্য তথ্য-তাত্ত্বিক নিম্ন সীমাবদ্ধতার জন্য স্থানটির প্রয়োজনীয়তা "কাছাকাছি", তবে একটি সংকোচিত ডেটা কাঠামোর বিপরীতে, এখনও দক্ষ অনুসন্ধানের জন্য অনুমতি দেয়।

সদস্য সমস্যা ঠিক কি আপনি আপনার প্রশ্নে বর্ণনা:

মহাবিশ্ব থেকে অপারেশন সহ এর আকারের একটি উপসেট (আকার ) বজায় রাখুন :SnU={0,1,2,3,,u1}u

  • find(x)(উপাদানx সদস্য কিনা তা পরীক্ষা করে দেখুন )।S
  • insert(x)(একটি উপাদান যোগ xকরার জন্য )S
  • delete(x)(x থেকে একটি উপাদান সরান )S

যদি কেবল findঅপারেশন সমর্থন করে তবে এটি স্থির সদস্যতার সমস্যা। যদি হয় insertবা deleteসমর্থিত হয় তবে উভয়ই নয়, এটিকে আধা-ডায়নামিক বলা হয় , এবং যদি তিনটি ক্রিয়াকলাপ সমর্থন করে তবে এটিকে ডায়নামিক সদস্যপদ সমস্যা বলা হয় ।

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

কনস্ট্যান্ট টাইম এবং অলমোস্ট-মিনিমাম স্পেসে সদস্যতা নিবন্ধের 5.1 প্রবন্ধে ব্রডনিক এবং মুনরো নিম্নলিখিত ফলাফলটি দিয়েছেন:

বিটগুলির জন্য প্রয়োজনীয় একটি ডেটা স্ট্রাকচার বিদ্যমান রয়েছে যা ধ্রুবক সময় অনুসন্ধান এবং ধ্রুবক প্রত্যাশিত মোড়িত সময়ে সন্নিবেশ এবং মোছা সমর্থন করে।O(B)

যেখানে হ'ল তথ্য তাত্ত্বিক ন্যূনতম বিটের প্রয়োজনীয় সংখ্যা।B=log(un)

মূল ধারণাটি হ'ল তারা মহাবিশ্বকে পুনরাবৃত্তির সাথে সাবধানতার সাথে নির্বাচিত আকারের বিভাজনে বিভক্ত করে, তাই প্রযুক্তিগুলি যেমন আপনি ভাবছেন সেই লাইনেও থাকতে পারে বলে মনে হচ্ছে।

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


1
ব্রডনিক ও মুনরো পেপার অ্যাবস্ট্রাক্ট সন্নিবেশ সম্পর্কে কিছু বলে না কিন্তু তাদের ফলাফল কি আমরা আশা করতে পারি, তাই না? যদি n = u/2, তবে প্রয়োজনীয় স্থান সর্বাধিক।
হেকটো

@ আলেকসিএইকোলেভ তারা বিমূর্তে গতিশীল কেসটি সম্পর্কে সত্যই উল্লেখ করেননি, তবে গতিশীল ক্ষেত্রে যে উপপাদ্য রয়েছে তা আমার উত্তরে উদ্ধৃত করা হয়েছে (বিভাগ 5 থেকে)।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.