সমস্ত চক্র সন্ধান করা


9

আমার কাছে একটি সীমাবদ্ধ সেট , একটি ফাংশন এবং মোট অর্ডার < এস তে । আমি এস তে স্বতন্ত্র চক্রের সংখ্যাটি খুঁজতে চাই ।Sf:SS<SS

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

কোন পদ্ধতিগুলির আরও ভাল সময় এবং স্থানের কর্মক্ষমতা রয়েছে? আমি প্রয়োজনীয় স্থান পরিমাপের সর্বোত্তম উপায়টিও নিশ্চিত না - যদি f পরিচিতি ফাংশন হয় তবে যে কোনও পদ্ধতি যা সমস্ত চক্রকে সঞ্চয় করে stores Ω(n) স্থান ব্যবহার করবে ।


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

"স্থান পরিমাপের সর্বোত্তম উপায় কোনটি" আমি তা জানি না তার দ্বারা এটি বোঝানো হয়েছিল। সম্ভবত আমার ও (পলি (এন) + y) কে লক্ষ্য করা উচিত যেখানে y আউটপুট, যাতে ব্যবহৃত স্থানটি বহুলোক হয় যতক্ষণ না y যথেষ্ট পরিমাণে ছোট থাকে।
চার্লস

আপনার ফাংশন দেয় কোন ব্যবহারযোগ্য বৈশিষ্ট্য আছে? আপনার পছন্দসই পদ্ধতিতে ইনপুট আকারটি প্রকাশ করার ক্ষেত্রে অ্যালগরিদম বহুত্ববাদী বা তাত্পর্যপূর্ণ কিনা তা ব্যবহারিক উত্তর হ'ল অ্যালগরিদম এস এর কার্ডিনালটির ক্রম অনুসারে সময় এবং স্থান উভয়ই নেবে ।
নিল দে বৌদ্রাপ

@ নিল দে বিউড্রাপ: আমি নিশ্চিত নই যে কোন বৈশিষ্ট্যগুলি কার্যকর হবে। আমি প্রত্যাশা করি যে স্বতন্ত্র চক্রের সংখ্যা কম, যদিও সম্ভবত ; এজন্য আমি কেবল পরিবর্তে এবং এর একটি কার্যকারিতা প্রস্তাব করেছি । আমি প্রয়োজনে আউটপুট বিটের সংখ্যায় স্পেস এক্সপেনসিয়াল ব্যবহার করতে ইচ্ছুক। O(n3)ynn
চার্লস

উত্তর:


7

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

একটি অ্যারে দিয়ে শুরু করুন একটি স্টোরেজ পূর্ণসংখ্যা {0,1,2} - এস এর উপাদান প্রতি এক - শূন্যে শুরু করা; আমরা এই যেমন ইঙ্গিত হবে (unexplored), (partially explored)এবং (fully explored)। শূন্য থেকে একটি চক্র কাউন্টার শুরু করুন। প্রতিটি উপাদান জন্য গুলি  ∈  এস জন্য, নিচের কাজগুলো করুন:

  1. যদি [[ গুলি ] =  (fully explored), step ধাপে যান।
  2. A [ s ] ←  (partially explored)সেট করুন এবং একটি পুনরাবৃত্তিকারীকে j  ←  f (গুলি) সেট করুন
  3. যদিও একটি [ ] =  (unexplored), সেট একটি [ ] ←  (partially explored), এবং সেট  ←  চ (ঞ)
  4. যদি এ [ জে ] =  (partially explored), আমরা একটি নতুন চক্র বন্ধ করে রেখেছি; বর্ধিত গ। ১. (আপনি যদি এই চক্রের কিছু প্রতিনিধি রেকর্ড রাখতে চান তবে j এর বর্তমান মানটি একটি স্বেচ্ছাসেবী পছন্দ হিসাবে করবে; অবশ্যই, এটি আপনার পছন্দসই অধীনে চক্রের ন্যূনতম উপাদান হবে না অর্ডার <।) অন্যথায়, আমাদের কাছে একটি [ জে ] =  (fully explored), যার অর্থ আমরা একটি প্রাক-অন্বেষিত কক্ষপথ আবিষ্কার করেছি যা ইতিমধ্যে গণনা করা চক্রের মধ্যে শেষ হয়; বৃদ্ধি না
  5. S থেকে শুরু হওয়া কক্ষপথটি এখন পুরোপুরি অন্বেষণ করা হয়েছে তা বোঝাতে j  ←  s সেট করুন ।
    যদিও একটি [ ] =  (partially explored), সেট একটি [ ] ←  (fully explored)এবং সেট  ←  চ (ঞ)
  6. পরবর্তী উপাদান s  ∈  S এ এগিয়ে যান ।

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

প্রতিটি উপাদান গুলি  ∈  এস দুইবার কমপক্ষে পরিদর্শন হবে: একবার যখন A -এর মান [ গুলি ] থেকে পরিবর্তিত হয় (unexplored)থেকে (partially explored), এবং পরিবর্তনের জন্য একবার (fully explored)। যে কোনও নোডের পুনরায় পুনর্বিবেচনার পরে মোট কতবার (fully explored)উপরের দিকে আবদ্ধ করা হয়েছে নতুন চক্রগুলি এটির ব্যর্থতা সন্ধানের সংখ্যা দ্বারা সীমাবদ্ধ, যা সর্বাধিক | এস | - এস এর সমস্ত উপাদানগুলির মাধ্যমে প্রধান লুপটি পুনরাবৃত্তি থেকে উদ্ভূত । সুতরাং, আমরা আশা করতে পারি যে এই প্রক্রিয়াটি সর্বাধিক 3 | এস | নোড-ট্র্যাভারসাল, নোডগুলি পরিদর্শন করা বা পুনর্বিবেচিত সমস্ত সময় গণনা করা হচ্ছে counting

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


দুর্দান্ত, এটি আমার মনে যে নিরীহ স্পেস অ্যালগরিদমকে উন্নত করে । আমার আসলে প্রতিনিধিদের দরকার নেই; আমি পরিচয় করিয়েছি কিছু ক্ষেত্রে যদি এটি কিছু অ্যালগরিদমের কাজে লাগে। O(|S|log|S|)<
চার্লস

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

1
আমার কাছে মনে হচ্ছে এটি #L তে থাকা উচিত (ম্যাট্রিক্স পাওয়ারিং ব্যবহার করে)। এটি কি # এল-হার্ড হতে পারে?
কাভেঃ

@ চারেলস: আমার সাম্প্রতিক উত্তরটি দেখুন যা আপনি যদি # সাইকেল | o ( | এস | ) জেনে থাকেন তবে আপনাকে উন্নতি দেবে । এটি পললগ | এস | এর চেয়ে বেশি ব্যবহার করে স্থান, তবে আপনি স্থান এবং সময় বন্ধ বাণিজ্য করতে ইচ্ছুক যদি এটি আপনার জন্য ভাল হতে পারে।
নিল দে বৌদ্রাপ

@ নিল ডি বিউড্রাপ: আপনাকে ধন্যবাদ! উভয়ের জন্য +1। এই অ্যালগরিদম যতক্ষণ না মেমরির সাথে ফিট করে ততক্ষণ সেরা মনে হয়; এটি একবার ছড়িয়ে পড়লে আমি অন্যটি ব্যবহার করে দেখব। (আমি সম্ভবত ক্যাশে সমস্ত কিছু ফিট করতে পারলে অন্যটি ভাল হতে পারে, তবে এটি খুব ঝামেলা হতে পারে))
চার্লস

5

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

[সম্পাদনা করুন] আমার আগের রান-টাইম বিশ্লেষণে আমরা যে নোডগুলি পরিদর্শন করেছি সেগুলি পূর্বের নমুনাযুক্তদের মধ্যে রয়েছে কিনা তা নির্ধারণের গুরুত্বপূর্ণ ব্যয়টি মিস করেছে; এটি সংশোধন করার জন্য এই উত্তরটি কিছুটা সংশোধন করা হয়েছে।

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

উপাদানগুলির একটি খালি তালিকা শুরু করুন complist,। প্রতিটি উপাদান সেই উপাদান থেকে নমুনার সংগ্রহ দ্বারা প্রতিনিধিত্ব করা হয়; আমরা একটি অনুসন্ধান ট্রিও বজায় রাখি samplesযা সেই উপাদানগুলিকে সঞ্চয় করে যা কোনও উপাদান বা অন্যের জন্য নমুনা হিসাবে নির্বাচিত হয়েছে। যাক জি পর্যন্ত পূর্ণসংখ্যার একটি ক্রম হতে এন , যার জন্য সদস্যপদ দক্ষতার কিছু বুলিয়ান সম্পৃক্ত কম্পিউটিং দ্বারা অবধারণীয় হয়; উদাহরণস্বরূপ, 2 অথবা নিখুঁত শক্তি পি কিছু পূর্ণসংখ্যা জন্য ক্ষমতা পি । প্রতিটি এস  ∈  এস এর জন্য নিম্নলিখিতটি করুন:

  1. যদি এসটি থাকে তবে samples# 5 ধাপে যান।
  2. একটি খালি তালিকা cursample, একটি পুনরাবৃত্তি j  ← f ( গুলি ) এবং একটি কাউন্টার টি  ← 1 শুরু করুন।
  3. যখন j থাকে না samples:
    - যদি t  ∈  G হয় , উভয়তে j প্রবেশ করান cursampleএবং samples
    - বৃদ্ধি t এবং সেট j  ←  f (j)
  4. কিনা তা আপনার পরীক্ষা হয় cursample। যদি তা না হয় তবে আমরা একটি পূর্ববর্তী অন্বেষিত উপাদানটির মুখোমুখি হয়েছি: আমরা কোন উপাদানটি জে'র অন্তর্ভুক্ত তা যাচাই করেছি এবং এটির বৃদ্ধি করার cursampleউপযুক্ত উপাদানগুলির সমস্ত উপাদান complistsertোকাতে পারি। অন্যথায়, আমরা বর্তমান কক্ষপথ থেকে একটি উপাদানটির পুনরায় মুখোমুখি হয়েছি যার অর্থ আমরা পূর্ব-আবিষ্কৃত চক্রের কোনও প্রতিনিধির মুখোমুখি না হয়ে কমপক্ষে একবার একবার একটি চক্রকে অতিক্রম করেছি: আমরা cursampleসদ্য সন্ধান করা উপাদান থেকে নমুনাগুলির সংগ্রহ হিসাবে সন্নিবেশ করি complist
  5. পরবর্তী উপাদান s  ∈  S এ এগিয়ে যান ।

জন্য n  = | এস |, এক্স (এন) কে চক্রের প্রত্যাশিত সংখ্যা ( উদাহরণস্বরূপ  এক্স (এন)এন 1/3 ) বর্ণনা করে একঘেয়ে বর্ধমান ফাংশন হতে দিন, এবং Y (n) = y (n)  লগ ( এন ) ∈ Ω ( এক্স (এন)  লগ ( এন )) মেমোরি ব্যবহারের জন্য লক্ষ্য নির্ধারণ করে ( যেমন  y (n)n 1/2 ) একঘেয়ে বর্ধমান ক্রিয়াকলাপ । আমাদের y (n)  ∈ Ω ( X (n) ) প্রয়োজন কারণ প্রতিটি উপাদান থেকে একটি করে নমুনা সঞ্চয় করতে কমপক্ষে X (n)  লগ ( এন ) স্থান লাগবে।

  • একটি কক্ষপথের যত বেশি উপাদান আমরা নমুনা করি, তত দ্রুত আমরা কক্ষপথের শেষে চক্রের কোনও নমুনা দ্রুত নির্বাচন করি এবং ততক্ষণে দ্রুত সেই চক্রটি সনাক্ত করি। অ্যাসিম্পটিক্স দৃষ্টিকোণ থেকে, আমাদের স্মৃতিশক্তির সীমাবদ্ধতার পরে যতটা নমুনা পাওয়া যায় তা বোধগম্য হয়: আমরা পাশাপাশি G কে একটি প্রত্যাশিত y (n) উপাদান রাখতে পারি যা এন এর চেয়ে কম থাকে ।
    - যদি এস এর কক্ষপথের সর্বাধিক দৈর্ঘ্য L হওয়ার আশায় থাকে তবে আমরা G কে L  /  y (n) এর পূর্ণসংখ্যা গুণবান হতে পারি ।
    - যদি কোনও প্রত্যাশিত দৈর্ঘ্য না থাকে, আমরা কেবল প্রতি এন  /  ওয়াই (এন) একবার নমুনা করতে পারিউপাদান; এটি যে কোনও ক্ষেত্রে নমুনার মধ্যবর্তী ব্যবধানগুলিতে একটি উপরের আবদ্ধ।

  • যদি কোনও নতুন উপাদান অনুসন্ধান করার জন্য, আমরা এস এর পূর্ববর্তী উপাদানগুলি সন্ধান করতে শুরু করি যা আমরা পূর্বে পরিদর্শন করেছি (কোনও নতুন উপাদান আবিষ্কার করা হচ্ছে বা পুরানো যার যার টার্মিনাল সাইকেল ইতিমধ্যে পাওয়া গেছে) থেকে এটি কমপক্ষে n  /  y নেবে ( n) পূর্বে নমুনাযুক্ত উপাদানটির পুনরাবৃত্তি; এটি তখন সময়ের সংখ্যার উপরের একটি আবদ্ধ, প্রতিটি নতুন উপাদান অনুসন্ধান করার চেষ্টা করার জন্য, আমরা রিলান্ড্যান্ট নোডগুলি অতিক্রম করি। যেহেতু আমরা করতে এন যেমন প্রচেষ্টা, আমরা তারপর redundantly উপাদান পরিদর্শন করবেন এস সর্বাধিক এন 2  /  Y (ঢ) মোট বার।

  • সদস্যতার জন্য পরীক্ষার জন্য প্রয়োজনীয় কাজ samplesহ'ল ও ( y (n)  লগ  y (n) ), যা আমরা প্রতিটি দর্শনে পুনরাবৃত্তি করি: এই চেকিংয়ের সংযোজনীয় ব্যয় হ'ল ও ( এন 2  লগ  ওয়াই (এন) )। নমুনাগুলি তাদের নিজ নিজ সংগ্রহগুলিতে যুক্ত করার ব্যয়ও রয়েছে, যা সামগ্রিকভাবে হে ( y (n)  লগ  ওয়াই (এন) )। অবশেষে, প্রতিবার যখন আমরা কোনও পূর্ববর্তী আবিষ্কারক উপাদানটির পুনরায় মুখোমুখি হই, তখন আমরা কোন উপাদানটি পুনরায় আবিষ্কার করেছি তা নির্ধারণ করতে আমাদের X (n)  লগ *  y (এন) সময় ব্যয় করতে হবে; যেহেতু এটি n বার পর্যন্ত ঘটতে পারে , জড়িত ক্রমসংক্রান্ত কাজটি n X (n)  লগ  y (n) দ্বারা আবদ্ধ ।

সুতরাং, আমরা যে নোডগুলি পরিদর্শন করি সেগুলি নমুনাগুলির মধ্যে রান-টাইমকে প্রাধান্য দেয় কিনা তা যাচাই করে সংশ্লেষিত কাজ সম্পাদিত: এটির জন্য ও ( এন 2  লগ  ওয়াই (এন) ) ব্যয়। তারপরে আমাদের y (n) যথাসম্ভব ছোট করা উচিত, যা ও ( এক্স (এন) ) বলতে হবে।

সুতরাং, কেউ হে ( এক্স (এন)  লগ ( এন )) স্পেসে ও ( এন 2  লগ  এক্স (এন) ) গ্রহণ করে চক্রের সংখ্যা (যা সেই চক্রগুলির মধ্যে শেষ হওয়া সংখ্যার সমান) en এটি করার সময়, যেখানে এক্স (এন) হ'ল চক্রের প্রত্যাশিত সংখ্যা।


1

ইউনিয়ন সেট ডেটা-কাঠামো ব্যবহার করে আপনি একই উপাদানগুলির একাধিক পাস এড়াতে পারবেন । প্রতিটি উপাদান উপর একটি পাসs সমন্বিত সেট একত্রিত s সেট সহ সেট f(s)। এটি এখনও প্রচুর স্মৃতি ব্যবহার করে।

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