চক্রযুক্ত লিঙ্কযুক্ত তালিকার কাজটিতে চক্রের শুরু নোড কীভাবে সন্ধান করবেন তা ব্যাখ্যা করুন?


161

আমি বুঝতে পারি যে কচ্ছপ এবং হারের বৈঠকটি লুপের অস্তিত্বের সমাপ্তি করে, তবে কচ্ছপকে কীভাবে সংযুক্ত স্থানে রাখার সময় লিঙ্কযুক্ত তালিকার শুরুতে সরানো হয়, উভয়কে একবারে এক ধাপ এগিয়ে নিয়ে যাওয়ার পরে চক্রের সূচনা পর্যায়ে মিলিত করে তোলে?


আরেকটি ব্যাখ্যা: marcin-chwedczuk.github.io/…
csharpfolk

লোকেরা এই প্রশ্নের প্রথম দুটি উত্তরের বাইরে তাকানোর যত্ন নেয়নি। তৃতীয় উত্তরটি বেশ ভাল।
নাম

উত্তর:


80

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

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

কচ্ছপ এবং খরগোশ যখন মিলিত হয়, আমরা খুঁজে পেয়েছি সবচেয়ে ছোট i (কচ্ছপের নেওয়া পদক্ষেপের সংখ্যা) যেমন X i = X 2i । X 0 থেকে শুরু করে চক্রের শুরুতে পেতে কতগুলি পদক্ষেপের মিউ উপস্থাপন করুন এবং লাম্বদা চক্রের দৈর্ঘ্যের প্রতিনিধিত্ব করুন। তারপরে আমি = মিউ + ল্যাম্বদা এবং ২ আই = মিউ + বি ল্যাম্বদা, যেখানে ক এবং খ পূর্ণসংখ্যক যেখানে কচ্ছপ এবং খরগোস চক্রের চারপাশে কতবার গেছে তা বোঝায়। দ্বিতীয়টি থেকে প্রথম সমীকরণ বিয়োগ করা i = (বা) * ল্যাম্বদা দেয়, সুতরাং আমি ল্যাম্বডারের একটি পূর্ণসংখ্যা একাধিক। সুতরাং, এক্স আই + মি = এক্স মিউ । এক্স আমি কচ্ছপ এবং খরগোশের মিটিং পয়েন্ট উপস্থাপন করে। আপনি যদি কাছিমটিকে শুরু নোডে ফিরে যান0 , এবং কচ্ছপ এবং খরগোশকে একই গতিতে চালিয়ে দেওয়া যাক, মিউ অতিরিক্ত পদক্ষেপের পরে কচ্ছপটি এক্স মিউ পৌঁছে যাবে এবং হারে এক্স আই + মি = এক্স মিউ পৌঁছে যাবে , সুতরাং দ্বিতীয় মিলন বিন্দুটি শুরু সূচিত করে সাইকেল.


1
@ জিম লুইস বৈঠকটি অবশ্যই কোনও সূচনার পয়েন্ট হবে না, তবে আমি যেমন বলেছিলাম যে দু'জনের একজনকে সংযুক্ত তালিকার শুরুতে স্থানান্তরিত করা এবং উভয়কে একই গতিতে সরিয়ে নেওয়া তাদের চক্রের সূচনালগ্নে মিলিত করবে।
প্রোগ্রামার

6
@ জিম লুইস আপনি যদি প্রথম বৈঠক বিন্দু এবং লুপ শুরুর মধ্যবর্তী দূরত্ব হিসাবে মিউ এর বহু লুপ দৈর্ঘ্যের ফলাফল হিসাবে মিউজিকাল হওয়া সম্পর্কে ব্যাখ্যা করতে পারেন তবে দুর্দান্ত লাগবে।
প্রোগ্রামার

7
@ সমবেদনা: X_muচক্রের সূচনা (মিউ এর সংজ্ঞা অনুসারে) যাওয়ার জন্য প্রারম্ভ বিন্দু থেকে মু পদক্ষেপ নিন । তারপরে আপনি যদি আরও পদক্ষেপ গ্রহণ করেন যেখানে আমি চক্র দৈর্ঘ্যের একাধিক, আপনি চক্রের শুরুতে ফিরে এসেছেন: X_mu + i= X_mu। তবে সংযোজনটি পরিবর্তনশীল, সুতরাং এটি প্রথম মিটিং পয়েন্ট থেকে শুরু করার জন্য আমি পদক্ষেপ গ্রহণের সমতুল্য X_i, তারপরে আবার ফিরে আসার জন্য অতিরিক্ত পদক্ষেপগুলি X_mu, চক্রের সূচনা।
জিম লুইস

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

28
আমি মনে করি আপনার প্রমাণে একটি ছোট সমস্যা আছে। যেহেতু মিটিং পয়েন্টটি iচক্রের কোনও পর্যায়ে রয়েছে, আমি মনে করি যে সমীকরণটি হওয়া উচিত i = mu + k + a*lambdaএবং চক্র থেকে শুরু করে সভা পয়েন্টের ধাপের সংখ্যাটি 2i = mu + k + b*lambdaকোথায় k। উভয় সমীকরণ বিয়োগ করা একই ফলাফল দেয় যদিও।
ইভান জেড সিউ

336

আমার নিজের কথায় http://en.wikedia.org/wiki/Cycle_detection#tortoise_and_hare এ প্রদত্ত চক্র সনাক্তকরণ অ্যালগরিদমটি স্পষ্ট করার চেষ্টা করি ।

অঙ্কন

কিভাবে এটা কাজ করে

উপরের চিত্রের মতো একটি চক্র সহ তালিকার শুরুতে ইশারা করে একটি কচ্ছপ এবং একটি খরগোশ (পয়েন্টারগুলির নাম) রাখি।

আসুন অনুমান করা যাক আমরা যদি কচ্ছপগুলি একবারে 1 টি পদক্ষেপ এবং একবারে খালি 2 টি পদক্ষেপ নিয়ে যাই তবে অবশেষে তারা এক পর্যায়ে মিলিত হবে। আসুন দেখা যাক এই অনুমানের প্রথমটি সত্য।

চিত্রটি একটি চক্র সহ একটি তালিকা চিত্রিত করে। চক্রটির দৈর্ঘ্য রয়েছে nএবং আমরা প্রাথমিকভাবে mচক্র থেকে কয়েক ধাপ দূরে। এছাড়াও এটিও বলা যাক যে সভার পয়েন্টটি kচক্রের শুরু থেকে কিছুটা দূরে এবং কচ্ছপ যখন iপুরো পদক্ষেপ নিয়েছিল তখন কচ্ছপ এবং খয়ের দেখা হয় । (হরে ততক্ষণে 2iমোট পদক্ষেপ গ্রহণ করত ))

নিম্নলিখিত 2 শর্তাবলী অবশ্যই রাখা উচিত:

1) i = m + p * n + k

2) 2i = m + q * n + k

প্রথমটি বলে যে কচ্ছপ iপদক্ষেপগুলি সরায় এবং এই iপদক্ষেপগুলিতে এটি প্রথম চক্রটিতে পৌঁছে। তারপরে এটি pকিছু ধনাত্মক সংখ্যার জন্য চক্রের মধ্য দিয়ে যায় p। শেষ kপর্যন্ত এটি খরগোশের সাথে মিলিত হওয়া অবধি আরও নোডের ওপরে যায়।

খরগোশের ক্ষেত্রেও একই রকম। এটি 2iপদক্ষেপগুলি সরায় এবং এই 2iপদক্ষেপে এটি প্রথমে চক্রের দিকে যায়। তারপরে এটি qকিছু ধনাত্মক সংখ্যার জন্য চক্রের মধ্য দিয়ে যায় q। অবশেষে এটি kকচ্ছপের সাথে দেখা না হওয়া পর্যন্ত আরও নোডের ওপরে যায়।

খরগোশের কাছাকাছি কচ্ছপের দ্বিগুণ গতিতে ভ্রমণ করার সাথে সাথে এবং যখন তারা সভার পয়েন্টে পৌঁছায় তখন উভয়ের পক্ষে সময় স্থির থাকে।

সুতরাং সাধারণ গতি, সময় এবং দূরত্বের সম্পর্ক ব্যবহার করে,

2 ( m + p * n + k ) = m + q * n + k

=> 2m + 2pn + 2k = m + nq + k 

=>  m + k = ( q - 2p ) n

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

এই জাতীয় একটি সমাধান সেটটি নিম্নরূপ:

p = 0

q = m

k = m n - m

এই মানগুলি নিম্নলিখিত হিসাবে কাজ করে যাচাই করতে পারি:

m + k = ( q - 2p ) n  

=> m + mn - m = ( m - 2*0) n

=> mn = mn.

এই সেট জন্য, iহয়

i = m + p n + k

=> m + 0 * n + mn - m = mn.

অবশ্যই, আপনার দেখতে হবে যে এটি আমি সম্ভব সবচেয়ে ছোট নয়। অন্য কথায়, কচ্ছপ এবং খরগোশ ইতিমধ্যে বহুবার আগে দেখা হতে পারে। তবে, যেহেতু আমরা দেখাই যে তারা কমপক্ষে একবারে দেখা করতে পারে আমরা অনুমান করতে পারি যে সঠিক অনুমানটি সঠিক। সুতরাং আমরা যদি তাদের মধ্যে একটির 1 টি পদক্ষেপ এবং অন্যটি একবারে 2 টি পদক্ষেপ নিয়ে যাই তবে তাদের সাথে দেখা করতে হবে।

এখন আমরা অ্যালগরিদমের দ্বিতীয় অংশে যেতে পারি যা চক্রের শুরুটি কীভাবে খুঁজে পাওয়া যায়।

চক্র শুরু

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

হাইপোথিসিসটি হ'ল আমরা যদি তাদেরকে একই গতিতে (উভয়ের জন্য 1 পদক্ষেপ) চলতে দিই, তবে তারা প্রথমবারের মতো আবার দেখা হবে সেই চক্রের সূচনা হবে।

আসুন এই অনুমানটি প্রমাণ করি।

প্রথমে ধরে নেওয়া যাক কিছু ওরাকল মিঃ কি তা আমাদের বলে।

তারপরে, যদি আমরা তাদের এম + কে ধাপে সরে যেতে পারি, কচ্ছপ তাদের মূল স্থানে পৌঁছাতে হবে (চক্রের সূচনা থেকে কে পদক্ষেপ দূরে - চিত্রটিতে দেখুন)।

পূর্বে আমরা তা দেখিয়েছি m + k = (q - 2p) n

যেহেতু মি + কে পদক্ষেপগুলি চক্র দৈর্ঘ্যের এন এর একাধিক, হেরে, মাঝামাঝি সময়ে চক্র (কিউ -২ পি) বার হয়ে যায় এবং একই বিন্দুতে ফিরে আসত (চক্রের শুরু থেকে কে পদক্ষেপ দূরে)।

এখন, তাদের এম + কে ধাপে সরে যাওয়ার পরিবর্তে, যদি আমরা তাদের কেবলমাত্র এম ধাপে সরাতে পারি, কাছিমটি চক্রের শুরুতে পৌঁছায়। Hare কে (k-2p) ঘূর্ণন সম্পন্ন করার কম পদক্ষেপ হতে হবে। যেহেতু এটি চক্রের শুরুতে k পদক্ষেপগুলি শুরু করেছিল, তাই খয়েরটি চক্রের শুরুতে পৌঁছাতে হবে।

ফলস্বরূপ, এটি ব্যাখ্যা করে যে তাদের প্রথমবারের জন্য কয়েকটি পদক্ষেপের পরে চক্রের শুরুতে দেখা করতে হবে (খুব প্রথম বার কারণ কচ্ছপ মাত্র কয়েক ধাপ পরে চক্রের কাছে এসেছিল এবং এটি কখনই খরগোশ দেখতে পায় নি যা ইতিমধ্যে ছিল চক্র).

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


1
: আমি তাই তার সত্যিকারের মনে করি না যখন তারা দেখা যে নীচে শুরু বিন্দু দেখতে মন্তব্য যে stackoverflow.com/a/19209858/1744146 <br> দিন দয়া করে আমাকে জানেন তাহলে আমি কি ভুল বলেছি
এমআরএ

ব্যাখ্যার প্রথম অংশটি ত্রুটিহীন। তবে দ্বিতীয় অংশে যতদূর আমি জানি ত্রুটি রয়েছে। আপনি ধরে নিচ্ছেন যে "কিছু ওরাকল মি বলে", তবে মিটি জানা থাকলে আপনার চক্রটির ইতিমধ্যে শুরু আছে। যখন আপনি কখনই জানেন না চক্রের শুরু কোথায় আপনি কীভাবে উত্তরটি ধরে নিতে পারেন ?? আমাকে বুঝতে দাও.
গোপীচাঁদ

1
@ গোপীচাঁদ আবার শেষ প্যারাটি পড়ুন ... আপনি কেবল ধরে নিয়েছেন যে কিছু মি আছে (যদি এটি ইতিমধ্যে প্রমাণিত হয় যে একটি চক্র রয়েছে) .. তবে আপনি এম এর মান জানেন না
শ্রীননাথ

2
এখন এটি সত্যই একটি দুর্দান্ত ব্যাখ্যা। পুরো ইন্টারনেটে এটি সম্ভবত সেরা ব্যাখ্যা।
আরলিন বাটাদা

2
আপনার সমীকরণ m + k = (q - 2p) nআরও সরল করা যেতে পারে m + k = q*n। এর কারণ হ'ল কচ্ছপের কাছ থেকে নেওয়া লুপের সংখ্যা সর্বদা শূন্য হবে কারণ খরগোশটি দেখা না করে কচ্ছপটিকে কখনই ছাড়তে পারে না। চিন্তা করুন.
অর্পিত জৈন

124

এই চিত্রটি দেখুন:

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

= X + y সাক্ষাতের পূর্বে স্লোপয়েন্টার দিয়ে দূরত্ব ভ্রমণ

= (X + y + z) + y = x + 2y + z মিলনের আগে ফাস্টপয়েন্টার দিয়ে দূরত্ব ভ্রমণ করা হয়েছে

যেহেতু ফাস্টপয়েন্টার স্লোপয়েন্টারটির দ্বিগুণ গতিতে ভ্রমণ করে এবং সভা পয়েন্টে পৌঁছালে সময় উভয়ের পক্ষে স্থির থাকে।

সুতরাং সাধারণ গতি, সময় এবং দূরত্বের সম্পর্ক 2 (x + y) = x + 2y + z => x + 2y + z = 2x + 2y => x = z ব্যবহার করে

সুতরাং লিঙ্কযুক্ত তালিকার শুরুতে স্লোপোয়েন্টারটি সরিয়ে , এবং একবারে একটি নোড সরানোর জন্য স্লোপোয়েন্টার এবং ফাস্টপোয়েন্টার উভয়কেই তৈরি করে, উভয়ের উভয়ই কভার করার একই দূরত্ব রয়েছে

লিংকটি লিঙ্কযুক্ত তালিকায় শুরু হয় এমন স্থানে পৌঁছে যাবে।


10
এটি স্লোপোয়েন্টার চক্রের প্রবেশের আগে দ্রুতপয়েন্টার চক্রটি n বার বার ভ্রমণ করে এমন ক্ষেত্রে এটি গ্রহণ করে না। চক্রের দৈর্ঘ্য বোঝাতে l ব্যবহার করুন। = (X + y + z) + y = x + 2y + nl + z মিলনের আগে ফাস্টপয়েন্টার দিয়ে দূরত্ব ভ্রমণ করা হয়েছে । এবং ফলাফলটি হ'ল x = nl + z হবে।
জিংগুও ইয়াও


2
এই চিত্রটি অতি-সহজ। ধীর পয়েন্টারটি পৌঁছানোর আগে দ্রুত পয়েন্টারটি চক্রের মধ্য দিয়ে বহুবার যেতে পারে।
ওয়ারেন ম্যাকভয়

70

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


একই চিত্র ব্যবহার:এখানে চিত্র বর্ণনা লিখুন

ধরা যাক দ্রুত রানার ধীর এবং দ্রুত মিলনের আগে লুপ এম বার চালিয়েছে । এই যে মানে:

  • ধীরে ধীরে চালিত দূরত্ব: x + y
  • দ্রুত দূরত্ব চালিত হয়: x + m (y + z) + y অর্থাত্ অতিরিক্ত y যেখানে তারা মিলিত হয়

যেহেতু দ্রুতগতির গতি দ্বিগুণ গতিতে চলে এবং এগুলি একই সময়ে চলতে থাকে, তার থেকে বোঝা যায় যে আমরা যদি দূরত্বকে ধীরে ধীরে চালিত করি তবে আমরা দূরত্বটি দ্রুত চালিয়ে যাব। সুতরাং,

  • 2 (x + y) = x + মি (y + z) + y

এক্স দানের জন্য সমাধান করা,

x = (মি - 1) (y + z) + জেড

বাস্তব দৃশ্যে এর অর্থ হবে, x = (মি - 1) সম্পূর্ণ লুপটি চালায় + একটি অতিরিক্ত দূরত্ব z

অতএব, আমরা যদি তালিকার শুরুতে একটি পয়েন্টার রেখেছি এবং অন্যটিকে মিটিং পয়েন্টে রেখে দিই, তবে তাদের একই গতিতে চালিত করলে লুপের এম - 1 রান সম্পূর্ণ হবে এবং তারপরে অপরের সাথে সাক্ষাত হবে লুপ শুরুতে পয়েন্টার।


7
একটি সন্দেহ .. ধীরে ধীরে একাধিক চক্র গ্রহণের আগে এর গ্যারান্টিটি কীভাবে ধীর এবং দ্রুত পূরণ করবে?
সিরাজ

4
@ সিরাজ: ধীর চক্রের মধ্যে চলবে না, ধীরে ধীরে এটি দ্রুত গতিতে চলবে এবং আগে লুপটিতে প্রবেশ করবে। এবং এটি গ্যারান্টিযুক্ত যে তারা মিলিত হবে। ধীর গতি j + 1 এ এবং দ্রুত জেতে থাকলে, তারা এখন জে 2 তে
মিলবে meet

4
ধীরে ধীরে লুপটি ঘুরে গেলে গণিতটি এখনও কাজ করে: x + (y + z) এম + ই = 2 (এক্স + (ওয়াই + জেড) এন + ওয়াই), যেখানে মিলনের আগে ধীরে ধীরে লুপের প্রায় # বার n হয়। এটি সমাধান করে (মি -2 এন -1) (y + z) + z = x। যার অর্থ মিলন বিন্দুতে শুরু হওয়া, ঘুরতে ঘুরতে (মি -2 এন -1) বার আপনি মিলন পয়েন্টে ফিরে এসেছেন, তারপরে যান জেড, আপনি লুপের শুরুতে এসেছেন। এবং এটি করার জন্য এটি হেড নোড থেকে শুরু এবং এক্স নোডে যাওয়া সমান।
mayas_mom

1
@ মায়াস_মোম: ম্যাথটি কার্যকর হতে পারে তবে ধীরে ধীরে কখনই লুপটি ঘুরে যেতে পারবে না। এটি সর্বদা শুরুতে বা অন্য কোথাও মাঝের পথে ধরা পড়বে।
ডিসপ্লেনাম

4
x = (মি - 1) (y + z) + z এটিকে সাধারণীকরণ করা যায় কারণ লুপের দৈর্ঘ্য y + z এবং যেহেতু কেবলমাত্র অবস্থান সম্পর্কে উদ্বিগ্ন। সুতরাং x = ((মি - 1) (y + z))% (y + z)) + z যা কার্যকরভাবে x = z;
আনশুল গার্গ

10

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

বিজ্ঞপ্তিযুক্ত লিঙ্কযুক্ত তালিকার অভ্যন্তরে সংযুক্ত বিন্দুটি সন্ধান করার পরে, এখন দুটি সংযুক্ত তালিকার সমস্যার ছেদ বিন্দু সন্ধান করতে সমস্যা হ্রাস পাবে।


8

চিত্র 1

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

চিত্র 1

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

চক্রের শুরুতে হরেও থাকবে। এটি দ্বিতীয় গ্রাফ থেকে স্পষ্ট: কচ্ছপটি যখন আবার শুরুতে সরানো হয়েছিল, তখন খরগোশটি শেষ চক্রের K পদক্ষেপে ছিল । মিটার পদক্ষেপের পরে , খরগোশের আরও একটি চক্র সম্পন্ন হবে এবং কচ্ছপের সাথে সংঘর্ষ হবে।


@ ওয়ারেনম্যাকএভয় কোনও মুহুর্তে আমি তাদের পরামর্শ দিলাম যে তারা প্রথম দিকে মিলবে। পরিসংখ্যানগুলি পরিষ্কারভাবে উল্লেখ করে তারা চক্রের শুরুতে আবার মিলিত হয় ।
skedastik

5

দৃষ্টীকোণ:

দুটি পয়েন্টার রয়েছে:

  • একটি ধীর পয়েন্টার যা একবারে একটি নোড সরিয়ে দেয়।
  • একটি দ্রুত পয়েন্টার যা একবারে দুটি নোড সরিয়ে দেয়।

যদি দুটি পয়েন্টার মিলিত হয় তবে এটি প্রমাণ করে যে একটি লুপ রয়েছে। একবার তারা মিলিত হয়ে গেলে নোডগুলির মধ্যে একটি মাথার দিকে নির্দেশ করবে এবং তারপরে উভয়ই এক সাথে একটি নোড এগিয়ে যাবে। লুপের শুরুতে তারা মিলিত হবে।

যুক্তি: দুটি ব্যক্তি যখন একটি বৃত্তাকার ট্র্যাকের উপর দিয়ে হাঁটেন, তাদের মধ্যে একজনের অপরের গতি দ্বিগুণ হয়, তারা কোথায় মিলবে? ঠিক কোথায় তারা শুরু করেছে।

এখন, ধরুন দ্রুত রানার kএকটি nধাপ কোলে ধাপ শুরু করে। তারা কোথায় দেখা করবে? ঠিক n-kপদক্ষেপে। যখন ধীর রানার (n-k)পদক্ষেপগুলি covered েকে রাখে, দ্রুত রানার k+2(n-k)ধাপগুলি coveredেকে রাখত। ( যেমন, k+2n-2kপদক্ষেপগুলি অর্থাৎ 2n-kপদক্ষেপ )। অর্থাত্ (n-k)পদক্ষেপগুলি (পথটি বিজ্ঞপ্তিযুক্ত এবং তারা যে রাউন্ডের পরে মিলিত হয় তার সংখ্যা সম্পর্কে আমরা উদ্বিগ্ন নই; আমরা কেবল তারা যেখানে অবস্থান করি সে বিষয়ে আগ্রহী)।

এখন দ্রুত রানার কীভাবে kপ্রথম স্থানে পদক্ষেপের সূচনা পেল ? কারণ এটি ধীর রানারকে নিয়েছে যে লুপের শুরুতে পৌঁছাতে অনেক পদক্ষেপ নিয়েছে। সুতরাং লুপটির শুরুটি নোড থেকে কে পদক্ষেপগুলি steps

দ্রষ্টব্য: নোড যেখানে উভয় পয়েন্টার পূরণ kকরেছে লুপটি শুরু করার (লুপের অভ্যন্তরীণ) থেকে কয়েক kধাপ দূরে এবং হেড নোডটি লুপের শুরু থেকে কয়েক ধাপ দূরে। সুতরাং যখন আমাদের কাছে পয়েন্টারগুলি এই নোডগুলি থেকে 1 পদক্ষেপের সমান গতিতে অগ্রসর হয়, তারা লুপের শুরুতে মিলিত হবে।

আমি বিশ্বাস করি এটি সোজা। কোনও অংশ অস্পষ্ট থাকলে দয়া করে আমাকে জানান।


4
ভবিষ্যতে ভাঙতে পারে এমন কোনও লিঙ্কের পরিবর্তে এখানে পুরো উত্তরটি পোস্ট করুন
লিওর

4

ঠিক আছে সুতরাং হারে এবং কচ্ছপটি এমন এক পর্যায়ে মিলিত হয় যা চক্র শুরু হওয়ার থেকে কয়েক ধাপ দূরে থাকে, চক্র শুরু হওয়ার আগে ধাপগুলির সংখ্যা মু এবং চক্রের দৈর্ঘ্য এল হয়।

সুতরাং এখন সভা পয়েন্ট ->

দূরত্ব কচ্ছপ দ্বারা আচ্ছাদিত = মু + এ * এল + কে - সমীকরণ 1

(চক্রের প্রারম্ভিক পর্যায়ে পৌঁছানোর পদক্ষেপগুলি চক্রের 'a' পুনরাবৃত্তিকে আবর্তিত করার জন্য গৃহীত পদক্ষেপগুলি চক্রের শুরু থেকে + ক পদক্ষেপগুলি নিয়ে আসে) (যেখানে কিছুটা ধনাত্মক ধ্রুবক থাকে)

দূরত্বটি হেয়ার = মু + বি * এল + কে দ্বারা আবৃত - সমীকরণ 2

(চক্রের প্রারম্ভিক পর্যায়ে পৌঁছানোর পদক্ষেপগুলি চক্রের + বি পদক্ষেপগুলি 'ক' চক্রের শুরু থেকে কভার করে নেওয়া হয়েছে) (যেখানে খ কিছু ধনাত্মক ধ্রুবক এবং বি> = ক)

সুতরাং হারে আচ্ছাদিত অতিরিক্ত দূরত্ব হল = সমীকরণ 2 - সমীকরণ 1 = (বা) * এল

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

সুতরাং, মিউ + কে = (বা) * এল

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

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


তারা সাধারণত চক্রের শুরুতে দেখা করে না
ওয়ারেন ম্যাকভয়

3

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

একটি পয়েন্টার অনুসরণ করে এমন লিঙ্কের সংখ্যার কল দুরত্ব এবং সময় অনুসারে অ্যালগোরিদম ধীর পয়েন্টারটিকে একটি লিঙ্ক এবং দ্রুত পয়েন্টার দুটি লিঙ্ককে সরিয়ে নিয়ে যায়। দৈর্ঘ্যের সি-এর একটি চক্রের আগে এন নোড থাকে, সি -1 এর মাধ্যমে চক্র অফসেট কে = 0 দিয়ে লেবেলযুক্ত।

চক্রের শুরুতে পৌঁছাতে, ধীর সময় লাগে N এবং সময়। এর অর্থ দ্রুত চক্রের N দূরত্ব নেয় (সেখানে যাওয়ার জন্য N, স্পিনে N)। সুতরাং সময় এন, ধীর সময় চক্র অফসেট কে = 0, এবং দ্রুত চক্র অফসেট কে = এন মোড সে।

যদি এন মোড সি শূন্য হয় তবে ধীর এবং দ্রুত এখন মেলে এবং চক্রটি N এবং চক্রের অবস্থান k = 0 পাওয়া যায়।

যদি এন মোড সি শূন্য না হয়, তবে দ্রুত এখন ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছন পিছনে পিছন পিছনে পিছন পিছনে পিছন পিছনে পিছনে পিছনে পিছন পিছনে পিছন পিছনের দিক থেকে পিছনে পিছনে পিছনে পিছন পিছন পিছনের দিক থেকে পিছনে পিছনে পিছনে পিছনে পিছনে ছোঁলে থাকা দূরত্বে N

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

সুতরাং, যদি এন মোড সি শূন্য হয় তবে প্রথম পর্বটি চক্রের শুরুতে এন পুনরাবৃত্তির পরে থামবে। অন্যথায়, প্রথম পর্বটি N + C- (N Mod C) এর পুনরাবৃত্তির পরে অফসেট সি- (N Mod C) এ চক্রের মধ্যে থেমে যায়।

// C++ pseudocode, end() is one after last element.

int t = 0;
T *fast = begin();
T *slow = begin();
if (fast == end()) return [N=0,C=0];
for (;;) {
    t += 1;
    fast = next(fast);
    if (fast == end()) return [N=(2*t-1),C=0];
    fast = next(fast);
    if (fast == end()) return [N=(2*t),C=0];
    slow = next(slow);
    if (*fast == *slow) break;
}

ঠিক আছে, সুতরাং দ্বিতীয় পর্যায়ে: ধীরে চক্রটিতে পৌঁছানোর জন্য N আরও পদক্ষেপ গ্রহণ করে, যে মুহুর্তে দ্রুত (এখন প্রতি ধাপে 1 পদক্ষেপ নেওয়া) (C- (N Mod C) + N) mod C = 0. এ রয়েছে দ্বিতীয় পর্যায়ে পরে চক্রের শুরুতে।

int N = 0;
slow = begin();
for (;;) {
    if (*fast == *slow) break;
    fast = next(fast);
    slow = next(slow);
    N += 1;
}

সম্পূর্ণতার জন্য, ধাপ 3 চক্রের মধ্য দিয়ে আরও একবার সরিয়ে চক্রের দৈর্ঘ্য গণনা করে:

int C = 0;
for (;;) {
    fast = next(fast);
    C += 1;
    if (fast == slow) break;
}

: লিংক অনুকরণ অ্যালগরিদম ডক গুগল docs.google.com/spreadsheets/d/...
ওয়ারেন ম্যাকএভয়

1
দ্রষ্টব্য, এন <= সি হলে পুনরাবৃত্তি সি পুনরাবৃত্তির পরে বন্ধ হয়ে যায়। যে কোনও ক্ষেত্রে এটি অবশ্যই এন + সি পদক্ষেপের চেয়ে কম স্থানে থামবে এবং চক্রের শুরুতে থামার সম্ভাবনা নেই।
ওয়ারেন ম্যাকভয়

2

লুপ সমস্যায় সমস্যা হ্রাস করুন, তারপরে প্রাথমিক সমস্যার দিকে ফিরে যান

আমি নীচের ব্যাখ্যাটি আরও স্বজ্ঞাত বলে মনে করি।

  1. দুটি পয়েন্টার ( 1 = কচ্ছপ এবং 2 = হারে) নিন যা মাথা ( ) থেকে শুরু হয় , 1 এর 1 ধাপ দৈর্ঘ্য 1 , 2 এর একটি ধাপ দৈর্ঘ্য 2 হয় । সেই মুহুর্তের কথা চিন্তা করুন যখন 1 সেই চক্রের ( ) প্রারম্ভ নোডে পৌঁছায় ।

    আমরা নীচের প্রশ্নের উত্তর দিতে চাই "1 যখন 1 এ থাকে তখন 2 কোথায়?"

    সুতরাং, OA = aএকটি প্রাকৃতিক সংখ্যা ( a >= 0)। তবে এটি নিম্নলিখিত উপায়ে লেখা যেতে পারে:, a = k*n + bযেখানে a, k, n, b are natural numbers:

    • n = চক্রের দৈর্ঘ্য
    • k >= 0 = ধ্রুবক
    • 0 <= b <= n-1

    এর অর্থ b = a % n

    যেমন: if a = 20এবং n = 8=> k = 2এবং b = 4কারণ 20 = 2*8 + 4

    দূরত্ব দ্বারা আচ্ছাদিত 1 হয় d = OA = a = k*n + b। তবে একই সাথে 2 টি কভার D = 2*d = d + d = OA + d = OA + k*n + b। এর অর্থ এটি যখন 2 এ হয় তখন এটি কভার করতে হবে k*n + b। যেহেতু আপনি দেখতে পারেন, kল্যাপ সংখ্যা, কিন্তু যাদের ল্যাপ পর 2 হতে হবে উ তাই থেকে অনেক দূরে, আমরা দেখেছি যেখানে 2 যখন 1 উ: আসুন কল যে বিন্দু হয় B, যেখানে AB = b

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

  2. এখন, আমরা সমস্যাটিকে একটি বৃত্তে হ্রাস করি। প্রশ্নটি হল "সভার পয়েন্টটি কোথায়?" । সেই সি কোথায় ?

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

    প্রত্যেক পদক্ষেপে, 2 থেকে দূরত্ব কমিয়ে দেয় 1 সঙ্গে 1(এলইটি এর বলে মিটার) কারণ 1 থেকে আরও হচ্ছে 2 সঙ্গে 1, কিন্তু একই সময়ে 2 কাছাকাছি যায় 1 দ্বারা 2

    সুতরাং, ছেদটি যখন 1 এবং 2 এর মধ্যে দূরত্বটি শূন্য হবে। এর অর্থ হ'ল 2n - b দূরত্ব হ্রাস করে । অর্ডার এই অর্জন করার জন্য, 1 করতে হবে n - bপদক্ষেপ, যখন 2 করতে হবে 2*(n - b)ধাপ।

    সুতরাং, ছেদ বিন্দুটি A (ঘড়ির কাঁটা) n - bথেকে অনেক দূরে থাকবে , কারণ এটি 2 দ্বারা পূরণ না হওয়া অবধি 1 দ্বারা আচ্ছাদিত দূরত্ব । => মধ্যে দূরত্ব সি এবং একটি হয় , কারণ এবং । এটা ভাববেন না , কারণ দূরত্বটি তুচ্ছ গাণিতিক দূরত্ব নয়, এটি A এবং C এর মধ্যে ধাপগুলির সংখ্যা (যেখানে A হল বিন্দু এবং সি শেষ বিন্দু)।CA = bAC = AB + BC = n - bCA = n - ACAC = CAAC

  3. এখন, প্রাথমিক স্কিমাতে ফিরে যাওয়া যাক।

    আমরা জানি a = k*n + bএবং CA = b

    আমরা 2 টি নতুন পয়েন্টার 1 ' এবং 1' 'নিতে পারি , যেখানে 1' মাথা ( ) থেকে শুরু হয় এবং 1 '' ছেদ বিন্দু ( সি ) থেকে শুরু হয় ।

    যদিও 1 ' থেকে যায় হে করার একটি , ' 1 ' থেকে যায় সি থেকে একটি ফিনিস চলতে kল্যাপ। সুতরাং, ছেদ বিন্দুটি

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

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


2

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

চিত্রটিতে প্রদর্শিত হিসাবে পয়েন্টারগুলি যদি একটি বিন্দু পিতে মিলিত হয় তবে জেড + ওয়াইয়ের দূরত্বটি পয়েন্ট পি এবং এক্স + ওয়াইটিও বিন্দু পি, যার অর্থ জেড = এক্স। একারণে পি থেকে একটি পয়েন্টার সরিয়ে রাখার এবং অন্যটির শুরু (এস) থেকে তাদের সাক্ষাৎ হওয়া পর্যন্ত সরিয়ে রাখা, যার অর্থ সমান দূরত্ব (জেড বা এক্স) একই বিন্দু এম তে স্থানান্তরিত করা (পি থেকে এক্স এবং এস থেকে এক্স দূরত্ব) হবে লুপ শুরু। সরল!


1

উপরের সমস্ত বিশ্লেষণের সাথে, আপনি যদি একজন শিক্ষণীয় উদাহরণ ব্যক্তি হন তবে আমি একটি সংক্ষিপ্ত বিশ্লেষণ এবং উদাহরণ লেখার চেষ্টা করেছি যা গণিতকে ব্যাখ্যা করার জন্য প্রত্যেককে ব্যাখ্যা করার চেষ্টা করেছিল। এখানে আমরা যাই!

বিশ্লেষণ:

যদি আমাদের দুটি পয়েন্টার থাকে, একজনের তুলনায় অন্যটি দ্রুত এবং তাদের সাথে একসাথে সরানো হয় তবে তারা শেষ পর্যন্ত আবার কোনও মিলিত করে কোনও চক্র বা নোক্রাকে নির্দেশ না করে দেখতে মিলবে।

চক্রের সূচনা পয়েন্টটি খুঁজতে, আসুন ...

  1. m মাথা থেকে চক্রের শুরুতে দূরত্ব হতে হবে;

  2. d চক্রের নোডের সংখ্যা হতে হবে;

  3. p1 ধীর পয়েন্টারের গতি হতে হবে;

  4. p2দ্রুত পয়েন্টারের গতি হতে হবে, যেমন। 2 মানে একবারে দুটি নোডের মধ্য দিয়ে পদক্ষেপ।

    নিম্নলিখিত পুনরাবৃত্তিগুলি পর্যবেক্ষণ করুন:

 m = 0, d = 10:
 p1 = 1:  0  1  2  3  4  5  6  7  8  9 10 // 0 would the start of the cycle
 p2 = 2:  0  2  4  6  8 10 12 14 16 18 20

 m = 1, d = 10:
 p1 = 1: -1  0  1  2  3  4  5  6  7  8  9
 p2 = 2: -1  1  3  5  7  9 11 13 15 17 19

 m = 2, d = 10:
 p1 = 1: -2 -1  0  1  2  3  4  5  6  7  8
 p2 = 2: -2  0  2  4  6  8 10 12 14 16 18

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


1

চল বলি,

N[0] is the node of start of the loop, 
m is the number of steps from beginning to N[0].

আমাদের কাছে 2 এবং 2 টি পয়েন্টার রয়েছে, এ 1x গতিতে চলেছে, বি 2x গতিবেগে চলছে, দুটিই শুরুতে শুরু হয়।

যখন A N [0] এ পৌঁছায়, বি ইতিমধ্যে N [m] তে থাকা উচিত। (দ্রষ্টব্য: A N [0] এ পৌঁছানোর জন্য মি পদক্ষেপগুলি ব্যবহার করে এবং খ আরও মি ধাপ এগিয়ে হওয়া উচিত)

তারপরে, এ বি-এর সাথে সংঘর্ষের জন্য আরও পদক্ষেপগুলি রান করে, যেমন এ এন-কে [ক] এ, বি এন-তে রয়েছে [এম + ২ ক] (দ্রষ্টব্য: বি এন থেকে শুরু হওয়া 2 ক পদক্ষেপের জন্য দৌড়াতে হবে)

যথাক্রমে এন [কে] এবং এন [এম + ২ কে] এ একটি বিস্ফোরণ, এর অর্থ কে = মি + ২ কে, এভাবে কে =-মি

সুতরাং, এন [কে] থেকে এন [0] এ ফিরে ঘুরতে আমাদের আরও কয়েক ধাপ প্রয়োজন।

সোজা কথায়, সংঘর্ষের নোডের সন্ধানের পরে আমাদের আরও কয়েক ধাপ এগিয়ে চলতে হবে। আমাদের শুরু থেকে দৌড়ানোর জন্য একটি পয়েন্টার থাকতে পারে এবং সংঘর্ষ নোড থেকে একটি পয়েন্টার চলতে পারে, তারা মিঃ পদক্ষেপের পরে এন [0] এ দেখা করবে।

সুতরাং, সিউডো কোডটি নিম্নলিখিত হিসাবে রয়েছে:

1) A increase 1 step per loop
2) B increase 2 steps per loop
3) if A & B are the same node, cycle found, then go to 5
4) repeat from 1
5) A reset to head
6) A increase 1 step per loop
7) B increase 1 step per loop
8) if A & B are the same node, start of the cycle found
9) repeat from 6

1

আমি এতটা সত্য বলে মনে করি না যে তারা যখন মিলবে তখন এটিই প্রথম পয়েন্ট। তবে হ্যাঁ যদি অন্য পয়েন্টার (এফ) এর আগে মিটিং পয়েন্টে থাকে তবে তার চেয়ে পয়েন্টারটি লুপের শুরুতে এবং লয়েন্টের শুরুতে শুরু হওয়া পয়েন্টার (এস) এর পরিবর্তে এটি হবে লুপের শুরুতে শেষ করুন। যেমন:

1->2->3->4->5->6->7->8->9->10->11->12->13->14->15->16->17->18->19->20->21->22->23->24->8

Meet at :16

Start at :8

public Node meetNodeInLoop(){

    Node fast=head;
    Node slow=head;

    fast=fast.next.next;
    slow=slow.next;

    while(fast!=slow){

        fast=fast.next;
        fast=fast.next;

        if(fast==slow) break; 

        slow=slow.next;
    }

    return fast;

}

public Node startOfLoop(Node meet){

    Node slow=head;
    Node fast=meet;

    while(slow!=fast){
        fast=fast.next;
        if(slow==fast.next) break;
        slow=slow.next;
    }

    return slow;
}

1

উচ্চ বিদ্যালয়ে আপেক্ষিক বেগের শেখানো একটি সহজ ব্যাখ্যা - পদার্থবিজ্ঞান 101 / কাইনেমেটিক বক্তৃতা।

লিংকডলিস্টে চেনাশোনা

  1. আসুন ধরে নেওয়া যাক লিঙ্কযুক্ত তালিকার শুরু থেকে বৃত্তের শুরু থেকে xহप्स হল শুরু । আসুন বৃত্তের Xসূচনাটিকে পয়েন্ট হিসাবে কল করুন (ক্যাপগুলিতে - উপরের চিত্রটি দেখুন)। এছাড়াও ধরে নেওয়া যাক বৃত্তের মোট আকার হ'ল এন হप्स।

  2. খরগোশের গতি = 2 * কচ্ছপের গতি। সুতরাং যে 1 hops/secএবং 2 hops/secযথাক্রমে

  3. কচ্ছপ যখন বৃত্তের শুরুতে পৌঁছায় X, খরগোশটি চিত্রের xবিন্দুতে আরও দূরে থাকতে হবে Y। (কারণ খরগোশের কাছাকাছি হিসাবে দু'বার দূরত্বে ভ্রমণ করেছেন)।

  4. সুতরাং, X থেকে Y পর্যন্ত ঘড়ির কাঁটার দিকের অবশিষ্ট তোরণটির দৈর্ঘ্য হবে N-x। টি তার কাছে আপেক্ষিক দূরত্ব খরগোশ এবং কচ্ছপ মধ্যে আবৃত করা তাদের দেখা পাবে জন্য হতে হবে । আসুন বলি যে এই আপেক্ষিক দূরত্বটি t_mসময়ের সাথে সাথে মিলিত হওয়ার সময় কভার করা হবে । আপেক্ষিক গতি (2 hops/sec - 1 hops/sec)অর্থাত 1 hops/sec। সুতরাং আপেক্ষিক দূরত্ব = আপেক্ষিক গতি এক্স সময় ব্যবহার করে আমরা পাই, t= N-xসেকেন্ড। সুতরাং N-xকচ্ছপ এবং খরগোশ উভয়ের জন্য বৈঠকের জায়গায় পৌঁছতে এটি লাগবে ।

  5. এখন N-xসেকেন্ড সময় এবং 1 hops/secগতিতে, কাছিম যে প্রথমে বিন্দুতে ছিল Xতারা মিটিং পয়েন্টে পৌঁছানোর জন্য এনএক্স হप्सকে কভার করবে M। সুতরাং, তার মানে সভা বিন্দু Mহয় N-xহপস থেকে বামাবর্তে X= (যা আরো বোঝা) => নেই xবিন্দু থেকে অবশিষ্ট দূরত্ব Mথেকে Xঘড়ির কাঁটার দিকে।

  6. তবে লিঙ্কযুক্ত তালিকার শুরু থেকে xপয়েন্টে পৌঁছানোর দূরত্বও কি X

  7. এখন, আমরা কতটা হুপের xসাথে সাদৃশ্যযুক্ত সে বিষয়ে আমাদের খেয়াল নেই । যদি আমরা লিঙ্কডলিস্টের শুরুতে একটি কচ্ছপ এবং মিটিং পয়েন্টে একটি কচ্ছপ রাখি এবং Mতাদের হোপ / হাঁটতে দেই, তবে তারা পয়েন্টে মিলবে X, যা আমাদের প্রয়োজন পয়েন্ট (বা নোড)।


1

একটি ডায়াগ্রাম দিয়ে এটি কাজ সাহায্য করবে। আমি সমীকরণ ছাড়াই সমস্যাটি ব্যাখ্যা করার চেষ্টা করছি।

  1. যদি আমরা খরগোশ এবং কচ্ছপকে একটি বৃত্তে চলতে দেয় এবং খরগোশটি দু'বার কচ্ছপ চালায়, তাহলে কচ্ছপের জন্য একটি কোলে শেষে অর্ধেক হয়ে যায়। খরগোশের কাছিমের দুটি কোলে শেষ পর্যন্ত 1 টি কোল করানো হত এবং তারা দু'জনেই মিলিত হয়। এটি সমস্ত গতির ক্ষেত্রে প্রযোজ্য যেমন খরগোশ তিনবার চললে, খরগোশের 1 কোল কচ্ছপের 1/3 এর সমান হয় তাই হর্ট কাছিমের জন্য 3 টি কোলে 1 টি কোপ haveেকে রাখা হত এবং তারা মিলিত হয়।
  2. এখন যদি আমরা এগুলি লুপের আগে পদক্ষেপগুলি শুরু করি, তবে এর অর্থ দ্রুত লতাতে আরও দ্রুত খরগোশ শুরু হচ্ছে। সুতরাং কচ্ছপটি লুপের প্রারম্ভে পৌঁছলে হারে মিটার লুপের ধাপ এগিয়ে এবং তারা যখন মিলিত হয় লুপটি শুরুর আগে মি ধাপ।

1

- লুপের আগে কে পদক্ষেপ রয়েছে। আমরা কে জানি না এবং এটির অনুসন্ধানের দরকার নেই। আমরা কেবল কে দিয়ে বিমূর্তভাবে কাজ করতে পারি।

--পরে কে পদক্ষেপ

----- টি চক্রের শুরুতে

----- এইচটি কে-কে চক্রের ধাপে পরিণত হয় (তিনি 2k মোটে গিয়ে K কে লুপে নিয়ে যান)

** তারা এখন লুপসাইজ - কে আলাদা

(নোট করুন যে কে == কে == মোড (লুপসাইজ, কে) - - যদি কোনও নোড 5 নোড চক্রের 2 টি ধাপ হয় তবে এটি 7, 12 বা 392 ধাপেও থাকে, তাই চক্রটি আর্ট কে কত বড় হয় না ফ্যাক্টর.

যেহেতু তারা একে অপরের সাথে সময় প্রতি ইউনিট হিসাবে 1 পদক্ষেপের হারে ধরা দেয় কারণ একজনের তুলনায় অন্যটির চেয়ে দ্বিগুণ দ্রুত গতি রয়েছে, তাই তারা লুপসাইজে - কে মিলবে।

এর অর্থ এটি চক্রের শুরুতে পৌঁছাতে কে নোড নেবে এবং এভাবে মাথা থেকে সাইকেল স্টার্ট এবং সাইক্লস্টার্টের সংঘর্ষ একই।

সুতরাং এখন প্রথম সংঘর্ষের পরে টি মাথার দিকে ফিরে যান। টি এবং এইচ সাইকেল স্টার্টে মিলিত হবে যদি আপনি প্রতি 1 টি হারে যান। (উভয়ের জন্য কে পদক্ষেপে)

এর অর্থ হল অ্যালগরিদমটি হ'ল:

  • মাথা থেকে সরান T = t.next এবং H.next.next এগুলি সংঘর্ষ হওয়া অবধি (টি == এইচ) (একটি চক্র রয়েছে)

// কে = 0 বা টি এবং এইচ লুপের দৈর্ঘ্য গণনা করে লুপের শীর্ষে দেখা করলে মামলার যত্ন নিন

- কাউন্টার দিয়ে টি বা এইচ এর চারপাশে সরিয়ে চক্রের দৈর্ঘ্য গণনা করুন

- তালিকার শীর্ষে একটি পয়েন্টার টি 2 সরান

- চক্রের ধাপগুলির স্থান নির্দেশকের দৈর্ঘ্য

- মাথাতে অন্য পয়েন্টার H2 সরান

- চক্রের শুরুতে তারা মিলিত হওয়া অবধি T2 এবং H2 তেমন ব্যবহার করতে পারেন

এটাই!


1

এর জন্য ইতিমধ্যে প্রচুর উত্তর রয়েছে, তবে আমি একবার এটির জন্য একটি চিত্র নিয়ে এসেছি যা আমার কাছে আরও দৃষ্টিভঙ্গি। সম্ভবত এটি অন্যান্য লোককে সহায়তা করতে পারে।

আমার জন্য প্রধান আহ-মুহুর্তগুলি হ'ল:

  • টি (কচ্ছপ) টি 1 (প্রাক-লুপ) এবং টি 2 (ইন-লুপ) এ বিভক্ত করুন । টি = কচ্ছপ, এইচ = হারে

  • এইচ থেকে টি বিয়োগ করুন , যেখানে তারা চাক্ষুষভাবে ওভারল্যাপ করে। যা থেকে যায় ( এইচ - টি = এইচ ) টি এর সমান ।

  • বাকি গণিতটি বেশ সহজ। এইচ থেকে, বিয়োগ করুন যেখানে টি চাক্ষুষভাবে ওভারল্যাপ হয়

-1

আমি জানি এই সমস্যার জন্য ইতিমধ্যে স্বীকৃত উত্তর আছে তবে আমি তরল পদ্ধতিতে উত্তর দেওয়ার চেষ্টা করব। ধরে নিন:

The length of the Path is 'X+B' where 'B' is the length of the looped path and X of the non looped path. 
    Speed of tortoise : v
    Speed of hare     : 2*v 
    Point where both meet is at a distance 'x + b - k' from the starting point.

এখন, খরগোশ এবং কচ্ছপ শুরু থেকেই 't' এর পরে মিলিত হোক।

পর্যবেক্ষণ:

যদি, কচ্ছপ দ্বারা দূরত্ব ভ্রমণ = v * টি = এক্স + (বিকে) (বলুন)

তারপরে, দূরত্বটি হারে = 2 * ভি * টি = এক্স + (বি - কে) + বি দ্বারা ভ্রমণ করা হয়েছিল (যেহেতু খরগোশটি ইতিমধ্যে একবার লুপ করা অংশটি পেরিয়ে গেছে)

এখন, সেখানে সভা করার সময় একই রকম।

=> x + 2 * বি - কে = 2 * (এক্স + বি - কে)

=> এক্স = কে

অবশ্যই এটির অর্থ হ'ল যে পথটির দৈর্ঘ্য লুপ করা হয়নি সে বিন্দু থেকে লুপের প্রারম্ভিক বিন্দুর দূরত্বের সাথে উভয়ই মিলিত হয়।


আপনি ধরে নিতে পারবেন না যে কচ্ছপটি দেখা হওয়ার সময় অবধি ঠিক x + বিকেলে ভ্রমণ করেছিল। এছাড়াও, আমি বুঝতে পারি না যে কীভাবে খরগোশের দূরত্বের জন্য আপনি x + 2 * বিকে পেয়েছেন।
প্লুম্যানেটর

কারন কচ্ছপের সাথে একবার দেখা করতেই খরগোশটি লুপ করা অংশটি অতিক্রম করত .. আমি সেখানে এটি ব্যাখ্যা করলাম না: /
n0n চুন

-1

আপনি যদি সভা সভার পেছনের গণিত বিবেচনা করেন তবে এটি উভয়ই প্রারম্ভিক পর্যায়ে মিলিত হবে তা প্রমাণ করা খুব সহজ।
প্রথমত দিন মি লিঙ্ক তালিকায় চক্রের শুরুর স্থান বোঝাতে, এবং এন চক্রের দৈর্ঘ্য বোঝান। তারপরে খরগোশ এবং কচ্ছপের সাথে দেখা করার জন্য, আমাদের রয়েছে:

( 2*t - m )%n = (t - m) %n, where t = time (at t = 0 , both are at the start)

এটি আরও গাণিতিকভাবে উল্লেখ করে:

(2*t - m - (t - m) ) = 0 modulo n , which implies , t = 0 modulo n 

সুতরাং তারা সময়মতো মিলবে যা চক্রের দৈর্ঘ্যের একাধিক হওয়া উচিত। এর অর্থ হ'ল তারা কোনও স্থানে দেখা হয়, যা (t-m) modulo n = (0-m) modulo n = (-m) modulo n

সুতরাং এখন প্রশ্নে ফিরে আসা, আপনি যদি সংযুক্ত তালিকার শুরু থেকে একটি পয়েন্টারটি সরান, এবং অন্যটি ছেদ বিন্দু থেকে, অন্য পদক্ষেপের পরে মি পদক্ষেপ নেওয়ার পরে আমাদের খরগোশ (যা চক্রের অভ্যন্তরে চলেছে) একটি বিন্দুতে আসবে যা হ'ল ((-m) + m) modulo n = 0 modulo nযা চক্রের প্রারম্ভিক বিন্দু ছাড়া আর কিছুই নয় o সুতরাং আমরা দেখতে পাচ্ছি যে মিটার পদক্ষেপের পরে এটি চক্রটি শুরু হয় এবং কচ্ছপটি সেখানে এটির সাথে মিলিত হবে কারণ এটি মিটার অতিক্রম করবে will লিঙ্কযুক্ত তালিকার শুরু থেকে পদক্ষেপগুলি ।

পার্শ্ব দ্রষ্টব্য হিসাবে, আমরা এইভাবে তাদের ছেদ করার সময়টিও গণনা করতে পারি: শর্তটি t = 0 modulo nআমাদের জানায় যে তারা এমন এক সময়ে মিলিত হবে যা চক্র দৈর্ঘ্যের একাধিক এবং মিলিত হওয়ার সাথে সাথে তারা টি মিটার থেকেও বেশি হওয়া উচিত t চক্র . সুতরাং নেওয়া সময়টি n এর প্রথম একাধিকের সমান হবে যা মিটার থেকে বড়


তারা চক্রের শুরুতে অগত্যা পূরণ হয় না।
ওয়ারেন ম্যাকএভয়

-1

ধরুন আপনার পয়েন্টারগুলি y পয়েন্ট y এবং z এর ছেদে মিলছে।

n এবং m হল লুপের সংখ্যা দ্রুত এবং ধীর পয়েন্টার যথাক্রমে মিলিত হওয়ার আগে লাগে takes

বাকি প্রমাণের জন্য চিত্রটি দেখুন। সংযুক্ত তালিকায় লুপের প্রারম্ভিক বিন্দুটি সন্ধান করুন

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