অন্তরগুলিতে মানচিত্রের জন্য ডেটা কাঠামো


11

যাক একটি পূর্ণসংখ্যা হবে | টু Z সব পূর্ণসংখ্যার সেট বোঝান। যাক [ একটি , ] বোঝাতে পূর্ণসংখ্যার ব্যবধান { একটি , একটি + + 1 , একটি + + 2 , ... , }nZ[a,b]{a,a+1,a+2,,b}

আমি একটি মানচিত্র প্রতিনিধিত্ব করতে একটি ডাটা স্ট্রাকচার খোঁজ করছি । আমি চাই ডেটা স্ট্রাকচারটি নিম্নলিখিত ক্রিয়াকলাপগুলিকে সমর্থন করে:f:[1,n]Z

  • f ( i )get(i) ফিরতে হবে।f(i)

  • আপডেট করা উচিত যাতে( একটি ) = ( একটি + + 1 ) = = ( ) = Y , অর্থাত্, আপডেট একটি নতুন মানচিত্রে' যেমন যে' ( আমি ) = Y জন্য আমি [ একটি , ] এবংset([a,b],y)ff(a)=f(a+1)==f(b)=yfff(i)=yi[a,b]f(i)=f(i) জন্যi[a,b]

  • বৃহত্তম ব্যবধান ফেরত পাঠাবেন [ একটি , ] যেমন যে আমি [ একটি , ] এবং উপর ধ্রুবক [ একটি , ] (অর্থাত,( একটি ) = ( একটি + + 1 ) = = f ( ) )।stab(i)[a,b]i[a,b]f[a,b]f(a)=f(a+1)==f(b)

  • আপডেট করা উচিত একটি নতুন মানচিত্রে' যেমন যে' ( আমি ) = ( আমি ) + + δ জন্য আমি [ একটি , ] এবং' ( আমি ) = ( আমি ) জন্য আমি [ একটি , ]add([a,b],δ)fff(i)=f(i)+δi[a,b]f(i)=f(i)i[a,b]

আমি চাই যে এই প্রতিটি অপারেশন দক্ষ হোক। আমি O(1) বা O(lgn) সময়কে দক্ষ হিসাবে গণনা করব তবে O(n) সময়টি খুব ধীর। চলমান সময়গুলি চলমান সময়গুলিকে অনুশীলন করা ঠিক আছে। এমন কোনও ডেটা কাঠামো রয়েছে যা একই সাথে এই সমস্ত ক্রিয়াকলাপকে দক্ষ করে তোলে?

(আমি লক্ষ্য করেছি যে বেশ কয়েকটি প্রোগ্রামিং চ্যালেঞ্জের ক্ষেত্রে একই ধরণের নমুনা এসেছে This এটি একটি সাধারণীকরণ যা এই সমস্ত চ্যালেঞ্জ সমস্যার জন্য যথেষ্ট।)


আমি অনুমান করি যে স্প্লে গাছগুলি প্রাথমিক পয়েন্ট। যদিও [ , বি ]add এর সাবিনটারভাল সংখ্যায় লিনিয়ার হবে ; আপনি কি অবিচ্ছিন্ন " + δ " নোড, অলসভাবে সংক্ষেপিত একটি স্প্লে গাছ সম্পর্কে চিন্তা করেছেন ? [a,b]+δ
গিলস 'অশুচি হওয়া বন্ধ করুন'

বিবেচনা করুন যে f ( i ) f ( j ) সমস্ত i , j এর জন্য । তারপরে আপনার কোথাও এন মানগুলি সংরক্ষণ করতে হবে । পারফর্মিং সেট ( [ a , b ] , y ) কে কোনওভাবে সেই মানগুলি থেকে মুক্তি দিতে হবে (সেগুলি পুনরায় লিখে বা ফেলে দিয়ে - আপনি জিসির সাথে স্থগিত করতে পারেন, তবে আপনাকে কোনও সময়ে ( এন ) অপারেশন করতে হবে ) । এর মতো, অপারেশনটি ( এন ) হবেff(i)f(j)ijnset([a,b],y)O(n)O(n)
অবাকর

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

আপনি লক্ষ করেছেন যে ধ্রুবক এবং লোগারিথমিক সময় দক্ষ এবং লিনিয়ার সময় ধীর। হায় সময় আপনার প্রয়োজনের জন্য খুব ধীর হতে পারে? O(nlgn)
jbapple

@ জবাপ্পল, আরে, এটা একটা শুরু! আমি মনে করি এটি উত্তর হিসাবে নথিভুক্ত মূল্যবান।
DW

উত্তর:


4

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

একটি সাধারণ স্কিম (সহায়তা পেতে এবং সেট করা সমর্থন করে তবে সংযুক্ত বা ছুরিকাঘাত নয়)

বলে যে একটি বিরতি হয় ফ্ল্যাট যদি ফাংশন উপর ধ্রুবক [ একটি , ] , অর্থাত, যদি ( একটি ) = ( একটি + + 1 ) = = ( )[a,b]f[a,b]f(a)=f(a+1)==f(b)

আমাদের সাধারণ ডেটা স্ট্রাকচারটি একটি অন্তরবৃক্ষ হবে। অন্য কথায়, আমাদের কাছে একটি বাইনারি গাছ রয়েছে, যেখানে প্রতিটি নোড একটি অন্তর (সূচকের) সাথে মিলে যায়। আমরা সংশ্লিষ্ট ব্যবধান সংরক্ষণ করব প্রতিটি নোডের মধ্যে বনাম গাছের। প্রতিটি পাতা সমতল ব্যবধানের সাথে সামঞ্জস্য করবে এবং সেগুলি এমনভাবে সাজানো হবে যাতে বাম থেকে ডানে পাতাগুলি পড়া আমাদের ধারাবাহিক সমতল অন্তরগুলির ক্রম দেয় যা বিচ্ছিন্ন এবং যার ইউনিয়ন সমস্ত [ 1 , n ] । অভ্যন্তরীণ নোডের ব্যবধানটি তার দুই সন্তানের অন্তরগুলির মিলন হবে। এছাড়াও, প্রতিটি গাছের পাতা নোড আমরা মান সংরক্ষণ করবে ভী ( )I(v)v[1,n]V()ফাংশনের ব্যবধান উপর আমি ( ) এই নোডের সংশ্লিষ্ট (নোট যে এই ব্যবধান, ফ্ল্যাট, তাই ব্যবধান উপর ধ্রুবক, তাই আমরা একটি একক মান সংরক্ষণ প্রতিটি গাছের পাতা নোডের মধ্যে)।fI()ff

সমানভাবে, আপনি কল্পনা করতে পারেন যে আমরা সমতল অন্তরগুলিতে ভাগ করি এবং তারপরে ডেটা স্ট্রাকচার হ'ল বাইনারি অনুসন্ধান ট্রি যেখানে কীগুলি সেই অন্তরগুলির বাম প্রান্ত হয়। পাতাগুলি সূচকের কিছু পরিসরে এর মান ধারণ করে যেখানে স্থির থাকে contain[1,n]ff

তা নিশ্চিত করার জন্য বাইনারি ট্রি সুষম থাকে, মান পদ্ধতি ব্যবহার করুন অর্থাত, তার গভীরতা (যেখানে মি গন্য গাছে পাতার বর্তমান নম্বর)। অবশ্যই, m n , তাই গভীরতা সর্বদা সর্বাধিক O ( lg n ) । এটি নীচে সহায়ক হবে।O(lgm)mmnO(lgn)

আমরা এখন নীচে নীচে গেট এবং সেট অপারেশনগুলিকে সমর্থন করতে পারি:

  • সহজ: আমরা গাছ তর্ক পাতার যার ব্যবধান রয়েছে এটি আমি । এটি মূলত একটি বাইনারি অনুসন্ধান ট্রিকে অনুসরণ করছে। যেহেতু গভীরতা হে ( LG এন ) , দৌড়ানো সময় হে ( LG এন )get(i)iO(lgn)O(lgn)

  • জটিল। এটি এর মতো কাজ করে:set([a,b],y)

    1. [a0,b0]aa0<a[a0,a1][a,b0]

    2. [a1,b1]bb<b1[a1,b][b+1,b1]

    3. [a,b]O(lgn)O(lgn)y

    4. শেষ অবধি, যেহেতু আমরা গাছের আকার পরিবর্তন করেছি, আমরা গাছটিকে ভারসাম্য বজায় রাখতে (গাছকে ভারসাম্য বজায় রাখার জন্য কোনও মানক কৌশল ব্যবহার করে) প্রয়োজনীয় ঘোরাঘুরি করব।

    O(lgn)O(lgn)O(lgn)

O(lgn)O(lgmin(n,s))s

অ্যাডের জন্য সমর্থন যোগ করা হচ্ছে

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

আরো সঠিকভাবে, মান ইনপুট এ ফাংশনের গাছের পাতা যার ব্যবধান রয়েছে নিচে গাছের শিকড় থেকে পথে নোড সঞ্চিত মানের সমষ্টি হিসাবে আদায় করা হবে । প্রতিটি নোডে আমরা একটি মান সঞ্চয় করব ; যদি পাতার পূর্বপুরুষ প্রতিনিধিত্ব (গাছের পাতা নিজেই সহ), তারপর এ ফাংশনের মান হতে হবে ।f(i)iivV(v)v0,v1,,vkvkI(vk)V(v0)++V(vk)

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

এবং এখন আমরা দক্ষতার সাথে সমর্থন করতে পারি । প্রথমে, আমরা গাছের নোডের কিছু সেট নোডের সাথে সামঞ্জস্যপূর্ণ অন্তরগুলির হিসাবে বিরতিটি প্রকাশ করি প্রয়োজনে বাম প্রান্ত বিন্দুতে একটি নোড বিভক্ত করে এবং ডান প্রান্তে ) ঠিক যেমনটি সেট অপারেশনের 1-3 পদক্ষেপে সম্পন্ন হয়েছে। এখন, আমরা কেবলমাত্র নোডের প্রত্যেকটিতে সঞ্চিত যুক্ত করি । (আমরা তাদের বংশধরদের মুছে ফেলি না))add([a,b],δ)[a,b]O(lgn)O(lgn)δO(lgn)

এটি অপারেশন প্রতি সময়ে পেতে, সেট করতে এবং যুক্ত করতে সহায়তা করার একটি উপায় সরবরাহ করে। প্রকৃতপক্ষে, অপারেশন প্রতি চলমান সময় হ'ল যেখানে সেট অপারেশনের সংখ্যা এবং অ্যাড অপারেশনের সংখ্যাকে গণনা করে।O(lgn)O(lgmin(n,s))s

ছুরিকাঘাত অপারেশন সমর্থন

ছুরিকাঘাতে জিজ্ঞাসা সমর্থন করা সবচেয়ে চ্যালেঞ্জিং। নিম্নলিখিত অতিরিক্ত আক্রমণকারী সংরক্ষণের জন্য মূল ধারণাটি হবে উপরোক্ত ডেটা কাঠামোটি সংশোধন করা:

(*) ব্যবধান প্রতিটি গাছের পাতা সংশ্লিষ্ট একটি সর্বোচ্চ ফ্ল্যাট ব্যবধান হয়।I()

এখানে আমি যে একটি বিরতি হয় সর্বোচ্চ ফ্ল্যাট ব্যবধান যদি (ঝ) সমতল, এবং (ii) কোন ধারণকারী ব্যবধান সমতল (অন্য কথায়, সব জন্য সন্তোষজনক , হয় বা সমতল নয়)।[a,b][a,b][a,b]a,b1aabbn[a,b]=[a,b][a,b]

এটি ছুরতাইয়ের কাজটি কার্যকর করা সহজ করে তোলে:

  • stab(i) পাতাগুলি খুঁজে পায় যার বিরতিতে থাকে এবং তারপরে সেই বিরতি ফিরে আসে।i

তবে, এখন আমাদের আক্রমণটি (*) বজায় রাখতে সেটটি পরিবর্তন করতে হবে এবং অপারেশন যুক্ত করতে হবে। প্রতিবার যখনই আমরা একটি পাতা দুটি ভাগে ভাগ করি তখন আমরা কিছু আক্রমণকারীকে লঙ্ঘন করতে পারি যদি কিছু সংলগ্ন জোড়া-পাতার ব্যবধানে এর একই মান থাকে । ভাগ্যক্রমে, প্রতিটি সেট / অ্যাড অপারেশন সর্বাধিক 4 টি নতুন পাতার অন্তর যুক্ত করে। এছাড়াও, প্রতিটি নতুন ব্যবধানের জন্য, এর বাম এবং ডানদিকে তাত্ক্ষণিক পাতার বিরতি খুঁজে পাওয়া সহজ। অতএব, আমরা বলতে পারি যে আক্রমণকারীকে লঙ্ঘন করা হয়েছিল কিনা; যদি এটি ছিল, তবে আমরা সংলগ্ন বিরতিগুলিকে একীভূত করি যেখানে এর একই মান রয়েছে। ভাগ্যক্রমে, দুটি সংলগ্ন বিরতি মার্জ করা ক্যাসকেডিং পরিবর্তনগুলি ট্রিগার করে না (সুতরাং আমাদের একীভূতকরণটি আক্রমণকারীটির অতিরিক্ত লঙ্ঘন চালু করেছিল কিনা তা খতিয়ে দেখার দরকার নেই)। সর্বোপরি, এর মধ্যে পরীক্ষা করা জড়িতf 12 = O ( 1 ) ( এলজি এন )ff12=O(1)অন্তর জোড়া এবং সম্ভবত তাদের মার্জ। পরিশেষে, যেহেতু কোনও সংহতকরণ গাছের আকার পরিবর্তন করে, যদি এটি ভারসাম্য-আক্রমণকারীদের লঙ্ঘন করে তবে গাছকে ভারসাম্য বজায় রাখতে প্রয়োজনীয় কোনও ঘূর্ণন সঞ্চালন করুন (বাইনারি গাছগুলিকে ভারসাম্য বজায় রাখার জন্য মানক কৌশল অনুসরণ করুন)। মোট, এটি সেট / অ্যাড অপারেশনগুলিতে সর্বাধিক অতিরিক্ত কাজ যুক্ত করে।O(lgn)

সুতরাং, এই চূড়ান্ত ডেটা কাঠামোটি চারটি ক্রিয়াকলাপ সমর্থন করে এবং প্রতিটি ক্রিয়াকলাপের চলমান সময় হ'ল । আরও সুনির্দিষ্ট প্রাক্কলন হ'ল অপারেশন প্রতি সময়, যেখানে সংখ্যার সংখ্যা গণনা করে এবং অপারেশন যুক্ত করে।( এলজি মিনিট ( এন , গুলি ) ) এসO(lgn)O(lgmin(n,s))s

বিভাজন চিন্তাভাবনা

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

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