.


:




:

































 

 

 

 


( )




 

 

, - , ( ).

.

) : - X, f(X);

) : - , - ;

) : - , - ;

) : - - , - (, , , . .).

, , . 50 % .

:

1. ( );

2. - ( );

3. ;

4. ;

5. ;

6. (, ) , .

: () ( ), ( ) ( ). , . .

 

 

() , ( ). . .

 

 

5.1. . : . .

 

:

: to be or not to be

:

-

be 2

not 1

or 1

to 2

, , - . . , , , . : , , , .

(. 5.1). . () .

 

t kol  
      To    
dt = 3   Be    
  Or    
└ → 3 Not    
       
...    
DTMAX      
  . 5.1. c ( not : to be or not to be)  

. , :

 

t;

 

, :

/* t */.

 

, . .

 

5.1.

#include <stdio.h>

void main ()

{ 1. ;

2. ;

3. ;

4. ;

}

------------------------------------------------------------------------------------------------

:

#define DTMAX 1001 /* x - + 1 ( ) */

#define DSLMAX 21 /* + 1 ('\0') */

/* : t,kol,dt */

/* ( t, kol) */

char t[DTMAX][DSLMAX]; /* */

int kol[DTMAX]; /* */

int dt; /* ( ) */

------------------------------------------------------------------------------------------------

 

dt = 0; /* 1. */

------------------------------------------------------------------------------------------------

int sim; /* */

char sl[DSLMAX]; /* */

/* 2. */

sim = getchar(); /* 1- */

while (sim!= EOF)

{ sl ( 1- );

;

}

------------------------------------------------------------------------------------------------

int j; /* */

/* sl ( 1- ) */

for (j=0; sim!=' ' && sim!=',' && sim!='.' && sim!='\n'

&& sim!=EOF; sim=getchar())

if (j < DSLMAX-1) sl[j++] = sim;

sl[j] = '\0'; /* */

/* */

while (sim==' ' || sim==',' || sim=='.' || sim=='\n')

sim = getchar();

------------------------------------------------------------------------------------------------

 

int i; /* */

/* */

/* sl t */

strcpy (t[dt], sl); /* == sl */

for (i=0; strcmp(sl,t[i]); i++);

if (i < dt) /* t[i] == sl */

kol[i]++; /* sl */

else /* */

/* sl */

if (dt < DTMAX-1) /* */

kol[dt++] = 1;

else /* */

{ fprintf (stderr,

"\n: %d"

"\n '%s' \n", DTMAX-1, sl);

}

 

, , " " - , . - .

---------------------------------------------------------------------------------------------------

int L; /* */

/* 3. */

for (L=dt-1; L>0; L--)

/* t[0]...t[l] */

for (i=0; i<L; i++)

/* t[i] t[i+1] */

if (strcmp(t[i],t[i+1]) > 0)

{ /* t[i] <--> t[i+1] */

strcpy (sl, t[i]); strcpy (t[i], t[i+1]); strcpy (t[i+1], sl);

/* kol[i] <--> kol[i+1] */

j = kol[i]; kol[i] = kol[i+1]; kol[i+1] = j;

}

------------------------------------------------------------------------------------------------

/* 4. () */

printf ("\n%*s%s", DSLMAX, " ", "-\n");

for (i=0; i<dt; i++)

printf ("%-*s %5d\n", DSLMAX, t[i], kol[i]);

 

 

5.2. ( 5.1). , .

, 5.1. ( !) . 5.2:

5.2. .

#include <stdio.h>

#include <stdlib.h>

void main ()

{

1. ;

2. ;

3. ;

}

5.1. . . 5.2 .

 

sled kol sl


 

pt

baryer

DSLMAX

. 5.2.

( not : to be or not to be)

 

. , - ( ).

, 5.1. ( ).

, , ! sl, !

, , , , , , .

, (sled kol), - sl ( ).

 

:

struct el_tab /* () */

{ struct el_tab *sled; /* */

int kol; /* */

char sl[]; /* */

};

struct el_tab *pt; /* */

struct el_tab *baryer; /* */

char *sl; /* ( ) */

----------------------------------------------------------------------------------------------------

.

/* 1. */

baryer = malloc (sizeof(struct el_tab)

+ DSLMAX); /* '\0' */

sl = baryer->sl;

pt = malloc (sizeof(struct el_tab));

pt->sled = baryer; /* */

----------------------------------------------------------------------------------------------------

 

struct el_tab *i, /* */

ipr; / * */

/* */

/* sl */

i = pt->sled; ipr = pt;

while (strcmp(sl,i->sl) > 0)

{ ipr=i; i = i->sled; /* */

}

if (i!=baryer && strcmp(sl,i->sl)==0) /* i->sl==sl */

i->kol ++; /* sl */

else /* */

{ /* sl */

i = malloc (sizeof(struct el_tab)

+ strlen(sl)+1); /* sl '\0' */

if (i!= NULL) /* */

{ /* */

strcpy (i->sl, sl); /* sl - */

i->kol = 1;

/* *ipr */

i->sled = ipr->sled; ipr->sled = i;

}

else /* */

{ fprintf (stderr,

"\n: , "

" '%s' \n", sl);

}

}

----------------------------------------------------------------------------------------------------

 

/* 3. */

printf ("\n%*s%s", DSLMAX, " ", "-\n");

i = pt->sled; /* 1- */

while (i!= baryer) /* */

{ printf ("%-*s %5d\n", DSLMAX, i->sl, i->kol);

i = i->sled; /* */

}

 

 

- , .

D - . D - D1=1, D2=2,..., Dm=m, m - .

, ( ) X X1,..., Xm

m

X = å Xi*Pi (5.1)

i=1

Pi - , X = Xi;

m

å Pi = P1 +... + Pm = 1 (5.2)

i=1

(5.1)

m m

D = å Di * Pi = å i * Pi = P1 + 2*P2 + 3*P3 +... + m*Pm (5.3)

i=1 i=1

Pi - , D=i, .. i (i=1..m-1); Pm - , m, , ( m ).

, (), , (5.2)

 

P1 = P2 =... = Pm-1 = Pm/2 = 1/(m+1)

 

(5.3) ,

D = (1/(m+1))*(1+2+...+m) = (1/(m+1))*m*(m+1)/2 = m/2

.. - :

D = m/2 (5.4)

(5.3) , , ( , ),

P1 ≥ P2 ≥... ≥ Pm.

 

( )

 

(, ) , . , : . , m

Dmax = log2 m + 1 (5.5)

 

5.3. kl t (t[i-1] £ t[i] i=1,..., m-1)

L = 0; R = m; /* */

while (L < R)

{ /* (t[k] < kl k=0,..., L) && (t[k] >= kl k = R,..., m-1) */

i = (L+R) / 2; if (t[i] < kl) L = i+1; else R = i;

}

if (R < m && t[R] == kl)... /* */

 

5.3:

 

) :

(t[k]<kl k=0,..., L) && (t[k]>=kl k=R,..., m-1)

) , R - L , . .: L<R; L £ i < R; L i+1, R i. L = R .

) R=m - (. . t[m] !), t[R], .

5.3. kl t (t[i-1] £ t[i] i=1,..., m-1) L, R, j (, 5.3)

L = &t[0]; R = &t[m]; /* */

while (L < R)

{ j = L + (R - L) / 2; /* : j=(L+R)/2 */

if (*j < kl) L = j + 1; else R = j;

}

if (R < &t[m] && *R == kl)... /* */

. , . C , .

, , . , , .

 

 

( ) , ; (. 5.3). ( ).

 

) : 7, 8, 4, 9, 2, 6, 5 )
 
kl men bol
  ...
       
    -1  
       
    -1 -1
    -1 -1
      -1
    -1 -1
  ...
)

 

 

. 5.3.

 

 
 

. , . : , . ( ), . , -1 (. 5.3).

. : (. 5.4). (. 5.4, 5.5).

 

5.4. t b

/* */

struct el_tab /* */

{ _ kl; /* */

_ inf; /* */

struct el_tab *men, *bol; / * */

};

struct el_tab *t; /* */

struct el_tab *b; /* */

...

/* */

/* */

b = malloc (sizeof(struct el_tab)); t = b; /* "" */

 

5.5.

{kl, inf} t b

 

_ kl; /* */

_ inf; /* */

struct el_tab *i, *ip; /* - - - */

...

/* kl t */

b->kl = kl; /* = kl */

for (i = t; kl!= i->kl;)

{ ip = i;

if (kl < i -> kl) i = i-> men;

else i = i-> bol;

}

if (i == b) /* ( ) */

{ /* kl t */

i = malloc (sizeof (struct el_tab));

if (i == NULL)... /* */

else /* */

{ i->kl=kl; i->inf=inf; /* */

i->men = i->bol = b; /* "" */

/* */

if (t == b) /* */

t = i; /* - */

else /* *ip */

if (kl < ip->kl) ip -> men = i; else ip->bol = i;

}

}

else ... /* i->kl == kl */

 

5.6. t b ( )

 

void pech_tab (struct el_tab *t)

{ if (t!= b) /* b - "" */

{ pech_tab (t -> men);

t->kl, t -> inf;

pech_tab (t -> bol);

}

}

. 1. , b - NULL.

2. 0.

 

. 5.5. , , , 6, . ( ).

, , 7. , , ( ) , . . 5.7 - ( 6) .

       
 
 
   
 

 

 


. 5.5. 7

) ; ) ; "", "" -

 

( ).

 

5.7. b

struct el_tab **i, /* - */

*u, /* */

**r; /* - - */

...

u = *i; /* */

if (u->men == b) *i = u->bol; /* */

else if (u->bol == b) *i = u->men; /* */

else /* */

{ /* */

r=&(u->men); u=u->men;

while (u->bol!= b) { r=&(u->bol); u=u->bol; }

/* */

(*i)->kl=u->kl; (*i)->inf=u->inf;

*r=u->men; /* C */

}

free (u); /* *u */

 

, . , , , :

D = m / 2, (m - ).

( ) :

D = 1.39 log2 m (5.6)

(). : (. 5.6).

( ) , (. 5.5). , :

D max = log2 m + 1 (5.7)

 

.. - .. : (-) - , 1 (. 5.5 ). -. - , 44% :

Dmax = 1.44 log2 m (5.8)

 

       
 
   
 

 

 


. 5.6.

) ) (-)

 





:


: 2016-12-18; !; : 425 |


:

:

, ,
==> ...

1515 - | 1496 -


© 2015-2024 lektsii.org - -

: 0.195 .