| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse capítulo descreve funções para criar e manipular multiconjuntos. Um multiconjunto c é representado por um vetor estático de k inteiros no intervalo de 0 a n-1, onde cada valor c_i pode ocorrer mais de uma vez. O multiconjunto c corresponde a índices de k elementos escolhidos a partir de um vetor de n elementos com substituições. Em termos matemáticos, n é a cardinalidade do multiconjunto enquanto k é multiplicidade máxima de qualquer valor. Multiconjuntos são úteis, por exemplo, quando iteragindo sobre os índices de um tensor simétrico de k-ésima ordem no espaço de dimensão n.
As funções descritas nesse capítulo são definidas no arquivo de cabeçalho ‘gsl_multiset.h’.
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Um multiconjunto é definido por uma estrutura contendo três componentes, os
valores de n e k, e um apontador para o vetor estático contendo os elementos do multiconjunto.
Os elementos do vetor estático do multiconjunto são todos do tipo size_t, e
são armazenados em ordem crescente. A estrutura gsl_multiset
assemelha-se ao que segue,
typedef struct
{
size_t n;
size_t k;
size_t *data;
} gsl_multiset;
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função aloca memória para um novo multiconjunto com parâmetros n,
k. O multiconjunto não é inicializado e seus elementos são indefinidos. Use
a função gsl_multiset_calloc se você deseja criar um multiconjunto que
é inicializado para o primeiro multiconjunto elemento da ordem lexicográfica. Um apontador nulo
é retornado se não hover memória suficiente para criar o multiconjunto.
Essa função aloca memória para um novo multiconjunto com parâmetros n, k e inicializa o conteúdo dessa memória para o primeiro multiconjunto elemento da ordem lexicográfica. Um apontador nulo é retornado se não houver memória suficiente para criar o multiconjunto.
Essa função inicializa o multiconjunto c para o primeiro multiconjunto elementos da ordem lexicográfica, i.e. 0 repetido k vezes.
Essa função inicializa o multiconjunto c para o último multiconjunto elemento da ordem lexicográfica, i.e. n-1 repetido k vezes.
Essa função libera toda a memória usada pelo multiconjunto c.
Essa função copia os elementos do multiconjunto src para o multiconjunto dest. Os dois multiconjuntos devem ter o mesmo tamanho.
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
A seguinte função pode ser usada para acessar os elementos de um multiconjunto.
Essa função retorna o valor do i-ésimo elemento do
multiconjunto c. Se i cair fora do intervalo permitido de 0 a
k-1 então o menipulador de erro é chamado e 0 é retornado. Uma versão modificada dessa função é usada quando HAVE_INLINE for definida.
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função retorna o intervalo (n) do multiconjunto c.
Essa função retorna o número de elementos (k) no multiconjunto c.
Essa função retorna um apontador para o vetor estático de elementos no multiconjunto c.
Essa função verifica se o multiconjunto c é válido. Os k elementos devem estar no intervalo de 0 a n-1, com cada valor ocorrendo ordem não decrescente.
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função avança o multiconjunto c para o multiconjunto elemento seguinte na
ordem lexicográfica e retorna GSL_SUCCESS. Se não houverem elementos multiconjuntos
adicionais disponíveis a gsl_multiset_next retorna GSL_FAILURE e o multiconjunto elemento c
permanece inalterado. Iniciando com o primeiro multiconjunto e repetidamente aplicando essa
função irá ocorrer iteração através de todos os possíveis multiconjuntos de uma ordem fornecida.
Essa função retorna o multiconjunto c para o multiconjunto elemento
anterior na ordem lexicográfica, retornando GSL_SUCCESS. Se não
nenhum multiconjunto anterior disponível a gsl_multiset_prev retorna GSL_FAILURE e o multiconjunto elemento c
permanece inalterado.
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
A biblioteca fornece funções para leitura e escrita de multiconjuntos para um arquivo tanto no formato binário quanto em texto formatado.
Essa função escreve os elementos do multiconjunto c para o
fluxo stream em formato binário. A função retorna
GSL_EFAILED se houver um problema na escrita para o arquivo. Uma vez que os
dados são escritos no formato binário nativo pode não ser portável
entre diferentes arquiteturas.
Essa função lê elementos a partir de fluxo aberto stream para o
multiconjunto c em formato binário. O multiconjunto c deve ser
pré-alocado com valores corretos de n e k uma vez que a
função utiliza o tamanho de c para determinar quantos bytes devem ser lidos.
A função retorna GSL_EFAILED se houver um problema de leitura
a partir do arquivo. Os dados são assumidos terem sido escritos no formato
binário nativo sobre a mesma arquitetura.
Essa função escreve os elementos do multiconjunto c
uma linha de cada vez para o fluxo stream usando o especificados de formato
format, que deve ser adequado para o tipo size_t.
No ISO C99 o modificador de tipo z representa size_t, de forma que
"%zu\n" é um formato adequado.(31) A função retorna
GSL_EFAILED se houver um problema de escrita para o arquivo.
Essa função lê dados formatados a partir do fluxo stream para o
multiconjunto c. O multiconjunto c deve ser pré-alocado com
valores corretos de n e k uma vez que a função usa o tamanho de c para
determinar quantos números devem ser lidos. A função retorna
GSL_EFAILED se houver um problema de leitura a partir do arquivo.
| [ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O programa exemplo abaixo imprime todos os multiconjuntos elementos contendo os valores {0,1,2,3} ordenados por tamanho. Elementos de multiconjuntos de mesmo tamanho são ordenados lexicograficamente.
#include <stdio.h>
#include <gsl/gsl_multiset.h>
int
main (void)
{
gsl_multiset * c;
size_t i;
printf ("All multisets of {0,1,2,3} by size:\n") ;
for (i = 0; i <= 4; i++)
{
c = gsl_multiset_calloc (4, i);
do
{
printf ("{");
gsl_multiset_fprintf (stdout, c, " %u");
printf (" }\n");
}
while (gsl_multiset_next (c) == GSL_SUCCESS);
gsl_multiset_free (c);
}
return 0;
}
Aqui está a saída do programa,
$ ./a.out
all multisets of {0,1,2,3} by size:
{ }
{ 0 }
{ 1 }
{ 2 }
{ 3 }
{ 0 0 }
{ 0 1 }
{ 0 2 }
{ 0 3 }
{ 1 1 }
{ 1 2 }
{ 1 3 }
{ 2 2 }
{ 2 3 }
{ 3 3 }
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 3 3 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 3 3 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 3 3 }
{ 3 3 3 }
{ 0 0 0 0 }
{ 0 0 0 1 }
{ 0 0 0 2 }
{ 0 0 0 3 }
{ 0 0 1 1 }
{ 0 0 1 2 }
{ 0 0 1 3 }
{ 0 0 2 2 }
{ 0 0 2 3 }
{ 0 0 3 3 }
{ 0 1 1 1 }
{ 0 1 1 2 }
{ 0 1 1 3 }
{ 0 1 2 2 }
{ 0 1 2 3 }
{ 0 1 3 3 }
{ 0 2 2 2 }
{ 0 2 2 3 }
{ 0 2 3 3 }
{ 0 3 3 3 }
{ 1 1 1 1 }
{ 1 1 1 2 }
{ 1 1 1 3 }
{ 1 1 2 2 }
{ 1 1 2 3 }
{ 1 1 3 3 }
{ 1 2 2 2 }
{ 1 2 2 3 }
{ 1 2 3 3 }
{ 1 3 3 3 }
{ 2 2 2 2 }
{ 2 2 2 3 }
{ 2 2 3 3 }
{ 2 3 3 3 }
{ 3 3 3 3 }
Todos os 70 multiconjuntos são gerados e ordenados lexicograficamente.
| [ << ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.