ম্যাচের শুরু এবং শেষ অক্ষরের সাথে শব্দের দীর্ঘতম তালিকা


11

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

আপনাকে 100 টি এলোমেলো ইংরাজির শব্দের একটি ইনপুট দেওয়া হবে। আপনাকে শব্দের দীর্ঘতম স্ট্রিং সন্ধান করতে হবে যেখানে এক শব্দের মধ্যে শেষ বর্ণটি পরের শব্দের প্রথম অক্ষরের সাথে মেলে। আপনি প্রতিটি শব্দ একবার ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, যদি আপনাকে "বিড়াল", "কুকুর", "সেই" শব্দটি দেওয়া হয় তবে আপনি যে দীর্ঘতম স্ট্রিংটি তৈরি করতে পারবেন সেটি হ'ল "বিড়াল -> যে"। যদি আপনাকে "মাউস", "মজ", "ইউনিকর্ন" শব্দটি দেওয়া হয় তবে আপনি যে দীর্ঘতম স্ট্রিংটি তৈরি করতে পারেন তা কেবল একটি শব্দ হবে (যেহেতু এই শব্দগুলির কোনওটিরই লিঙ্ক নেই)। যদি আপনাকে "পাখি", "থালা", "হার্ব" শব্দটি দেওয়া হয় তবে আপনি যে দীর্ঘতম স্ট্রিংটি তৈরি করতে পারবেন সেটি হ'ল "হার্ব -> পাখি -> থালা" (অথবা "থালা -> হার্ব -> পাখি" বা "পাখি -" > থালা -> হার্ব ")।

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

+-------+         \ +------+
|  cat  |-----------| that |
+-------+         / +------+
    |                  |
   \|/                 |
+-------+ /            |
|  the  |--------------+
+-------+ \

এই সমস্যাটি দীর্ঘতম পথ অনুসন্ধান বলে মনে হয় যা এনপি-হার্ড।

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


4
100 টি শব্দের সাথে, আপনি 100 টি পেয়েছেন (কমপক্ষে) 100! = 9.332622e + 157 সংমিশ্রণ। এর সাথে শুভকামনা, আমি মনে করি আপনার বন্ধুটি এটাকে সহজ বলে এই বলে আপনার পা টানছে।
মার্টিন উইকম্যান

1
তবে, সম্ভাব্য সংমিশ্রণের সংখ্যা এর তুলনায় অনেক কম, কারণ গড়ে একটি শব্দ কেবলমাত্র প্রায় 6 বা 7 টি শব্দের সাথে যুক্ত থাকে।
আবে টুল

2
আপনি সঠিক যে এটি ঠিক দীর্ঘতম পথ অনুসন্ধান। আমি মনে করি আপনার বন্ধুটি ভুল। যাইহোক, একটি বিস্তৃত অনুসন্ধান কোড করা কঠিন নয় এবং এটি এত দিন চালিত নাও হতে পারে।
কেভিন cline 4

4
কেবল মজাদার জন্যই, আমি রুবিতে ( জাস্ট . github.com/anonymous/6225361 ) একটি বর্বর বাহিনী পরিপূর্ণ অনুসন্ধান (যেমন @ কেভিনক্লাইন দেখিয়েছি) কোড আপ করেছি । 100 টি শব্দের সাহায্যে এটি কেবল ~ 96 সেকেন্ড নিয়েছে ( জিস্ট . github.com/anonymous/6225364 )। এবং এটি ছিল একটি অত্যন্ত অদক্ষ, অপ-অপ্টিমাইজড, দোভাষী-ভাষা, দ্রুত এবং নোংরা স্ক্রিপ্ট। তাই কেবলমাত্র 100 শব্দ দিয়ে এমনকি ব্রুট ফোর্সের একটি ধীর সংস্করণও প্রচুর পরিমাণে চালিত হয়। আমার কোডটি আসলে একটি অ্যাসাইক্লিক গ্রাফ তৈরি করে না এবং তারপরে অনুসন্ধান করে, এটি প্রতিটি শব্দ থেকে শুরু করে প্রতিটি সম্ভাব্য পথটি পুনরাবৃত্তভাবে তৈরি করে এবং দীর্ঘতমের সন্ধান করে।
বেন লি

3
সমস্যাটি বলে যে এখানে 100 শব্দ রয়েছে। আমি মনে করি এর অর্থ আপনি একটি গতিশীল প্রোগ্রামিং সমাধান প্রয়োগ করতে পারেন, যা আপনি উল্লেখ করছেন নিবন্ধে উল্লেখ করা হয়েছে।
জুলিয়েন গের্টল্ট

উত্তর:


5

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

এখানে আমি কীভাবে এটি মোকাবেলার পরামর্শ দেব:

  1. তালিকার প্রতিটি শব্দের জন্য, সম্ভাব্য সংযোগগুলিতে এবং সংযোগগুলি গণনা করুন।
  2. 0 শব্দ এবং 0 আউট আছে এমন কোনও শব্দ ত্যাগ করুন।
  3. "স্টার্টার শব্দের" একটি প্রাথমিক সেটটি স্বল্প সংখ্যক ইনস এবং আউটসের সাথে চিহ্নিত করুন এবং আউটসুট 0 এর চেয়ে বড় হতে হবে।
  4. প্রতিটি স্টার্টার শব্দের ইনস / আউটস সংযোগ গণনার নিজস্ব কাজের অনুলিপি গ্রহণ করে। এটি শৃঙ্খলার প্রধান গঠন করে।
  5. প্রতিটি শৃঙ্খলার জন্য, "পরবর্তী শব্দগুলির" ভিত্তিতে একটি তালিকা চিহ্নিত করুন:
    • স্টার্টার বা পূর্ববর্তী শব্দের শেষ বর্ণ
    • সর্বনিম্ন ইনস এবং আউটপুট সংযোগগুলির সংখ্যা (আবার, আউটসুট 0 টির চেয়ে বেশি হওয়া উচিত)
  6. প্রত্যেকের জন্য next word, চেইনটি শেষ না হওয়া পর্যন্ত 5 ধাপ পুনরাবৃত্তি করুন।

মনে রেখ যে:

  • আপনাকে চেইনের দৈর্ঘ্যের উপর নজর রাখতে হবে এবং দীর্ঘতম চেইন সনাক্ত করার জন্য কিছু বৈশ্বিক ব্যবস্থা থাকতে হবে।

  • পুনরাবৃত্ত লুপ এড়াতে আপনাকে সংযোগের গণনাগুলির কার্যকরী কপি থেকে প্রতিটি শব্দ অপসারণ করতে হবে।

  • এক পর্যায়ে, আপনার চেইনটি সমাপ্ত হবে এবং আপনাকে 0 সংযোগ আউট গণনা সহ একটি শব্দ নির্বাচন করতে হবে।

  • কাজের তালিকাগুলি থেকে শব্দগুলি সরানো হওয়ায় আপনাকে পুনরায় গণনা করতে হতে পারে al প্রথম নজরে, আমি মনে করি না যে এটি সামগ্রিক সেটগুলি তুলনামূলকভাবে ছোট হওয়ায় এটি প্রয়োজনীয় হবে। আপনি যদি 1000 শব্দগুলিতে মাপসই করে থাকেন তবে স্থির গণনাগুলি রূপান্তরকরণ থেকে অ্যালগরিদমকে ধীর করতে পারে।

আমি এটিকে প্যাকিংয়ের সমস্যা হিসাবে দেখেছি। আমার কাছে, সংযোগগুলি প্যাক করার জন্য আকৃতিটি শনাক্ত করে out সংযোগগুলি যত নীচু হবে তত বেশি আকৃতির আকার। আকৃতিটি যত বেশি বিজোড়, তত তাড়াতাড়ি আমি এটি প্যাক করতে চাই কারণ আমি বুঝতে পারি যে পরে আমি শৃঙ্খলে প্রবেশ করলাম একটি বিজোড় আকারটি প্যাক করতে সক্ষম হওয়ার হ্রাসমান প্রতিক্রিয়া।

উদাহরণ হিসাবে:

{dog, gopher, alpha, cube, elegant, this, that, bart}

dog     0, 1
gopher  1, 0
alpha   0, 0
cube    0, 1
elegant 1, 2
this    3, 0
that    2, 1
bart    0, 2

//alpha is dropped with 0 in and 0 out.
//two candidates found: dog, cube

//chain 1
dog => gopher
//chain 2
cube => elegant => that => this

//Note 1: the following chain won't occur due to selection rules
//that takes priority over this because of output count
cube => elegant => this

//Note 2: this chain won't occur either due to selection rules
bart => that => this

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

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

2
এই জাতীয় শব্দের তালিকা সম্পর্কে কী: "কুকুর, গোফার, বান, নুন, দুপুর, নব"। অ্যালগরিদম ভুলভাবে "কুকুর -> গোফার" হিসাবে দীর্ঘতম তালিকাটি বেছে নেবে, যখন এটি আসলে "বান, নুন, দুপুর, নুব" এর কোনও সংমিশ্রণ।
আবে টুল

1
@ অ্যাবেটুল - ভাল উদাহরণ। আমি তখন "সর্বনিম্ন ইনপুট> = 1" এবং "সর্বনিম্ন আউটপুট> = 1" সংমিশ্রণের জন্য অন্য পুনরাবৃত্তি (বা দুটি) যুক্ত করব।

2
আমি মনে করি না যে এটি সব ক্ষেত্রেই সমস্যার সমাধান করবে। আমি মনে করি এটি একটি "স্থানীয় সর্বোচ্চ" ধরণের সমাধানের মধ্যে পড়ে।
অ্যাবে সরঞ্জাম

3

আপনি যদি প্রতিটি বর্ণমালা এবং প্রান্তে শব্দের হিসাবে ভার্টেক্সের নির্দেশিত গ্রাফ উপস্থাপন করতে 26X26 ম্যাট্রিক্স তৈরি করেন। উদাহরণস্বরূপ শব্দ - অ্যাপলটি এ থেকে ই নির্দেশিত প্রান্তের সাথে শীর্ষটি A এবং E কে সংযুক্ত করে Now ও (ই) অ্যালগরিদমের একটি হ'ল এলোমেলোভাবে এক জোড়া উল্লম্ব থেকে শুরু করা। তাদের মধ্যে একটি পথ সন্ধান করুন। যতক্ষণ সম্ভব এটি সম্ভব না হওয়া পর্যন্ত পথটি শিথিল করুন।

আপডেট @ গ্লেনএইচ www. আমি সম্প্রতি www.hackerearth / jda তে একই প্রশ্নটি সমাধান করেছি, সেরা সমাধানের ক্ষেত্রে তুলনামূলক চিহ্ন ছিল এবং আমি নীচের অনুমোদনের সাথে সর্বোচ্চ নম্বর পেয়েছি-

শব্দের তালিকা দেওয়া। তাদের দ্বারা গঠিত হতে পারে এমন দীর্ঘতম চেইনটি সন্ধান করুন। প্রতিটি শব্দের সাথে শেষ শব্দের শেষে * শেষ হওয়া অক্ষর দিয়ে শুরু হয় তবে একটি শৃঙ্খলা বৈধ।

অ্যাপ্রোচ =

1) বর্ণমালার গ্রাফটি শীর্ষ এবং শব্দের প্রান্ত হিসাবে তৈরি করুন। একাধিক প্রান্ত ব্যবহারের পরিবর্তে প্রান্তের সংখ্যার সমান ওজন সহ একটি ব্যবহার করুন।

2) সর্বোচ্চ প্রান্ত সহ গ্রাফের দৃ graph়ভাবে সংযুক্ত উপাদানটি সন্ধান করুন। অস্থায়ীভাবে অন্যান্য প্রান্তগুলি বাতিল করুন।

3) প্রতিটি শীর্ষবিন্দুটির জন্য এর অনগ্রসরকে তার বহির্মুখের সমান করুন।

৪) এখন গ্রাফে তাদের বিদ্যমান ইউলিরিয়ান সার্কিট। খুজেন.

5) এখন বাকি গ্রাফের মধ্যে (আর্ট অরিগনাল গ্রাফটি নির্বাচিত দৃ connected়ভাবে সংযুক্ত উপাদানগুলির মধ্যে প্রথম ভার্টেক্সের সাথে দীর্ঘতম ট্রেইলটি খুঁজে পান I আমি মনে করি এটি এনপি হার্ড।

)) এলিরিয়ান সার্কিটকে ইউররিয়ান সার্কিটকে ট্রেনে রূপান্তর করতে উপরের ট্রেইলটি অন্তর্ভুক্ত করুন।

কেন - আমি গ্রহণ করি যে এই প্রশ্নটি সম্ভবত এনপি হার্ড (অনুমান, গণিতের সাথে কথা বলছেন না)। উপরোক্ত পদ্ধতিটি কার্যকরভাবে কার্যকর হয় যখন অভিন্ন বিতরণকৃত শব্দের দীর্ঘ তালিকা (1000+) থাকে (যেমন উপরের পদ্ধতির জন্য ডাব্লিউসি হওয়ার উদ্দেশ্যে নয়)। আসুন ধরে নেওয়া যাক প্রদত্ত তালিকাটিকে উপরে বর্ণিত গ্রাফে রূপান্তরিত করার পরে এটি ভাগ্যক্রমে একটি ইউরিরিয়ান গ্রাফ হিসাবে পরিণত হয়েছে ( শর্তাবলীর জন্য http://en.wikedia.org/wiki/Eulerian_path দেখুন ), তবে কোনও সন্দেহ ছাড়াই আমরা উত্তরটি বলতে পারি উপরের প্রশ্নের পি হ'ল আসলে গ্রাফের ইউুলেরিয়ান পাথ (এটি করার জন্য খুব সাধারণ পদ্ধতির জন্য http://www.graph-magics.com/articles/euler.php দেখুন এবং আপনার গ্রাফটি আছে কিনা তা যাচাই করতে এটি দেখুন একক http://www.geeksforgeeks.org/ স্ট্রংলি- সংযুক্ত- কম্পোনেন্টস /এবং যদি অস্থায়ীভাবে অন্যান্য ছোট স্ক্যাকগুলি পরিষ্কার না করে কারণ একক স্ক্যাকের জন্য ইউলিরিয়ান পাথ বিদ্যমান)। সুতরাং ভাগ্যবান নয় মামলার ক্ষেত্রে (যা প্রায় সব ক্ষেত্রেই ঘটে) আমি তাদের ভাগ্যবান কেসে রূপান্তরিত করার চেষ্টা করি (অর্থাত্ ইউুলেরিয়ান ট্রেইল শর্তটি সম্পন্ন হয়)। কিভাবে এই কাজ করতে? আমি অপ্রাসঙ্গিক প্রান্তগুলির জন্য অনুসন্ধানের প্রবণতা বাড়ানোর চেষ্টা করেছি (অনিগ্রহের চেয়ে প্রান্তিকের চেয়ে প্রান্তভাগের সাথে শীর্ষস্থান থেকে সূচিত পথের প্রান্তের সেট এবং প্রান্তিকের চেয়ে আরও বড় অঙ্কের সমান্তরকে শেষ হওয়া) tried গভীরতার অনুসন্ধান বৃদ্ধি করার অর্থ হ'ল প্রথমে আমি পথের দুটি প্রান্তের চেয়ে পথের এমন এক প্রান্তের সমস্ত সেট অনুসন্ধান করেছি। এটি প্রথম চেহারাতে মনে হতে পারে যে ith গভীরতার অনুসন্ধানে ও (নোডগুলি) i) এভাবে ও এর মোট সময় জটিলতা (নোড + নোডস ^ 2 + নোডস ^ 3 + ....) লাগবে যতক্ষণ না এটি ভাগ্যবান কেস হয়। তবে অ্যামোরিটাইজড বিশ্লেষণটি এটিকে ও (প্রান্তগুলি) উপভোগ করবে। এটি একবারে কমে গেলে ভাগ্যবান কেসটি ইউলেরিয়ান সার্কিটটি সন্ধান করুন।

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


@ গ্লেনএইচ www. আমি সম্প্রতি www.haakerreth / jda তে একটি অনুরূপ প্রশ্নটি সমাধান করেছি, সেরা সমাধানের ক্ষেত্রে তুলনামূলক চিহ্ন ছিল এবং আমি নিম্নলিখিত অনুমোদনের সাথে সর্বোচ্চ নম্বর পেয়েছি
বিশ্বফ্রেন্ডস

0

ধারণা:

প্রথমে দুটি মানচিত্র (হ্যাশ) তৈরি করুন, এস, এবং E বলুন, বর্ণমালা থেকে শুরু করে শব্দের জন্য; প্রথম, এস, শব্দের সাথে শুরু হওয়া অক্ষরগুলির মানচিত্র, দ্বিতীয়, ই শেষ বর্ণ সহ একই কাজ করে।

উদাহরণস্বরূপ, অভিধানটি যদি তৈরি হয়:

পাখি, থালা, কুকুর, হার্ব

আমাদের আছে:

S:

a -> [ ]
b -> [ bird ]
c -> [ ]
d -> [ dish, dog ]
...
h -> [ harb ]
...

এবং,

E:

a -> [ ]
b -> [ harb ]
c -> [ ]
d -> [ bird ]
...
g -> [ dog ]
h -> [ dish ]
...

এরপরে, দ্রুত অনুসন্ধানের জন্য এস এবং ই ব্যবহার করে, অভিধানের মতো একই আকারের একটি বন (গাছের সেট) তৈরি করুন, প্রতিটি শব্দের শিকড় সহ এবং কোনও গাছকে একবারে একাধিকবার প্রদর্শিত না হওয়ার জন্য - ক্যাশে করুন গাছগুলি তৈরি করার সময় গভীরতা:

bird (depth: 2)
   dish
      harb
   dog

dish (depth: 3)
   harb
      bird
         dog

dog (depth: 0)

harb (depth: 2)
   bird
      dish
      dog

অবশেষে, বনভূমিতে পুনরাবৃত্তি করুন এবং সর্বাধিক গভীরতার গাছ (গুলি) সন্ধান করুন।

সমাধান (গুলি) সেই গাছগুলির বংশধর অক্ষের উপর থাকবে।

যেমন,

dish / harb / bird / dog

উপরে।

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