একটি নির্দিষ্ট শব্দ দুটি অন্যান্য শব্দ মধ্যে আসে কিনা নির্ধারণ করুন?

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

যদি আমি কোনও ইনপুট শব্দটি নিতে চাই, তবে "কলা" বলুন, কোন শব্দের সেটটি নির্ধারণ করা উচিত তা নির্ধারণের একটি ভাল (এবং দক্ষ) উপায় কী? দ্রষ্টব্য: এই শব্দটি "কলা" শব্দটি ইতিমধ্যে একটি সেটের মধ্যে বিদ্যমান কিনা তা নিয়ে প্রশ্ন নয়, বরং শব্দটি কী থাকা উচিত তা নির্ধারণ করার প্রশ্নে একটি প্রশ্ন।

কেউ যদি জানেন যে একটি অ্যালগরিদম আছে, মহান। তারা জাভা কিছু সংস্করণ প্রদান করতে পারেন, এমনকি ভাল!

সম্পাদন: এছাড়াও নির্দেশ করা উচিত, আমার উদাহরণ শুধুমাত্র 2 সেট আছে, আমি আলগোরিদিম এন সেট সঙ্গে কাজ করতে চান।

2
@ গারেটহাল - না, বর্ণানুক্রমিক ক্রমের উপর ভিত্তি করে।
যোগ লেখক Rsaesha, উৎস
@birryree - হ্যাঁ, তরমুজ সবসময় শেষ শব্দ। যাইহোক, আমি সরলতা জন্য শুধুমাত্র 2 সেট আছে। আমি সেট এন সংখ্যা জন্য একটি অ্যালগরিদম জানতে চান।
যোগ লেখক Rsaesha, উৎস
আপনার উদাহরণে, "melon" (বা যা শব্দ) সর্বদা প্রথম সেটের শেষ আইটেম? যদি তাই হয়, এটি প্রথম সেটের শেষ আইটেম (যা আপনার ক্ষেত্রে "melon" ) এর আগে আসে w শব্দটি চেক করার মতোই সহজ। আপনি সাজানো ক্রম অর্থ অনুমান। জেনারালাইজড আউট, আপনি প্রতিটি সেট সেটের শেষ আইটেমের আগে আসে কিনা তা যাচাই করতে এবং প্রথমে এটি প্রথম আইটেমটির আগে বা পরে কিনা তা নির্ধারণ করতে হবে। এটি আগে আসে না, এটা সেট যে অন্তর্গত।
যোগ লেখক wkl, উৎস
কি উপর ভিত্তি করে বিদ্যমান থাকা উচিত? বিভাগ?
যোগ লেখক Garrett Hall, উৎস

6 উত্তর

ধরুন আপনার n সেট আছে। সাজানো ক্রমের "পার্টিশন" শব্দগুলির একটি তালিকা তৈরি করুন।

তারপরে সেটটি সহজেই:

List partitions = Arrays.asList("melon", "strawberry");
int setIndex = -(Collections.binarySearch(partitions, "banana")) - 1;

এটি কাজ করে কারণ সংগ্রহ। বাইনারি অনুসন্ধান সন্নিবেশ অবস্থানটি (-1) ফেরত দেয় যদি এটি তালিকায় কীটি খুঁজে না পায়। এটি পার্টিশন শব্দগুলির সাথে সংঘর্ষের সাথে সংঘটিত হতে পারে তবে ফলাফলটি নেতিবাচক কিনা তা প্রথমে যাচাই করা উচিত।

সম্পাদন করা

I সম্পাদন করাed to remove the requirement for the "book-end" values ("aardvark" and "zebra") as they actually only complicated things.

2
যোগ

দুটি সেটের জন্য:

যদি শব্দ আপনার শব্দ হয় (উদাঃ "banana" ):

int cmp = word.compareTo("melon");
if (cmp < 0) {
 //it belongs to the first set
} else if (cmp > 0) {
 //it belongs to the second set
} else {
 //the word is "melon"
}

n সেট করার জন্য:

Place the dividing words into an ArrayList (call it dividers) in alphabetical order:

ArrayList dividers = new ArrayList();
//... populate `dividers` ...
Collections.sort(dividers);

এখন আপনি শব্দটি কোন সেটটির সাথে সেট করে তা নির্ধারণ করতে Collections.binarySearch() ব্যবহার করতে পারেন:

int pos = Collections.binarySearch(dividers, word);
if (pos >= 0) {
 //the word is the divider between sets `pos` and `pos+1`
} else {
  int num = -(pos + 1);
 //the word belong to set number `num`
}

(এখানে, সেট শূন্য থেকে গণনা করা হয়।)

2
যোগ
ঠিক আছে, কিন্তু ২ টি সেট থাকলে কি হবে? দুঃখিত, আসল প্রশ্নের সাথে যুক্ত করতে ভুলে গেছি। আমি কেবল সরলতা জন্য 2 সেট ব্যবহৃত, কিন্তু আমার প্রকৃত প্রোগ্রাম অনেক সেট আছে, বর্ণানুক্রমিকভাবে সাজানো সব। সুতরাং উদাহরণস্বরূপ: আড়্ভারভার্ক - আপেল, আপেল - কলা, কলা - অপরাধ, অপরাধ - কুকুর, ... ইত্যাদি
যোগ লেখক Rsaesha, উৎস
@birryree - যদি সেটটির শেষ শব্দটির সমান হয়, তবে সেটিকে সেট করে উভয় সেট এবং (যদি এটি বিদ্যমান থাকে) ফেরত দেওয়া উচিত।
যোগ লেখক Rsaesha, উৎস
@ রাশেশঃ - শব্দটি সেটের শেষ শব্দটির সমান হলে কী হবে?
যোগ লেখক wkl, উৎস
String mid = firstList.get(firstList.size()-1);
assert(mid.equals(secondList.get(0)));
if(newString.compareTo(mid) < 0)//belongs in first
else//belongs in second.

স্পষ্টতই, আপনি কীভাবে সেগুলি ধারণ করছেন তার উপর নির্ভর করে আপনাকে কিছু পদ্ধতির কলগুলি মানিয়ে নিতে হবে।

0
যোগ
    final int n = 99;//whatever

    final SortedSet[] allMySets = new SortedSet[ n ];

   //put your sets into allMySets, no particular order required.

    final String searchWord = "banana";

    int i;

    for ( i = 0; i < allMySets.length; i++ ) {

        final SortedSet< String > ss = allMySets[i];

        if ( searchWord.compareTo( ss.first() ) >= 0 && searchWord.compareTo( ss.last() ) <= 0 ) {
            System.out.println("Word " + searchWord + " belongs to set #" + i);
            break;
        }

    }

    if ( i == allMySets.length ) {
        System.out.println("No matching set found.");
       //Maybe handle border case here...
    }
0
যোগ

তালিকাগুলি সংরক্ষণ করার জন্য আপনি যদি বাইনারি হিপ ব্যবহার করেন তবে কোন শব্দ সন্নিবেশ করা হবে তা নির্ধারণ করে O লগ এন)

0
যোগ

শুধু প্রথম অক্ষরটি দেখুন এবং এটি (সেট 1 এর প্রথম অক্ষর) এবং (সেট 1 এর শেষ উপাদানটির প্রথম অক্ষর) মধ্যে কিনা তা দেখুন। যদি এটি প্রথম অক্ষর উভয়ের সমান হয় তবে দ্বিতীয় অক্ষরে যান। যদি সেট সেট পরবর্তী সেট সেট না। এটি BigO (n * m), যেখানে n সেট সংখ্যা এবং এমটি আপনার ইনপুট শব্দে অক্ষরের সংখ্যা। আইএমও খুব খারাপ না।

0
যোগ