কেন বলুন যে প্রস্থের প্রথম সন্ধানটি ?


9

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

এর অর্থ , সুতরাং আমরা কেন বলব না যে চলমান সময়টি কেবলমাত্র ?|ভী|+ +||2||+ +1হে(||)

এটি ডিস্কস্ট্র্রার অ্যালগরিদমের চলমান সময় সম্পর্কে এক প্রশ্নের মন্তব্যে উঠে এসেছিল ।


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

2
@নারেকবোজিকিয়ান যদিও বিএফএসকে বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে, যখন একা একা অ্যালগরিদম হিসাবে উপস্থাপিত হয়, তবে এটির প্রায়শই একটি সূচনা প্রান্ত থাকে।
ডেভিড রিচার্বি

উত্তর:


9

বিএফএস সাধারণত নিম্নলিখিত হিসাবে কিছু বর্ণনা করা হয় ( উইকিপিডিয়া থেকে )।

 1  procedure BFS(G,start_v):
 2      let Q be a queue
 3      label start_v as discovered
 4      Q.enqueue(start_v)
 5      while Q is not empty
 6          v = Q.dequeue()
 7          if v is the goal:
 8              return v
 9          for all edges from v to w in G.adjacentEdges(v) do
10             if w is not labeled as discovered:
11                 label w as discovered
12                 w.parent = v
13                 Q.enqueue(w)

বিষয়টি কিছুটা সূক্ষ্ম একটি: এটি 3 লাইনে লুকিয়ে আছে! প্রশ্নটি হ'ল আমরা কোন ডেটা স্ট্রাকচারটি ব্যবহার করতে যাচ্ছি কোন কোন শীর্ষকোষটি আবিষ্কার করা হয়েছে তা সংরক্ষণ করতে?

সবচেয়ে সহজ সমাধানটি হ'ল প্রতিটি অনুসারে একটি বুলি দিয়ে বুলিয়ান অ্যারে ব্যবহার করা। এই ক্ষেত্রে, অ্যারের প্রতিটি উপাদানকে আমাদের অবশ্যই শুরু করতে হবে falseএবং এতে সময় লাগবে । এটি প্রতিটি গ্রাফের জন্য প্রযোজ্য, এমনকি কোনও প্রান্ত না থাকলেও, তাই আমরা মধ্যে কোনও সম্পর্ক ধরে নিতে পারি না এবং এবং আমরা চলমান সময় পাই ।Θ(|ভী|)|ভী|||হে(|ভী|+ +||)

আমরা কি প্রারম্ভিক সময়ের সাথে কোনও ডেটা স্ট্রাকচার থাকা এড়াতে পারি ? আমাদের প্রথম প্রচেষ্টা হতে পারে একটি লিঙ্কযুক্ত তালিকা ব্যবহার করা। যাইহোক, এখন পরীক্ষা করছে যে কোনও শীর্ষবিন্দুটি সন্ধান করা হয়েছে (10 লাইন) পূর্বের মতো ধ্রুবক সময়ের পরিবর্তে পরিদর্শন করা উল্লম্ব সংখ্যায় সময় রৈখিক লাগে। এর অর্থ চলমান সময় , যা সবচেয়ে খারাপ ক্ষেত্রে সবচেয়ে খারাপ is (দ্রষ্টব্য যে আমরা হিসাবে এটি পুনরায় লিখতে চাই না যেহেতু এটি আরও খারাপ: এটি মতো খারাপ হতে পারে , তবে )Θ(|ভী|)হে(|ভী|||)হে(||2)|ভী|4|ভী||||ভী|3

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

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

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


1
আমি মনে করি এটি প্রয়োগ করা শক্তিশালী হতে পারে যে অনুশীলনে হ্যাশ টেবিলগুলির খারাপ ক্যাশে পারফরম্যান্স রয়েছে। চেইন (যেমন লিঙ্কযুক্ত তালিকাগুলি) দিয়ে প্রয়োগ করা হলে, আমি সম্মত। তবে যদি ক্রমাগত স্মৃতি এবং উন্মুক্ত সম্বোধনের সাথে বাস্তবায়ন করা হয় তবে এতটা নয়।
জুহো

সত্যিই দুর্দান্ত উত্তর! যদিও একটি প্রান্তিক নোট, গতিশীল আকারের হ্যাশ টেবিলগুলি অবশ্যই খুব ভাল পছন্দ হয় কেবল সেখানে অনেকগুলি ছোট ছোট উপাদান থাকে না, তবে যদি কোনও ভার্টেক্সের হ্যাশ মান একটি যুক্তিসঙ্গত ধ্রুবক দ্বারা আবদ্ধ থাকে এবং এটি প্রায়শই ঘটে থাকে। ভাল উত্তর!
কার্লোস

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