ডুপ্লিকেট সহ চতুষ্কোণ


10

আমি একটি চতুর্থাংশ বাস্তবায়ন করছি। যারা এই ডেটা কাঠামো জানেন না তাদের জন্য আমি নিম্নলিখিত ছোট বিবরণটি অন্তর্ভুক্ত করছি:

একজন Quadtree একটি ডাটা স্ট্রাকচার এবং ইউক্লিডিয় সমতল কি একটি Octree একটি 3-মাত্রিক স্থান হয় হয়। চতুর্ভুজগুলির একটি সাধারণ ব্যবহার স্থানিক সূচক।

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

সুতরাং একটি চতুষ্কোণ হয় হয় একটি পাতা এবং তার ক্ষমতার চেয়ে কম উপাদান থাকে বা একটি বাচ্চা হিসাবে 4 টি চতুর্ভুজ গাছ রয়েছে (সাধারণত উত্তর-পশ্চিম, উত্তর-পূর্ব, দক্ষিণ-পশ্চিম, দক্ষিণ-পূর্ব)।

আমার উদ্বেগটি হ'ল আপনি যদি নকলগুলি যুক্ত করার চেষ্টা করেন তবে এটি একই উপাদানটি কয়েকবার হতে পারে বা একই অবস্থানের সাথে বিভিন্ন উপাদান হতে পারে, চতুর্দিকে প্রান্তগুলি পরিচালনা করার ক্ষেত্রে একটি মৌলিক সমস্যা হতে পারে।

উদাহরণস্বরূপ, আপনি যদি 1 এর সক্ষমতা এবং চতুর্ভুজ বাক্স হিসাবে ইউনিট আয়তক্ষেত্রযুক্ত চতুষ্কোণ দিয়ে কাজ করেন:

[(0,0),(0,1),(1,1),(1,0)]

এবং আপনি দ্বিগুণ একটি আয়তক্ষেত্র twiceোকানোর চেষ্টা করছেন যার উপরের বাম দিকের সীমাটি মূল: (বা একইভাবে আপনি যদি এন> 1 এর ক্ষমতা সহ চতুর্ভুজগুলিতে N + 1 বার সন্নিবেশ করানোর চেষ্টা করেন)

quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)

প্রথম সন্নিবেশ কোনও সমস্যা হবে না: প্রথমে .োকান

তবে তারপরে প্রথম সন্নিবেশ একটি মহকুমা ট্রিগার করবে (কারণ ক্ষমতাটি 1): দ্বিতীয় সন্নিবেশ, প্রথম মহকুমা

উভয় আয়তক্ষেত্রকে একই উপশ্রেণীতে রাখা হয়।

তারপরে আবারও দুটি উপাদান একই চতুষ্কোণে এসে একটি মহকুমা ট্রিগার করবে ... দ্বিতীয় সন্নিবেশ, দ্বিতীয় মহকুমা

এবং এইভাবে এবং আরও, এই মহকুমা পদ্ধতি অনির্দিষ্টকালের জন্য চলবে কারণ (0, 0) তৈরি হওয়া চারটির মধ্যে সর্বদা একই সাবট্রিতে থাকবে, যার অর্থ অসীম পুনরাবৃত্তি সমস্যা দেখা দেয়।

ডুপ্লিকেট সহ চতুর্ভুজ রাখা কি সম্ভব? (যদি তা না হয় তবে এটি এটিকে বাস্তবায়ন করতে পারে Set)

চতুর্দিকে আর্কিটেকচার পুরোপুরি না ভেঙে আমরা কীভাবে এই সমস্যাটি সমাধান করতে পারি?


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

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

উত্তর:


3

আপনি একটি ডেটা কাঠামো বাস্তবায়ন করছেন, তাই আপনাকে বাস্তবায়ন সিদ্ধান্ত নিতে হবে।

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

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

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

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


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

গাছের ধরণের কাঠামোর জন্য, মান সহ নোডকে কখনও কখনও "গণনা" ক্ষেত্রও দেওয়া হয় না যা কেবল নকলগুলির জন্য কেবল বৃদ্ধি এবং হ্রাস?
জে ট্রানা

2

আমি মনে করি এখানে একটি ভুল ধারণা রয়েছে।

আমি এটি বুঝতে পারি, প্রতিটি চতুর্ভুজ নোডে একটি বিন্দু দ্বারা সূচকযুক্ত মান থাকে contains অন্য কথায় এটিতে ট্রিপল (x, y, মান) থাকে।

এটিতে শিশু নোডগুলিতে 4 পয়েন্টার রয়েছে যা শূন্য হতে পারে। কী এবং সন্তানের লিঙ্কগুলির মধ্যে একটি অ্যালগরিদমিক সম্পর্ক রয়েছে।

আপনার সন্নিবেশগুলি দেখতে এমন হওয়া উচিত।

quadtree->insert(0.0, 0.0, value1)
quadtree->insert(0.0, 0.0, value2)

প্রথম সন্নিবেশ একটি (প্যারেন্ট) নোড তৈরি করে এবং এর মধ্যে একটি মান সন্নিবেশ করে।

দ্বিতীয় সন্নিবেশ একটি শিশু নোড তৈরি করে, এর সাথে লিঙ্কগুলি তৈরি করে এবং এর মধ্যে একটি মান সন্নিবেশ করে (যা প্রথম মানের হিসাবে একই হতে পারে)।

কোন শিশু নোড তাত্ক্ষণিক হয় তা অ্যালগরিদমের উপর নির্ভর করে। যদি অ্যালগরিদম [x) আকারে থাকে এবং স্থানাঙ্কের স্থানটি [0,1) এর মধ্যে থাকে তবে প্রতিটি শিশু পরিসীমা [0,0.5) বিস্তৃত হবে এবং বিন্দুটি NW সন্তানের মধ্যে স্থাপন করা হবে।

আমি কোনও অসীম পুনরাবৃত্তি দেখছি না।


সুতরাং আপনি বলছেন যে আমার পংক্তিগুলিতে নোডগুলি পুনরায় বিতরণ করার সময় যখন উপ-বিভাজনটি আমার বাস্তবায়নে ভুল?
পিয়েরে আরলাড

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

2

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

আমি অনুমান করি যে মূল পক্ষে এটি করা সহজ।


2

আমি ধরে নিচ্ছি যে আপনি সমস্ত উপাদানগুলি একই আকারের তালিকাভুক্ত করছেন, অন্যথায় জীবন জটিল, বা ধীর হয়ে যায় বা উভয়ই হয়ে যায় ……

একটি চতুষ্পদ নোডের একটি নির্দিষ্ট ক্ষমতা থাকা দরকার না । ক্ষমতা ব্যবহার করা হয়

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

2

আপনি যখন স্থানিক ইনডেক্সিং সমস্যাগুলি নিয়ে কাজ করছেন, আমি আসলে একটি স্থানিক হ্যাশ বা আমার ব্যক্তিগত পছন্দ: প্লেইন পুরাতন গ্রিড দিয়ে শুরু করার পরামর্শ দিই।

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

... এবং গাছের কাঠামোগুলিতে যাওয়ার আগে প্রথমে এর দুর্বলতাগুলি বুঝতে পারে যা বিরল উপস্থাপনার অনুমতি দেয়।

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

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

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

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

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

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

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

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


চতুর্ভুজগুলির আপডেট হিসাবে, কেউ একটি প্রশ্ন জিজ্ঞাসা করেছিল যা সংঘর্ষ সনাক্তকরণের জন্য কীভাবে তাদের দক্ষ করা যায় সে সম্পর্কে কী বিস্তৃত ছিল (তবে আমি সেগুলি পছন্দ করি) এবং আমি কীভাবে সেগুলি প্রয়োগ করব সে সম্পর্কে আমি তার প্রতি আমার সাহস ছড়িয়ে দিয়েছি। : এটি আপনার প্রশ্নের উত্তর করা উচিত stackoverflow.com/questions/41946007/...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.