নির্দেশিত অ্যাসাইক্লিক গ্রাফের ট্রানজিটিভ ক্লোজার পুনরুদ্ধারের জন্য দক্ষ অ্যালগরিদম


14

আমি একটি গ্রাফ সমস্যা সমাধানের চেষ্টা করছি (এটি হোমওয়ার্কের জন্য নয়, কেবল আমার দক্ষতা অনুশীলনের জন্য)। একটি ডিএজি দেওয়া হয়, যেখানে ভি হল শীর্ষে এবং প্রান্তগুলির সেট । গ্রাফটি সংলগ্ন তালিকা হিসাবে উপস্থাপিত হয়, সুতরাং A v একটি সেট যা ভি এর সমস্ত সংযোগ যুক্ত থাকে । আমার কাজটি প্রতিটি শীর্ষবিন্দু v ভি থেকে কোন শীর্ষে পৌঁছতে পারে তা সন্ধান করা । আমি যে সমাধানটি ব্যবহার করি তাতে O এর জটিলতা রয়েছে ( ভি 3 )G(V,E)VEAvvvVO(V3), ট্রানজিটিভ ক্লোজার সহ, তবে আমি পড়েছি যে একটি ব্লগে এটি দ্রুত হতে পারে, যদিও এটি কীভাবে তা প্রকাশ করে নি। ডিএজে ট্রানজিটিভ ক্লোজার সমস্যা সমাধানের জন্য কেউ আমাকে অন্য কোনও উপায় (আরও জটিলতার সাথে) বলতে পারেন?


: একটি সময়ে কটাক্ষপাত আছে stackoverflow.com/questions/3517524/...
AJed


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

@ আজেদ এই বিশেষ সমস্যায় সময়সীমা অতিক্রম করবে। O(V3)
রন্টোগিয়ানিস অ্যারিস্টোফানিস

2
@ রন্ডোগিয়ানিস আরিস্টোফেনেস যখন আপনি সময় সীমা বলছেন, আপনি কি বোঝাতে চেয়েছেন যে টপকোডার ইত্যাদির মতো কিছু প্রোগ্রামিং / অ্যালগরিদম চ্যালেঞ্জগুলিতে এটি একটি সমস্যা? যদি তা হয়, এবং আপনি যদি নিশ্চিত হন যে আপনি কোনও সমাধানটি সঠিকভাবে প্রয়োগ করেছেন , তবে আপনি আবার সমস্যাটি দেখতে চাইতে পারেন। এমন আরও কিছু লুকানো সম্পত্তি থাকতে পারে যা জিনিসগুলিকে সহজীকরণ করতে পারে, বা সমস্যাটি প্রকাশ করার আরও ভাল উপায় হতে পারে যাতে একটি ট্রানজিটিভ বন্ধের প্রয়োজন হয় না। কারণ ট্রানজিটিভ ক্লোজার ম্যাট্রিক্স গুণনের মতোই শক্ত। ছাত্রের পড়ুন .s.uwaterloo.caO(V3)
পরেশ

উত্তর:


8

আমাদের গ্রাফটি অ্যাসাইক্লিক হ'ল এই সমস্যাটি আরও সহজ করে তোলে।

টপোলজিকাল সাজানুসরণটি আমাদেরকে শীর্ষস্থানীয় অর্ডার দিতে পারে , যদি আমি < জে , তবে ভি জে থেকে পি i এর কোনও প্রান্ত নেই । আমরা শীর্ষস্থানগুলি তালিকাভুক্ত করেছি যে সমস্ত প্রান্তগুলি আমাদের তালিকায় "এগিয়ে" যায়।v1,v2,,vni<jvjvi

(বিশ্লেষণ ঠিক করতে এবং কিছুটা দ্রুত অ্যালগরিদম দেওয়ার জন্য সম্পাদিত)

এখন আমরা কেবল এই তালিকাটি পেরিয়ে শেষ প্রান্তে ভি এন এর ট্রানজিটিভ ক্লোজারটি নিজেই। এছাড়াও যোগ বনাম এন একটি প্রান্ত প্রতি প্রান্তবিন্দু এর সকর্মক অবসান করার বনাম এনvnvnvnvn

একে অপরের প্রান্তবিন্দু জন্য , শেষ পিছন থেকে যাচ্ছে, প্রথম অ্যাড বনাম আমি নিজস্ব সকর্মক অবসান, তারপর সবকিছু সকর্মক অবসান যোগ বনাম আমি সব ছেদচিহ্ন এর সকর্মক অবসান একটি প্রান্ত সঙ্গে বনাম আমিvivivivi

চলমান সময় সবচেয়ে খারাপ ক্ষেত্রে, সঙ্গে এন ছেদচিহ্ন এবং সংখ্যা মি হে ( 2 ) প্রান্ত সংখ্যা। টপোলজিকাল বাছাই করতে সময় O ( n + m ) লাগে । তারপরে আমরা পিছনের পাসে আরও একটি ( এম এন ) কাজ করব: প্রতিটি প্রান্তের জন্য তালিকার মধ্য দিয়ে আমরা পিছনের দিকে যেতে, আমাদের n পর্যন্ত যোগ করতে হবেO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n কারওর ক্ষণস্থায়ী বন্ধের সূচনা

নোট করুন যে বিট-অ্যারে দ্বারা প্রত্যেকের ট্রানজিটিভ ক্লোজারকে উপস্থাপন করে আপনি একটি দুর্দান্ত ধ্রুবক-গুণক গতি অর্জন করতে পারেন। বলুন আপনার কাছে কেবল ; তারপর আপনি একটি একক 64-বিট int- এ যেখানে বিট ব্যবহার করেন আমি 1 হলে আমি অন্যথায় আমার সকর্মক অবসান এবং 0 হয়। তারপর অংশে আমরা সবকিছু যোগ যেখানে আমি 'থেকে গুলি সকর্মক অবসান ' s সত্যিই দ্রুত হল: আমরা শুধু নিতে | = আমি । (বাইনারি বা অপারেশন।)n=64iiijcjci

জন্য আপনাকে এগুলিতে রাখতে হবে এবং কিছু গাণিতিক করতে হবে তবে এটি কোনও অবজেক্ট সেটের চেয়ে অনেক দ্রুত হবে।n>64

OO(n3)


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