Create fixed length non-repeating permutation of larger set

后端 未结 2 759
走了就别回头了
走了就别回头了 2021-01-22 16:44

I know this topic is much discussed but I can\'t seem to find any implementation that fits my needs.

I have the following set of characters:

a b c

2条回答
  •  -上瘾入骨i
    2021-01-22 17:27

    $strings = get_perm( range('a', 'h'), 4 );
    
    function get_perm( $a, $c, $step = 0, $ch = array(), $result = array() ){
        if( $c == 1 ){ //if we have last symbol in chain
            for( $k = 0; $k < count( $a ); $k++ ){
                if( @in_array( $k, $ch ) ) continue; // if $k exist in array we already have such symbol in string
                $tmp = '';
    
                foreach( $ch as $c ) $tmp .= $a[$c]; // concat chain of previous symbols
                $result[] = $tmp . $a[$k]; // and adding current + saving to our array to return
            }
        }else{
            for( $i = 0; $i < count( $a ); $i++ ){
                if( @in_array( $i, $ch ) ) continue;
                $ch[$step] = $i; // saving current symbol for 2 things: check if that this symbol don't duplicate later and to know what symbols and in what order need to be saved
                get_perm( $a, $c-1, $step+1, $ch, &$result ); 
                // recursion, 
                // decrementing amount of symbols left to create string, 
                // incrementing step to correctly save array or already used symbols, 
                // $ch - array of already used symbols, 
                // &$result - pointer to result array
            }
        }
    
        return $result;
    }
    

    NOTICE

    a-h with 6 symbols = 20k values in array
    a-z with 4 symbols = 358799 values in array
    So a-z with 10 symbols will die for sure =) It will require too much memory.
    You need to try to save output to file or database if you would need big amount of values. Or extend memory limit to php but not sure if this is best way.

提交回复
热议问题