Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fajohann

Algoritmo de combinação ineficiente

Recommended Posts

Olá, estou trabalhando em um algoritmo aonde tenho 4 arrays já definidos sendo que um é o pai e cada elemento dos outros arrays será um filho de cada elemento do pai como no exemplo abaixo:

function getAllCombinationsArray(){
		$return = array();
		
		$father = array( 1=>'cat1', 2=>'cat2', 3=>'cat3' );
		$child_1 = array( 1=>'sub_cat1', 2=>'sub_cat2', 3=>'sub_cat3' );
		$child_2 = array( 1=>'sub_sub_cat1', 2=>'sub_sub_cat2', 3=>'sub_sub_cat3' );
	        //$child_n = array(...); 
		foreach($father as $fk => $fv){
			foreach($child_1 as $ck => $cv){
				$cid = $fk.'_'.$ck;
				$cname = $fv.' -> '.$cv;
				foreach($child_2 as $ck2 => $cv2){
					$id = $cid.'_'.$ck2;
					$name = $cname.' -> '.$cv2;
					$return[$id] = $name;
                                        /*foreach($child_n as $nk => $nv){
                                               //Outros filhos
                                        */
				}
			}
		}
		return $return;			
}

print_r(getAllCombinationsArray());

A saída desta função é a seguinte:

Array
(
    [1_1_1] => cat1 -> sub_cat1 -> sub_sub_cat1
    [1_1_2] => cat1 -> sub_cat1 -> sub_sub_cat2
    [1_1_3] => cat1 -> sub_cat1 -> sub_sub_cat3
    [1_2_1] => cat1 -> sub_cat2 -> sub_sub_cat1
    [1_2_2] => cat1 -> sub_cat2 -> sub_sub_cat2
    [1_2_3] => cat1 -> sub_cat2 -> sub_sub_cat3
    [1_3_1] => cat1 -> sub_cat3 -> sub_sub_cat1
    [1_3_2] => cat1 -> sub_cat3 -> sub_sub_cat2
    [1_3_3] => cat1 -> sub_cat3 -> sub_sub_cat3
    [2_1_1] => cat2 -> sub_cat1 -> sub_sub_cat1
    [2_1_2] => cat2 -> sub_cat1 -> sub_sub_cat2
    [2_1_3] => cat2 -> sub_cat1 -> sub_sub_cat3
    [2_2_1] => cat2 -> sub_cat2 -> sub_sub_cat1
    [2_2_2] => cat2 -> sub_cat2 -> sub_sub_cat2
    [2_2_3] => cat2 -> sub_cat2 -> sub_sub_cat3
    [2_3_1] => cat2 -> sub_cat3 -> sub_sub_cat1
    [2_3_2] => cat2 -> sub_cat3 -> sub_sub_cat2
    [2_3_3] => cat2 -> sub_cat3 -> sub_sub_cat3
    [3_1_1] => cat3 -> sub_cat1 -> sub_sub_cat1
    [3_1_2] => cat3 -> sub_cat1 -> sub_sub_cat2
    [3_1_3] => cat3 -> sub_cat1 -> sub_sub_cat3
    [3_2_1] => cat3 -> sub_cat2 -> sub_sub_cat1
    [3_2_2] => cat3 -> sub_cat2 -> sub_sub_cat2
    [3_2_3] => cat3 -> sub_cat2 -> sub_sub_cat3
    [3_3_1] => cat3 -> sub_cat3 -> sub_sub_cat1
    [3_3_2] => cat3 -> sub_cat3 -> sub_sub_cat2
    [3_3_3] => cat3 -> sub_cat3 -> sub_sub_cat3
)

A questão é que este algoritmo é muito ineficiente, uma vez que fiz um teste utilizando os seguintes valores para os arrays:

count($root) = 3
count($child_1) = 1
count($child_2) = 36
count($child_3) = 21
count($child_4) = 2

Total de combinações = 3*1*36*21*2 = 4536

Demorou mais de 5 minutos para gerar o array com as combinações. Preciso de uma solução mais eficiente. Se alguém puder me dar uma luz, agradeço pois já estou a algum tempo quebrando a cabeça.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,

 

Também estou meio sem tempo para analisar seu código mas o que posso dizer é que quando você quiser trabalhar com Arrays , use a SPL(Standard PHP Library ) do PHP . Você faz miséria com essas classes.

 

Exemplo de algumas:

ArrayIterator

FilterIterator

LimitIterator

ArrayObject

 

Tem outras classes que trabalham com array mas essas são as que mais uso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu jovem, por que não montas um array associativo ?

Onde o próprio array vai conter a hierarquia?

array(
'cat1'=> array(
            'subcat11','subcat12','sub13'=> array('outro cat')
          )
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.