[ << ] | [ < ] | [ 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.outall 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.