আমি বুঝতে পারি যে কচ্ছপ এবং হারের বৈঠকটি লুপের অস্তিত্বের সমাপ্তি করে, তবে কচ্ছপকে কীভাবে সংযুক্ত স্থানে রাখার সময় লিঙ্কযুক্ত তালিকার শুরুতে সরানো হয়, উভয়কে একবারে এক ধাপ এগিয়ে নিয়ে যাওয়ার পরে চক্রের সূচনা পর্যায়ে মিলিত করে তোলে?
আমি বুঝতে পারি যে কচ্ছপ এবং হারের বৈঠকটি লুপের অস্তিত্বের সমাপ্তি করে, তবে কচ্ছপকে কীভাবে সংযুক্ত স্থানে রাখার সময় লিঙ্কযুক্ত তালিকার শুরুতে সরানো হয়, উভয়কে একবারে এক ধাপ এগিয়ে নিয়ে যাওয়ার পরে চক্রের সূচনা পর্যায়ে মিলিত করে তোলে?
উত্তর:
এটি চক্র সনাক্তকরণের জন্য ফ্লয়েডের অ্যালগরিদম । আপনি অ্যালগরিদমের দ্বিতীয় ধাপ সম্পর্কে জিজ্ঞাসা করছেন - একবার আপনি একটি নোড খুঁজে পেয়েছেন যা একটি চক্রের অংশ, একটি চক্রের সূচনা কীভাবে খুঁজে পাবে ?
ফ্লয়েডের অ্যালগরিদমের প্রথম অংশে, খরগোশের কচ্ছপের প্রতিটি পদক্ষেপের জন্য দুটি পদক্ষেপ নিয়ে যায়। যদি কচ্ছপ এবং খরগোশ কখনও দেখা দেয় তবে একটি চক্র থাকে এবং সভা পয়েন্টটি চক্রের অংশ, তবে চক্রের প্রথম নোডের প্রয়োজন হয় না।
কচ্ছপ এবং খরগোশ যখন মিলিত হয়, আমরা খুঁজে পেয়েছি সবচেয়ে ছোট i (কচ্ছপের নেওয়া পদক্ষেপের সংখ্যা) যেমন X i = X 2i । X 0 থেকে শুরু করে চক্রের শুরুতে পেতে কতগুলি পদক্ষেপের মিউ উপস্থাপন করুন এবং লাম্বদা চক্রের দৈর্ঘ্যের প্রতিনিধিত্ব করুন। তারপরে আমি = মিউ + ল্যাম্বদা এবং ২ আই = মিউ + বি ল্যাম্বদা, যেখানে ক এবং খ পূর্ণসংখ্যক যেখানে কচ্ছপ এবং খরগোস চক্রের চারপাশে কতবার গেছে তা বোঝায়। দ্বিতীয়টি থেকে প্রথম সমীকরণ বিয়োগ করা i = (বা) * ল্যাম্বদা দেয়, সুতরাং আমি ল্যাম্বডারের একটি পূর্ণসংখ্যা একাধিক। সুতরাং, এক্স আই + মি = এক্স মিউ । এক্স আমি কচ্ছপ এবং খরগোশের মিটিং পয়েন্ট উপস্থাপন করে। আপনি যদি কাছিমটিকে শুরু নোডে ফিরে যান0 , এবং কচ্ছপ এবং খরগোশকে একই গতিতে চালিয়ে দেওয়া যাক, মিউ অতিরিক্ত পদক্ষেপের পরে কচ্ছপটি এক্স মিউ পৌঁছে যাবে এবং হারে এক্স আই + মি = এক্স মিউ পৌঁছে যাবে , সুতরাং দ্বিতীয় মিলন বিন্দুটি শুরু সূচিত করে সাইকেল.
X_mu
চক্রের সূচনা (মিউ এর সংজ্ঞা অনুসারে) যাওয়ার জন্য প্রারম্ভ বিন্দু থেকে মু পদক্ষেপ নিন । তারপরে আপনি যদি আরও পদক্ষেপ গ্রহণ করেন যেখানে আমি চক্র দৈর্ঘ্যের একাধিক, আপনি চক্রের শুরুতে ফিরে এসেছেন: X_mu + i
= X_mu
। তবে সংযোজনটি পরিবর্তনশীল, সুতরাং এটি প্রথম মিটিং পয়েন্ট থেকে শুরু করার জন্য আমি পদক্ষেপ গ্রহণের সমতুল্য X_i
, তারপরে আবার ফিরে আসার জন্য অতিরিক্ত পদক্ষেপগুলি X_mu
, চক্রের সূচনা।
i
চক্রের কোনও পর্যায়ে রয়েছে, আমি মনে করি যে সমীকরণটি হওয়া উচিত i = mu + k + a*lambda
এবং চক্র থেকে শুরু করে সভা পয়েন্টের ধাপের সংখ্যাটি 2i = mu + k + b*lambda
কোথায় k
। উভয় সমীকরণ বিয়োগ করা একই ফলাফল দেয় যদিও।
আমার নিজের কথায় 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 পদক্ষেপগুলি শুরু করেছিল, তাই খয়েরটি চক্রের শুরুতে পৌঁছাতে হবে।
ফলস্বরূপ, এটি ব্যাখ্যা করে যে তাদের প্রথমবারের জন্য কয়েকটি পদক্ষেপের পরে চক্রের শুরুতে দেখা করতে হবে (খুব প্রথম বার কারণ কচ্ছপ মাত্র কয়েক ধাপ পরে চক্রের কাছে এসেছিল এবং এটি কখনই খরগোশ দেখতে পায় নি যা ইতিমধ্যে ছিল চক্র).
এখন আমরা জানি যে তালিকার শুরু থেকে চক্রের সূচনার দূরত্ব হিসাবে দেখা না হওয়া পর্যন্ত আমাদের তাদের যে পরিমাণ পদক্ষেপের প্রয়োজন তা সরাতে হবে, মি। অবশ্যই, অ্যালগরিদমটি মি কী তা জানতে হবে না। এটি মিলিত না হওয়া পর্যন্ত এটি একবারে কচ্ছপ এবং খরগোশ উভয় স্থানান্তরিত করবে। মিটিং পয়েন্টটি চক্র শুরু হতে হবে এবং পদক্ষেপের সংখ্যা অবশ্যই চক্রের শুরু থেকে দূরত্ব (মি) হতে হবে। ধরে নিচ্ছি যে আমরা তালিকার দৈর্ঘ্য জানি, আমরা তালিকা দৈর্ঘ্য থেকে এম বিয়োগের চক্রের দৈর্ঘ্যও গণনা করতে পারি।
m + k = (q - 2p) n
আরও সরল করা যেতে পারে m + k = q*n
। এর কারণ হ'ল কচ্ছপের কাছ থেকে নেওয়া লুপের সংখ্যা সর্বদা শূন্য হবে কারণ খরগোশটি দেখা না করে কচ্ছপটিকে কখনই ছাড়তে পারে না। চিন্তা করুন.
এই চিত্রটি দেখুন:
= X + y সাক্ষাতের পূর্বে স্লোপয়েন্টার দিয়ে দূরত্ব ভ্রমণ
= (X + y + z) + y = x + 2y + z মিলনের আগে ফাস্টপয়েন্টার দিয়ে দূরত্ব ভ্রমণ করা হয়েছে
যেহেতু ফাস্টপয়েন্টার স্লোপয়েন্টারটির দ্বিগুণ গতিতে ভ্রমণ করে এবং সভা পয়েন্টে পৌঁছালে সময় উভয়ের পক্ষে স্থির থাকে।
সুতরাং সাধারণ গতি, সময় এবং দূরত্বের সম্পর্ক 2 (x + y) = x + 2y + z => x + 2y + z = 2x + 2y => x = z ব্যবহার করে
সুতরাং লিঙ্কযুক্ত তালিকার শুরুতে স্লোপোয়েন্টারটি সরিয়ে , এবং একবারে একটি নোড সরানোর জন্য স্লোপোয়েন্টার এবং ফাস্টপোয়েন্টার উভয়কেই তৈরি করে, উভয়ের উভয়ই কভার করার একই দূরত্ব রয়েছে ।
লিংকটি লিঙ্কযুক্ত তালিকায় শুরু হয় এমন স্থানে পৌঁছে যাবে।
ওল্ড সন্ন্যাসীর সহজ এবং নিম্ন-উত্তরের উত্তরটি যখন দ্রুত রানার কেবলমাত্র একক পূর্ণ চক্র সম্পূর্ণ করে তখন চক্রটি সন্ধানের ব্যাখ্যা দেয়। এই উত্তরে আমি কেসটি ব্যাখ্যা করি যখন ধীর রানার লুপে প্রবেশের আগে দ্রুত রানার একাধিকবার লুপ চালায়।
ধরা যাক দ্রুত রানার ধীর এবং দ্রুত মিলনের আগে লুপ এম বার চালিয়েছে । এই যে মানে:
যেহেতু দ্রুতগতির গতি দ্বিগুণ গতিতে চলে এবং এগুলি একই সময়ে চলতে থাকে, তার থেকে বোঝা যায় যে আমরা যদি দূরত্বকে ধীরে ধীরে চালিত করি তবে আমরা দূরত্বটি দ্রুত চালিয়ে যাব। সুতরাং,
এক্স দানের জন্য সমাধান করা,
x = (মি - 1) (y + z) + জেড
বাস্তব দৃশ্যে এর অর্থ হবে, x = (মি - 1) সম্পূর্ণ লুপটি চালায় + একটি অতিরিক্ত দূরত্ব z ।
অতএব, আমরা যদি তালিকার শুরুতে একটি পয়েন্টার রেখেছি এবং অন্যটিকে মিটিং পয়েন্টে রেখে দিই, তবে তাদের একই গতিতে চালিত করলে লুপের এম - 1 রান সম্পূর্ণ হবে এবং তারপরে অপরের সাথে সাক্ষাত হবে লুপ শুরুতে পয়েন্টার।
এটা খুব সহজ। আপেক্ষিক গতির ক্ষেত্রে আপনি ভাবতে পারেন। যদি খরগোশ দুটি নোড সরিয়ে এবং কচ্ছপ একটি নোড সরায় তবে কচ্ছপ খরগোশের তুলনায় একটি নোড চলেছে (বিশ্রামে কচ্ছপটি ধরে নিও)। সুতরাং, আমরা বিজ্ঞপ্তিযুক্ত লিঙ্ক তালিকার একটি নোড সরানো হলে আমরা নিশ্চিত যে আবার যে বিন্দুতে দেখা হবে।
বিজ্ঞপ্তিযুক্ত লিঙ্কযুক্ত তালিকার অভ্যন্তরে সংযুক্ত বিন্দুটি সন্ধান করার পরে, এখন দুটি সংযুক্ত তালিকার সমস্যার ছেদ বিন্দু সন্ধান করতে সমস্যা হ্রাস পাবে।
প্রথম সংঘর্ষের সময়, কাছাকাছি উপরে দেখানো হিসাবে মি + কে পদক্ষেপ সরানো হয়েছে । কচ্ছপের তুলনায় হরে দ্বিগুণ দ্রুত পদক্ষেপ নেয়, অর্থ খরগোশ 2 (মি + কে) পদক্ষেপে সরানো হয় । এই সাধারণ তথ্যগুলি থেকে আমরা নিম্নলিখিত গ্রাফটি অর্জন করতে পারি।
এই মুহুর্তে, আমরা কচ্ছপটিকে আবার শুরুতে সরিয়ে নিয়ে যাই এবং ঘোষণা করি যে খরগোশ এবং কচ্ছপ উভয়কেই একবারে এক ধাপ এগিয়ে যেতে হবে। সংজ্ঞা অনুসারে, এম পদক্ষেপের পরে , কচ্ছপটি চক্রের শুরুতে হবে। খরগোশ কোথায় হবে?
চক্রের শুরুতে হরেও থাকবে। এটি দ্বিতীয় গ্রাফ থেকে স্পষ্ট: কচ্ছপটি যখন আবার শুরুতে সরানো হয়েছিল, তখন খরগোশটি শেষ চক্রের K পদক্ষেপে ছিল । মিটার পদক্ষেপের পরে , খরগোশের আরও একটি চক্র সম্পন্ন হবে এবং কচ্ছপের সাথে সংঘর্ষ হবে।
দৃষ্টীকোণ:
দুটি পয়েন্টার রয়েছে:
যদি দুটি পয়েন্টার মিলিত হয় তবে এটি প্রমাণ করে যে একটি লুপ রয়েছে। একবার তারা মিলিত হয়ে গেলে নোডগুলির মধ্যে একটি মাথার দিকে নির্দেশ করবে এবং তারপরে উভয়ই এক সাথে একটি নোড এগিয়ে যাবে। লুপের শুরুতে তারা মিলিত হবে।
যুক্তি: দুটি ব্যক্তি যখন একটি বৃত্তাকার ট্র্যাকের উপর দিয়ে হাঁটেন, তাদের মধ্যে একজনের অপরের গতি দ্বিগুণ হয়, তারা কোথায় মিলবে? ঠিক কোথায় তারা শুরু করেছে।
এখন, ধরুন দ্রুত রানার k
একটি n
ধাপ কোলে ধাপ শুরু করে। তারা কোথায় দেখা করবে? ঠিক n-k
পদক্ষেপে। যখন ধীর রানার (n-k)
পদক্ষেপগুলি covered েকে রাখে, দ্রুত রানার k+2(n-k)
ধাপগুলি coveredেকে রাখত। ( যেমন, k+2n-2k
পদক্ষেপগুলি অর্থাৎ 2n-k
পদক্ষেপ )। অর্থাত্ (n-k)
পদক্ষেপগুলি (পথটি বিজ্ঞপ্তিযুক্ত এবং তারা যে রাউন্ডের পরে মিলিত হয় তার সংখ্যা সম্পর্কে আমরা উদ্বিগ্ন নই; আমরা কেবল তারা যেখানে অবস্থান করি সে বিষয়ে আগ্রহী)।
এখন দ্রুত রানার কীভাবে k
প্রথম স্থানে পদক্ষেপের সূচনা পেল ? কারণ এটি ধীর রানারকে নিয়েছে যে লুপের শুরুতে পৌঁছাতে অনেক পদক্ষেপ নিয়েছে। সুতরাং লুপটির শুরুটি নোড থেকে কে পদক্ষেপগুলি steps
দ্রষ্টব্য: নোড যেখানে উভয় পয়েন্টার পূরণ k
করেছে লুপটি শুরু করার (লুপের অভ্যন্তরীণ) থেকে কয়েক k
ধাপ দূরে এবং হেড নোডটি লুপের শুরু থেকে কয়েক ধাপ দূরে। সুতরাং যখন আমাদের কাছে পয়েন্টারগুলি এই নোডগুলি থেকে 1 পদক্ষেপের সমান গতিতে অগ্রসর হয়, তারা লুপের শুরুতে মিলিত হবে।
আমি বিশ্বাস করি এটি সোজা। কোনও অংশ অস্পষ্ট থাকলে দয়া করে আমাকে জানান।
ঠিক আছে সুতরাং হারে এবং কচ্ছপটি এমন এক পর্যায়ে মিলিত হয় যা চক্র শুরু হওয়ার থেকে কয়েক ধাপ দূরে থাকে, চক্র শুরু হওয়ার আগে ধাপগুলির সংখ্যা মু এবং চক্রের দৈর্ঘ্য এল হয়।
সুতরাং এখন সভা পয়েন্ট ->
দূরত্ব কচ্ছপ দ্বারা আচ্ছাদিত = মু + এ * এল + কে - সমীকরণ 1
(চক্রের প্রারম্ভিক পর্যায়ে পৌঁছানোর পদক্ষেপগুলি চক্রের 'a' পুনরাবৃত্তিকে আবর্তিত করার জন্য গৃহীত পদক্ষেপগুলি চক্রের শুরু থেকে + ক পদক্ষেপগুলি নিয়ে আসে) (যেখানে কিছুটা ধনাত্মক ধ্রুবক থাকে)
দূরত্বটি হেয়ার = মু + বি * এল + কে দ্বারা আবৃত - সমীকরণ 2
(চক্রের প্রারম্ভিক পর্যায়ে পৌঁছানোর পদক্ষেপগুলি চক্রের + বি পদক্ষেপগুলি 'ক' চক্রের শুরু থেকে কভার করে নেওয়া হয়েছে) (যেখানে খ কিছু ধনাত্মক ধ্রুবক এবং বি> = ক)
সুতরাং হারে আচ্ছাদিত অতিরিক্ত দূরত্ব হল = সমীকরণ 2 - সমীকরণ 1 = (বা) * এল
দয়া করে নোট করুন যে এই দূরত্বটিও কাছিমের কাছাকাছি থেকে দু'গুণ বেশি গতিতে চলার পর থেকে শুরু থেকে কচ্ছপের দূরত্বের সমান। এটি 'মিউ + কে' এর সাথে সমান হতে পারে যা শুরু থেকে মিলন পয়েন্টের দূরত্বও যদি আমরা চক্রের একাধিক ট্র্যাভারসাল অন্তর্ভুক্ত না করি।
সুতরাং, মিউ + কে = (বা) * এল
সুতরাং এই বিন্দু থেকে মু পদক্ষেপগুলি চক্রের শুরুতে ফিরে যেতে পারে (যেহেতু চক্র শুরু হওয়ার আগে থেকে পদক্ষেপগুলি ইতিমধ্যে সভার স্থানে পৌঁছানোর জন্য নেওয়া হয়েছিল)। এটি একই চক্র বা পরবর্তী কোনও চক্রের মধ্যে ঘটতে পারে। সুতরাং এখন যদি আমরা কচ্ছপটিকে লিঙ্কযুক্ত তালিকার শুরুতে সরিয়ে নিয়ে যাই, তবে এটি চক্রের প্রারম্ভিক পর্যায়ে পৌঁছতে মু পদক্ষেপ গ্রহণ করবে এবং খড় চক্রের প্রারম্ভিক অবস্থানে পৌঁছাতে মি পদক্ষেপ গ্রহণ করবে এবং এইভাবে তারা উভয়ই মিলিত হবে চক্রের সূচনা পয়েন্ট
পিএস সত্যই, আমার মনের মূল পোস্টার হিসাবে আমার একই প্রশ্ন ছিল এবং আমি প্রথম উত্তরটি পড়েছিলাম, তারা কয়েকটি বিষয় পরিষ্কার করে দিয়েছে তবে আমি চূড়ান্ত ফলাফলটি পরিষ্কারভাবে পেতে পারি না এবং তাই আমি এটি আমার নিজের উপায়ে করার চেষ্টা করেছি এবং এটি বুঝতে সহজ।
একটি পয়েন্টার অনুসরণ করে এমন লিঙ্কের সংখ্যার কল দুরত্ব এবং সময় অনুসারে অ্যালগোরিদম ধীর পয়েন্টারটিকে একটি লিঙ্ক এবং দ্রুত পয়েন্টার দুটি লিঙ্ককে সরিয়ে নিয়ে যায়। দৈর্ঘ্যের সি-এর একটি চক্রের আগে এন নোড থাকে, সি -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;
}
লুপ সমস্যায় সমস্যা হ্রাস করুন, তারপরে প্রাথমিক সমস্যার দিকে ফিরে যান
আমি নীচের ব্যাখ্যাটি আরও স্বজ্ঞাত বলে মনে করি।
দুটি পয়েন্টার ( 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 থেকে দূরত্ব কমিয়ে দেয় 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 = b
AC = AB + BC = n - b
CA = n - AC
AC = CA
AC
এখন, প্রাথমিক স্কিমাতে ফিরে যাওয়া যাক।
আমরা জানি a = k*n + b
এবং CA = b
।
আমরা 2 টি নতুন পয়েন্টার 1 ' এবং 1' 'নিতে পারি , যেখানে 1' মাথা ( ও ) থেকে শুরু হয় এবং 1 '' ছেদ বিন্দু ( সি ) থেকে শুরু হয় ।
যদিও 1 ' থেকে যায় হে করার একটি , ' 1 ' থেকে যায় সি থেকে একটি ফিনিস চলতে k
ল্যাপ। সুতরাং, ছেদ বিন্দুটি এ ।
চিত্রটিতে প্রদর্শিত হিসাবে পয়েন্টারগুলি যদি একটি বিন্দু পিতে মিলিত হয় তবে জেড + ওয়াইয়ের দূরত্বটি পয়েন্ট পি এবং এক্স + ওয়াইটিও বিন্দু পি, যার অর্থ জেড = এক্স। একারণে পি থেকে একটি পয়েন্টার সরিয়ে রাখার এবং অন্যটির শুরু (এস) থেকে তাদের সাক্ষাৎ হওয়া পর্যন্ত সরিয়ে রাখা, যার অর্থ সমান দূরত্ব (জেড বা এক্স) একই বিন্দু এম তে স্থানান্তরিত করা (পি থেকে এক্স এবং এস থেকে এক্স দূরত্ব) হবে লুপ শুরু। সরল!
উপরের সমস্ত বিশ্লেষণের সাথে, আপনি যদি একজন শিক্ষণীয় উদাহরণ ব্যক্তি হন তবে আমি একটি সংক্ষিপ্ত বিশ্লেষণ এবং উদাহরণ লেখার চেষ্টা করেছি যা গণিতকে ব্যাখ্যা করার জন্য প্রত্যেককে ব্যাখ্যা করার চেষ্টা করেছিল। এখানে আমরা যাই!
বিশ্লেষণ:
যদি আমাদের দুটি পয়েন্টার থাকে, একজনের তুলনায় অন্যটি দ্রুত এবং তাদের সাথে একসাথে সরানো হয় তবে তারা শেষ পর্যন্ত আবার কোনও মিলিত করে কোনও চক্র বা নোক্রাকে নির্দেশ না করে দেখতে মিলবে।
চক্রের সূচনা পয়েন্টটি খুঁজতে, আসুন ...
m
মাথা থেকে চক্রের শুরুতে দূরত্ব হতে হবে;
d
চক্রের নোডের সংখ্যা হতে হবে;
p1
ধীর পয়েন্টারের গতি হতে হবে;
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
চক্রের শুরু থেকে কয়েক ধাপ দূরে থাকে। এটি সমাধানের জন্য, দ্রুত পয়েন্টারটি মাথার পিছনে রাখুন এবং তার গতি ধীর পয়েন্টারের গতিতে সেট করুন। যখন তারা আবার মিলিত হয়, নোডটি চক্রের শুরু।
চল বলি,
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->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;
}
উচ্চ বিদ্যালয়ে আপেক্ষিক বেগের শেখানো একটি সহজ ব্যাখ্যা - পদার্থবিজ্ঞান 101 / কাইনেমেটিক বক্তৃতা।
আসুন ধরে নেওয়া যাক লিঙ্কযুক্ত তালিকার শুরু থেকে বৃত্তের শুরু থেকে x
হप्स হল শুরু । আসুন বৃত্তের X
সূচনাটিকে পয়েন্ট হিসাবে কল করুন (ক্যাপগুলিতে - উপরের চিত্রটি দেখুন)। এছাড়াও ধরে নেওয়া যাক বৃত্তের মোট আকার হ'ল এন হप्स।
খরগোশের গতি = 2 * কচ্ছপের গতি। সুতরাং যে 1 hops/sec
এবং 2 hops/sec
যথাক্রমে
কচ্ছপ যখন বৃত্তের শুরুতে পৌঁছায় X
, খরগোশটি চিত্রের x
বিন্দুতে আরও দূরে থাকতে হবে Y
। (কারণ খরগোশের কাছাকাছি হিসাবে দু'বার দূরত্বে ভ্রমণ করেছেন)।
সুতরাং, X থেকে Y পর্যন্ত ঘড়ির কাঁটার দিকের অবশিষ্ট তোরণটির দৈর্ঘ্য হবে N-x
। টি তার কাছে আপেক্ষিক দূরত্ব খরগোশ এবং কচ্ছপ মধ্যে আবৃত করা তাদের দেখা পাবে জন্য হতে হবে । আসুন বলি যে এই আপেক্ষিক দূরত্বটি t_m
সময়ের সাথে সাথে মিলিত হওয়ার সময় কভার করা হবে । আপেক্ষিক গতি (2 hops/sec - 1 hops/sec)
অর্থাত 1 hops/sec
। সুতরাং আপেক্ষিক দূরত্ব = আপেক্ষিক গতি এক্স সময় ব্যবহার করে আমরা পাই, t
= N-x
সেকেন্ড। সুতরাং N-x
কচ্ছপ এবং খরগোশ উভয়ের জন্য বৈঠকের জায়গায় পৌঁছতে এটি লাগবে ।
এখন N-x
সেকেন্ড সময় এবং 1 hops/sec
গতিতে, কাছিম যে প্রথমে বিন্দুতে ছিল X
তারা মিটিং পয়েন্টে পৌঁছানোর জন্য এনএক্স হप्सকে কভার করবে M
। সুতরাং, তার মানে সভা বিন্দু M
হয় N-x
হপস থেকে বামাবর্তে X
= (যা আরো বোঝা) => নেই x
বিন্দু থেকে অবশিষ্ট দূরত্ব M
থেকে X
ঘড়ির কাঁটার দিকে।
তবে লিঙ্কযুক্ত তালিকার শুরু থেকে x
পয়েন্টে পৌঁছানোর দূরত্বও কি X
।
এখন, আমরা কতটা হুপের x
সাথে সাদৃশ্যযুক্ত সে বিষয়ে আমাদের খেয়াল নেই । যদি আমরা লিঙ্কডলিস্টের শুরুতে একটি কচ্ছপ এবং মিটিং পয়েন্টে একটি কচ্ছপ রাখি এবং M
তাদের হোপ / হাঁটতে দেই, তবে তারা পয়েন্টে মিলবে X
, যা আমাদের প্রয়োজন পয়েন্ট (বা নোড)।
একটি ডায়াগ্রাম দিয়ে এটি কাজ সাহায্য করবে। আমি সমীকরণ ছাড়াই সমস্যাটি ব্যাখ্যা করার চেষ্টা করছি।
- লুপের আগে কে পদক্ষেপ রয়েছে। আমরা কে জানি না এবং এটির অনুসন্ধানের দরকার নেই। আমরা কেবল কে দিয়ে বিমূর্তভাবে কাজ করতে পারি।
--পরে কে পদক্ষেপ
----- টি চক্রের শুরুতে
----- এইচটি কে-কে চক্রের ধাপে পরিণত হয় (তিনি 2k মোটে গিয়ে K কে লুপে নিয়ে যান)
** তারা এখন লুপসাইজ - কে আলাদা
(নোট করুন যে কে == কে == মোড (লুপসাইজ, কে) - - যদি কোনও নোড 5 নোড চক্রের 2 টি ধাপ হয় তবে এটি 7, 12 বা 392 ধাপেও থাকে, তাই চক্রটি আর্ট কে কত বড় হয় না ফ্যাক্টর.
যেহেতু তারা একে অপরের সাথে সময় প্রতি ইউনিট হিসাবে 1 পদক্ষেপের হারে ধরা দেয় কারণ একজনের তুলনায় অন্যটির চেয়ে দ্বিগুণ দ্রুত গতি রয়েছে, তাই তারা লুপসাইজে - কে মিলবে।
এর অর্থ এটি চক্রের শুরুতে পৌঁছাতে কে নোড নেবে এবং এভাবে মাথা থেকে সাইকেল স্টার্ট এবং সাইক্লস্টার্টের সংঘর্ষ একই।
সুতরাং এখন প্রথম সংঘর্ষের পরে টি মাথার দিকে ফিরে যান। টি এবং এইচ সাইকেল স্টার্টে মিলিত হবে যদি আপনি প্রতি 1 টি হারে যান। (উভয়ের জন্য কে পদক্ষেপে)
এর অর্থ হল অ্যালগরিদমটি হ'ল:
// কে = 0 বা টি এবং এইচ লুপের দৈর্ঘ্য গণনা করে লুপের শীর্ষে দেখা করলে মামলার যত্ন নিন
- কাউন্টার দিয়ে টি বা এইচ এর চারপাশে সরিয়ে চক্রের দৈর্ঘ্য গণনা করুন
- তালিকার শীর্ষে একটি পয়েন্টার টি 2 সরান
- চক্রের ধাপগুলির স্থান নির্দেশকের দৈর্ঘ্য
- মাথাতে অন্য পয়েন্টার H2 সরান
- চক্রের শুরুতে তারা মিলিত হওয়া অবধি T2 এবং H2 তেমন ব্যবহার করতে পারেন
এটাই!
এর জন্য ইতিমধ্যে প্রচুর উত্তর রয়েছে, তবে আমি একবার এটির জন্য একটি চিত্র নিয়ে এসেছি যা আমার কাছে আরও দৃষ্টিভঙ্গি। সম্ভবত এটি অন্যান্য লোককে সহায়তা করতে পারে।
আমার জন্য প্রধান আহ-মুহুর্তগুলি হ'ল:
আমি জানি এই সমস্যার জন্য ইতিমধ্যে স্বীকৃত উত্তর আছে তবে আমি তরল পদ্ধতিতে উত্তর দেওয়ার চেষ্টা করব। ধরে নিন:
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 * (এক্স + বি - কে)
=> এক্স = কে
অবশ্যই এটির অর্থ হ'ল যে পথটির দৈর্ঘ্য লুপ করা হয়নি সে বিন্দু থেকে লুপের প্রারম্ভিক বিন্দুর দূরত্বের সাথে উভয়ই মিলিত হয়।
আপনি যদি সভা সভার পেছনের গণিত বিবেচনা করেন তবে এটি উভয়ই প্রারম্ভিক পর্যায়ে মিলিত হবে তা প্রমাণ করা খুব সহজ।
প্রথমত দিন মি লিঙ্ক তালিকায় চক্রের শুরুর স্থান বোঝাতে, এবং এন চক্রের দৈর্ঘ্য বোঝান। তারপরে খরগোশ এবং কচ্ছপের সাথে দেখা করার জন্য, আমাদের রয়েছে:
( 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 এর প্রথম একাধিকের সমান হবে যা মিটার থেকে বড় ।
ধরুন আপনার পয়েন্টারগুলি y পয়েন্ট y এবং z এর ছেদে মিলছে।
n এবং m হল লুপের সংখ্যা দ্রুত এবং ধীর পয়েন্টার যথাক্রমে মিলিত হওয়ার আগে লাগে takes
বাকি প্রমাণের জন্য চিত্রটি দেখুন। সংযুক্ত তালিকায় লুপের প্রারম্ভিক বিন্দুটি সন্ধান করুন