কে-সংমিশ্রণের দ্রুত সূচীকরণ


12

আমি একটি পুরাতন সমস্যা যা আমি কিছুক্ষণ আগে কাজ করেছিলাম পুনর্বিবেচনা করছি।

একটি সাধারণ দৃশ্যটি হ'ল "3 বিটগুলি 8 বিটের পূর্ণসংখ্যার মধ্যে সেট করা হয়", অর্থাৎ 00000111।

3 সেট বিট সহ সমস্ত অনন্য সংমিশ্রণগুলি খুব সহজে নেস্টেড লুপ দ্বারা তৈরি করা যায় (ক্রমে)। আমি যে বিষয়ে আগ্রহী তা হ'ল ম্যাপিং সূচক <-> সংমিশ্রণ, অর্থাৎ "00001011" দ্বিতীয় সংমিশ্রণ (বা শূন্য-ভিত্তিক সূচকে "1" এর মান) হবে।

এখনও অবধি, আমি সমস্ত সংমিশ্রণে দৌড়েছি এবং এগুলি একটি টেবিলের মধ্যে সঞ্চিত করেছি, লুপ আপ ইনডেক্স -> কথোপকথনকে ও (1) ক্রিয়াকলাপ তৈরি করে। দ্বিখণ্ডিত অনুসন্ধানের সাথে অন্য দিকটি হ'ল O (ln (n))।

নেতিবাচক দিকটি হ'ল এটি স্পষ্টতই মেমরির উপরে ভারী যদি আমরা ডোমেনটি বাড়িয়ে থাকি যেখানে এটি সম্ভব হয় না।

কোনও নির্দিষ্ট সংমিশ্রনের জন্য n.th সংমিশ্রণ বা সূচক গণনা করার সহজ উপায় কী হবে? সংযুক্তির ক্রমটি দুর্দান্ত হবে তবে এটি বাধ্যতামূলক নয়।



@ মিশেলটি আপনার লিঙ্কগুলি প্রশ্নটিকে লক্ষ্য করে না - সংমিশ্রণগুলির মাধ্যমে পুনরাবৃত্তি করা সমস্যা নয়। এটি সূচক এবং সংমিশ্রণের মানচিত্র সম্পর্কিত about "11001000" প্রদত্ত, সূচকটি কী (বা যদি আপনি গণনা গণনা করেন) কি? 1673 সূচকের কী কোড?
ইকো

1
আহ, সেক্ষেত্রে আপনি ওআইএসআইএসকে দরকারী মনে হতে পারেন। উদাহরণস্বরূপ, অনুক্রম 3,5,6,9,10,12,17,18 আমাদের দুটি দুটি স্বতন্ত্র শক্তির যোগফল দেয় যা গাণিতিক জারগনে "দুটি বিট অন" বলার আরেকটি উপায়। সেখানকার বিভিন্ন সূত্রগুলি নবম মানের গণনা করার বিভিন্ন উপায় দেখায়।

1
8-বিট পূর্ণসংখ্যার কোনও বিট প্যাটারের কেবল 256 টি সংমিশ্রণ রয়েছে যা সংরক্ষণের জন্য তুচ্ছ (এবং কোনও চালাক কোডের চেয়ে কম স্থান গ্রহণ করবে)। আপনার লক্ষ্য / আনুমানিক বিট গণনাগুলি কী কী?
9-10

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

উত্তর:


4

N-th সংমিশ্রণ উত্পন্ন করার জন্য তাকে "আনরঙ্কিং" অ্যালগরিদম বলা হয়। নোট করুন যে ক্রমবিন্যাস এবং সংমিশ্রণগুলি প্রায়শই সমস্যার প্যারামিটারাইজড হওয়ার সাথে সমান হতে পারে। সমস্যাটি কী তা সঠিকভাবে না জেনে, সঠিক সঠিক পদ্ধতির সুপারিশ করা কঠিন, এবং বাস্তবে, বেশিরভাগ সংমিশ্রণ সমস্যার জন্য সাধারণত বেশ কয়েকটি পৃথক র‌্যাঙ্কিং / আনরেঙ্কিং অ্যালগোরিদম সম্ভব হয়।

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

/** PKSUL : permutation given its rank, the slots and the total number of items
 *  A combinatorial ranking is number of the permutation when sorted in lexicographical order
 *  Example:  given the set { 1, 2, 3, 4 } the ctItems is 4, if the slot count is 3 we have:
 *     1: 123    7: 213   13: 312   19: 412
 *     2: 124    8: 214   14: 314   20: 413
 *     3: 132    9: 231   15: 321   21: 421
 *     4: 134   10: 234   16: 324   22: 423
 *     5: 142   11: 241   17: 341   23: 431
 *     6: 143   12: 243   18: 342   24: 432
 *  From this we can see that the rank of { 2, 4, 1 } is 11, for example. To unrank the value of 11:
 *       unrank( 11 ) = { 11 % (slots - digit_place)!, unrank( remainder ) }
 * @param rank           the one-based rank of the permutation
 * @param ctItems        the total number of items in the set
 * @param ctSlots        the number of slots into which the permuations are generated
 * @param zOneBased      whether the permutation array is one-based or zero-based
 * @return               zero- or one-based array containing the permutation out of the set { ctItems, 1,...,ctItems }
 */
public static int[] pksul( final int rank, final int ctItems, final int ctSlots, boolean zOneBased ){
    if( ctSlots <= 0 || ctItems <= 0 || rank <= 0 ) return null;
    long iFactorial = factorial_long( ctItems - 1 ) / factorial_long( ctItems - ctSlots );
    int lenPermutation = zOneBased ? ctSlots + 1 : ctSlots;
    int[] permutation = new int[ lenPermutation ];
    int[] listItemsRemaining = new int[ ctItems + 1 ];
    for( int xItem = 1; xItem <= ctItems; xItem++ ) listItemsRemaining[xItem] = xItem; 
    int iRemainder = rank - 1;
    int xSlot = 1;
    while( true ){
        int iOrder = (int)( iRemainder / iFactorial ) + 1;
        iRemainder = (int)( iRemainder % iFactorial );
        int iPlaceValue = listItemsRemaining[ iOrder ];
        if( zOneBased ){
            permutation[xSlot] = iPlaceValue;
        } else {
            permutation[xSlot - 1] = iPlaceValue;
        }
        for( int xItem = iOrder; xItem < ctItems; xItem++ ) listItemsRemaining[xItem] = listItemsRemaining[xItem + 1]; // shift remaining items to the left
        if( xSlot == ctSlots ) break;
        iFactorial /= ( ctItems - xSlot );
        xSlot++;
    }
    if( zOneBased ) permutation[0] = ctSlots;
    return permutation;
}

এটি আনমিঙ্কিং ক্রমিটেশন, তবে উপরে উল্লিখিত হিসাবে, অনেক ক্ষেত্রে আপনি আনরঙ্কিংয়ের সংমিশ্রণটিকে সমমানের ক্রিয়াকলাপ সমস্যায় রূপান্তর করতে পারেন।

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